2012-10-21 15:02:20 -04:00
/*
2013-04-21 12:33:12 -04:00
* core . c
2012-02-20 15:07:38 -05:00
*
2014-03-08 20:18:19 -05:00
* Copyright ( C ) 2012 - 2014 James Booth < boothj5 @ gmail . com >
2012-10-21 15:02:20 -04:00
*
2012-02-20 15:07:38 -05:00
* This file is part of Profanity .
*
* Profanity is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* Profanity is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with Profanity . If not , see < http : //www.gnu.org/licenses/>.
*
2014-08-24 15:57:39 -04:00
* In addition , as a special exception , the copyright holders give permission to
* link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file , and
* distribute linked combinations including the two .
*
* You must obey the GNU General Public License in all respects for all of the
* code used other than OpenSSL . If you modify file ( s ) with this exception , you
* may extend this exception to your version of the file ( s ) , but you are not
* obligated to do so . If you do not wish to do so , delete this exception
* statement from your version . If you delete this exception statement from all
* source files in the program , then also delete it here .
*
2012-02-20 15:07:38 -05:00
*/
2012-08-25 20:50:50 -04:00
2012-07-01 19:58:35 -04:00
# include "config.h"
2012-02-20 15:07:38 -05:00
2013-09-16 20:28:35 -04:00
# ifdef HAVE_GIT_VERSION
2014-03-05 19:06:22 -05:00
# include "gitversion.h"
2013-09-16 20:28:35 -04:00
# endif
2012-09-10 18:11:24 -04:00
# include <stdlib.h>
2012-02-08 17:26:43 -05:00
# include <string.h>
2014-12-18 18:57:19 -05:00
# include <assert.h>
2012-11-30 16:26:28 -05:00
# ifdef HAVE_LIBXSS
# include <X11/extensions/scrnsaver.h>
# endif
2012-05-09 19:30:03 -04:00
# include <glib.h>
2013-01-02 15:27:37 -05:00
# ifdef HAVE_NCURSESW_NCURSES_H
# include <ncursesw/ncurses.h>
2013-01-03 19:35:54 -05:00
# elif HAVE_NCURSES_H
# include <ncurses.h>
2012-09-08 11:51:09 -04:00
# endif
2012-05-03 20:00:01 -04:00
2012-11-08 17:39:38 -05:00
# include "chat_session.h"
2013-02-02 16:43:59 -05:00
# include "command/command.h"
2013-01-11 20:44:21 -05:00
# include "common.h"
2013-02-02 16:59:29 -05:00
# include "config/preferences.h"
# include "config/theme.h"
2012-05-03 20:00:01 -04:00
# include "contact.h"
2013-12-14 10:34:17 -05:00
# include "roster_list.h"
2013-01-12 18:10:56 -05:00
# include "jid.h"
2012-08-21 19:30:24 -04:00
# include "log.h"
2013-01-11 20:01:39 -05:00
# include "muc.h"
2014-05-19 15:41:19 -04:00
# ifdef HAVE_LIBOTR
2014-02-12 17:19:21 -05:00
# include "otr/otr.h"
2014-05-19 15:41:19 -04:00
# endif
2013-02-02 15:55:58 -05:00
# include "ui/ui.h"
2014-04-07 15:00:11 -04:00
# include "ui/titlebar.h"
2014-04-07 16:12:30 -04:00
# include "ui/statusbar.h"
2014-04-07 16:50:28 -04:00
# include "ui/inputwin.h"
2013-02-02 15:55:58 -05:00
# include "ui/window.h"
2013-08-20 18:08:21 -04:00
# include "ui/windows.h"
2013-05-06 18:04:46 -04:00
# include "xmpp/xmpp.h"
2012-02-05 18:08:15 -05:00
2012-12-11 18:34:15 -05:00
static char * win_title ;
2012-11-30 16:26:28 -05:00
# ifdef HAVE_LIBXSS
static Display * display ;
# endif
2012-12-01 13:39:34 -05:00
static GTimer * ui_idle_time ;
2015-01-14 18:54:46 -05:00
static void _win_handle_switch ( const wint_t ch ) ;
static void _win_handle_page ( const wint_t ch , const int result ) ;
2014-12-10 16:49:21 -05:00
static void _win_show_history ( int win_index , const char * const contact ) ;
2014-04-05 19:47:14 -04:00
static void _ui_draw_term_title ( void ) ;
2012-07-01 19:58:35 -04:00
2014-12-22 17:13:42 -05:00
void
ui_init ( void )
2012-02-05 18:29:09 -05:00
{
2012-08-25 19:54:18 -04:00
log_info ( " Initialising UI " ) ;
2012-02-05 18:29:09 -05:00
initscr ( ) ;
2012-11-22 21:56:38 -05:00
raw ( ) ;
2012-02-05 18:29:09 -05:00
keypad ( stdscr , TRUE ) ;
2013-02-02 21:35:04 -05:00
if ( prefs_get_boolean ( PREF_MOUSE ) ) {
2013-01-17 14:40:55 -05:00
mousemask ( ALL_MOUSE_EVENTS , NULL ) ;
mouseinterval ( 5 ) ;
}
2012-11-25 19:01:34 -05:00
ui_load_colours ( ) ;
2012-11-21 17:33:07 -05:00
refresh ( ) ;
create_title_bar ( ) ;
create_status_bar ( ) ;
2013-08-27 19:50:15 -04:00
status_bar_active ( 1 ) ;
2012-11-21 17:33:07 -05:00
create_input_window ( ) ;
2013-08-20 18:08:21 -04:00
wins_init ( ) ;
2013-04-20 16:42:39 -04:00
cons_about ( ) ;
2012-11-30 16:26:28 -05:00
# ifdef HAVE_LIBXSS
display = XOpenDisplay ( 0 ) ;
# endif
2012-12-01 13:39:34 -05:00
ui_idle_time = g_timer_new ( ) ;
2014-04-06 16:06:50 -04:00
ProfWin * window = wins_get_current ( ) ;
win_update_virtual ( window ) ;
2012-11-21 17:33:07 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_update ( void )
2012-02-12 20:25:47 -05:00
{
2014-09-01 14:14:52 -04:00
ProfWin * current = wins_get_current ( ) ;
2014-12-15 20:39:47 -05:00
if ( current - > layout - > paged = = 0 ) {
2014-09-01 14:14:52 -04:00
win_move_to_end ( current ) ;
}
2014-09-16 19:22:55 -04:00
win_update_virtual ( current ) ;
2015-01-11 19:43:42 -05:00
if ( prefs_get_boolean ( PREF_TITLEBAR_SHOW ) ) {
2014-04-05 19:47:14 -04:00
_ui_draw_term_title ( ) ;
2014-04-03 16:46:43 -04:00
}
2014-04-01 16:52:04 -04:00
title_bar_update_virtual ( ) ;
status_bar_update_virtual ( ) ;
2012-12-11 18:34:15 -05:00
inp_put_back ( ) ;
2014-02-02 18:56:50 -05:00
doupdate ( ) ;
2012-12-11 18:34:15 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_about ( void )
2014-04-07 16:12:30 -04:00
{
cons_show ( " " ) ;
cons_about ( ) ;
}
2014-12-22 17:13:42 -05:00
unsigned long
ui_get_idle_time ( void )
2012-11-30 16:26:28 -05:00
{
2013-01-04 19:38:50 -05:00
// if compiled with libxss, get the x sessions idle time
2012-12-01 13:39:34 -05:00
# ifdef HAVE_LIBXSS
2012-11-30 16:26:28 -05:00
XScreenSaverInfo * info = XScreenSaverAllocInfo ( ) ;
2012-12-19 16:34:24 -05:00
if ( info ! = NULL & & display ! = NULL ) {
XScreenSaverQueryInfo ( display , DefaultRootWindow ( display ) , info ) ;
unsigned long result = info - > idle ;
XFree ( info ) ;
return result ;
}
2014-06-24 17:23:53 -04:00
if ( info ! = NULL ) {
XFree ( info ) ;
}
2013-01-04 20:14:18 -05:00
// if no libxss or xss idle time failed, use profanity idle time
2013-01-04 02:54:17 -05:00
# endif
2012-12-01 13:47:50 -05:00
gdouble seconds_elapsed = g_timer_elapsed ( ui_idle_time , NULL ) ;
2012-12-01 13:39:34 -05:00
unsigned long ms_elapsed = seconds_elapsed * 1000.0 ;
return ms_elapsed ;
}
2014-12-22 17:13:42 -05:00
void
ui_reset_idle_time ( void )
2012-12-01 13:39:34 -05:00
{
g_timer_start ( ui_idle_time ) ;
}
2012-11-30 16:26:28 -05:00
2014-12-22 17:13:42 -05:00
void
ui_close ( void )
2012-02-06 19:08:59 -05:00
{
2013-04-21 15:17:06 -04:00
notifier_uninit ( ) ;
2013-08-26 12:47:29 -04:00
wins_destroy ( ) ;
2012-02-06 19:08:59 -05:00
endwin ( ) ;
}
2014-12-22 17:13:42 -05:00
wint_t
ui_get_char ( char * input , int * size , int * result )
2014-04-07 16:50:28 -04:00
{
2014-10-07 16:12:19 -04:00
wint_t ch = inp_get_char ( input , size , result ) ;
2014-12-23 06:01:31 -05:00
if ( ch ! = ERR & & * result ! = ERR ) {
2014-04-07 16:50:28 -04:00
ui_reset_idle_time ( ) ;
2015-01-08 17:43:11 -05:00
ui_input_nonblocking ( TRUE ) ;
} else {
ui_input_nonblocking ( FALSE ) ;
2014-04-07 16:50:28 -04:00
}
2015-01-08 17:43:11 -05:00
2014-04-07 16:50:28 -04:00
return ch ;
}
2014-12-22 17:13:42 -05:00
void
ui_input_clear ( void )
2014-04-07 16:50:28 -04:00
{
inp_win_reset ( ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_replace_input ( char * input , const char * const new_input , int * size )
2014-04-07 16:50:28 -04:00
{
inp_replace_input ( input , new_input , size ) ;
}
2014-12-22 17:13:42 -05:00
void
2015-01-08 17:43:11 -05:00
ui_input_nonblocking ( gboolean reset )
2014-04-07 16:50:28 -04:00
{
2015-01-08 17:43:11 -05:00
static gint timeout = 0 ;
static gint no_input_count = 0 ;
2015-01-12 05:32:32 -05:00
if ( ! prefs_get_boolean ( PREF_INPBLOCK_DYNAMIC ) ) {
inp_non_block ( prefs_get_inpblock ( ) ) ;
return ;
}
2015-01-08 17:43:11 -05:00
if ( reset ) {
2015-01-12 18:41:15 -05:00
timeout = 0 ;
no_input_count = 0 ;
2015-01-08 17:43:11 -05:00
}
if ( timeout < prefs_get_inpblock ( ) ) {
no_input_count + + ;
if ( no_input_count % 10 = = 0 ) {
timeout + = no_input_count ;
if ( timeout > prefs_get_inpblock ( ) ) {
timeout = prefs_get_inpblock ( ) ;
}
}
}
inp_non_block ( timeout ) ;
2014-04-07 16:50:28 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_resize ( void )
2012-04-17 18:28:21 -04:00
{
2012-08-25 19:54:18 -04:00
log_info ( " Resizing UI " ) ;
2014-07-18 19:39:49 -04:00
erase ( ) ;
refresh ( ) ;
2012-04-19 20:48:42 -04:00
title_bar_resize ( ) ;
2013-08-20 18:08:21 -04:00
wins_resize_all ( ) ;
2014-07-18 18:17:42 -04:00
status_bar_resize ( ) ;
2014-11-19 11:32:26 -05:00
inp_win_resize ( ) ;
2014-04-06 16:06:50 -04:00
ProfWin * window = wins_get_current ( ) ;
win_update_virtual ( window ) ;
2012-04-17 18:28:21 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_redraw ( void )
2014-11-16 16:56:19 -05:00
{
title_bar_resize ( ) ;
wins_resize_all ( ) ;
status_bar_resize ( ) ;
2014-11-19 11:32:26 -05:00
inp_win_resize ( ) ;
2014-11-16 16:56:19 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_load_colours ( void )
2012-11-25 19:01:34 -05:00
{
if ( has_colors ( ) ) {
use_default_colors ( ) ;
start_color ( ) ;
theme_init_colours ( ) ;
}
}
2014-12-22 17:13:42 -05:00
gboolean
ui_win_exists ( int index )
2013-05-12 17:57:36 -04:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_num ( index ) ;
return ( window ! = NULL ) ;
2013-05-12 17:57:36 -04:00
}
2014-12-22 17:13:42 -05:00
gboolean
ui_xmlconsole_exists ( void )
2014-04-15 08:16:32 -04:00
{
2014-12-21 19:28:03 -05:00
ProfXMLWin * xmlwin = wins_get_xmlconsole ( ) ;
if ( xmlwin ) {
return TRUE ;
} else {
return FALSE ;
}
2014-04-15 08:16:32 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_handle_stanza ( const char * const msg )
2014-04-14 20:08:41 -04:00
{
2014-04-15 08:16:32 -04:00
if ( ui_xmlconsole_exists ( ) ) {
2014-12-21 19:28:03 -05:00
ProfXMLWin * xmlconsole = wins_get_xmlconsole ( ) ;
ProfWin * window = ( ProfWin * ) xmlconsole ;
2014-04-15 18:45:17 -04:00
2014-04-15 08:16:32 -04:00
if ( g_str_has_prefix ( msg , " SENT: " ) ) {
2014-12-21 19:28:03 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " SENT: " ) ;
win_save_print ( window , ' - ' , NULL , 0 , THEME_ONLINE , " " , & msg [ 6 ] ) ;
win_save_print ( window , ' - ' , NULL , 0 , THEME_ONLINE , " " , " " ) ;
2014-04-15 18:45:17 -04:00
} else if ( g_str_has_prefix ( msg , " RECV: " ) ) {
2014-12-21 19:28:03 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " RECV: " ) ;
win_save_print ( window , ' - ' , NULL , 0 , THEME_AWAY , " " , & msg [ 6 ] ) ;
win_save_print ( window , ' - ' , NULL , 0 , THEME_AWAY , " " , " " ) ;
2014-04-15 18:45:17 -04:00
}
2014-04-14 20:08:41 -04:00
}
}
2015-01-11 15:20:17 -05:00
gboolean
ui_chat_win_exists ( const char * const barejid )
{
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
return ( chatwin ! = NULL ) ;
}
2014-12-22 17:13:42 -05:00
void
2015-01-11 18:04:22 -05:00
ui_contact_typing ( const char * const barejid , const char * const resource )
2012-11-25 19:01:34 -05:00
{
2014-12-18 18:57:19 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) chatwin ;
2015-01-11 18:04:22 -05:00
ChatSession * session = chat_session_get ( barejid ) ;
2012-11-25 19:01:34 -05:00
2013-02-02 21:35:04 -05:00
if ( prefs_get_boolean ( PREF_INTYPE ) ) {
2012-11-25 19:01:34 -05:00
// no chat window for user
2014-12-18 18:57:19 -05:00
if ( chatwin = = NULL ) {
2013-05-20 17:51:35 -04:00
cons_show_typing ( barejid ) ;
2012-11-25 19:01:34 -05:00
// have chat window but not currently in it
2014-12-21 14:40:15 -05:00
} else if ( ! wins_is_current ( window ) ) {
2013-05-20 17:51:35 -04:00
cons_show_typing ( barejid ) ;
2012-11-25 19:01:34 -05:00
2015-01-11 18:04:22 -05:00
// in chat window with user, no session or session with resource
} else if ( ! session | | ( session & & g_strcmp0 ( session - > resource , resource ) = = 0 ) ) {
2012-11-25 19:01:34 -05:00
title_bar_set_typing ( TRUE ) ;
2014-12-21 14:40:15 -05:00
int num = wins_get_num ( window ) ;
2013-08-20 18:08:21 -04:00
status_bar_active ( num ) ;
2012-11-25 19:01:34 -05:00
}
}
2013-05-20 17:51:35 -04:00
if ( prefs_get_boolean ( PREF_NOTIFY_TYPING ) ) {
2014-08-21 17:34:50 -04:00
gboolean is_current = FALSE ;
2014-12-21 14:40:15 -05:00
if ( window ) {
is_current = wins_is_current ( window ) ;
2014-08-21 17:34:50 -04:00
}
2014-05-24 16:13:33 -04:00
if ( ! is_current | | ( is_current & & prefs_get_boolean ( PREF_NOTIFY_TYPING_CURRENT ) ) ) {
PContact contact = roster_get_contact ( barejid ) ;
char const * display_usr = NULL ;
if ( p_contact_name ( contact ) ! = NULL ) {
display_usr = p_contact_name ( contact ) ;
} else {
display_usr = barejid ;
}
notify_typing ( display_usr ) ;
2013-05-20 17:51:35 -04:00
}
}
2012-11-25 19:01:34 -05:00
}
2014-12-22 17:13:42 -05:00
GSList *
2014-12-28 20:17:59 -05:00
ui_get_chat_recipients ( void )
2012-11-08 17:39:38 -05:00
{
2013-08-20 18:08:21 -04:00
GSList * recipients = wins_get_chat_recipients ( ) ;
2013-10-06 19:51:00 -04:00
return recipients ;
2012-11-08 17:39:38 -05:00
}
2014-12-20 13:39:39 -05:00
ProfChatWin *
2014-12-22 17:13:42 -05:00
ui_get_current_chat ( void )
2014-12-20 13:39:39 -05:00
{
return wins_get_current_chat ( ) ;
}
2014-12-22 17:13:42 -05:00
void
2015-01-10 13:35:59 -05:00
ui_incoming_msg ( const char * const barejid , const char * const resource , const char * const message , GTimeVal * tv_stamp )
2012-02-26 13:26:38 -05:00
{
2013-04-27 17:02:20 -04:00
gboolean win_created = FALSE ;
2015-01-10 13:35:59 -05:00
GString * user = g_string_new ( " " ) ;
2013-08-03 07:27:07 -04:00
2014-12-10 17:23:33 -05:00
PContact contact = roster_get_contact ( barejid ) ;
if ( contact ! = NULL ) {
if ( p_contact_name ( contact ) ! = NULL ) {
2015-01-10 13:35:59 -05:00
g_string_append ( user , p_contact_name ( contact ) ) ;
2013-05-19 12:19:16 -04:00
} else {
2015-01-10 13:35:59 -05:00
g_string_append ( user , barejid ) ;
2013-05-19 12:19:16 -04:00
}
2014-12-10 17:23:33 -05:00
} else {
2015-01-10 14:10:10 -05:00
g_string_append ( user , barejid ) ;
2015-01-10 13:35:59 -05:00
}
2015-01-10 14:10:10 -05:00
if ( resource & & prefs_get_boolean ( PREF_RESOURCE_MESSAGE ) ) {
2015-01-10 13:35:59 -05:00
g_string_append ( user , " / " ) ;
g_string_append ( user , resource ) ;
2012-11-13 19:04:08 -05:00
}
2014-12-18 18:57:19 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin = = NULL ) {
ProfWin * window = wins_new_chat ( barejid ) ;
chatwin = ( ProfChatWin * ) window ;
2014-01-11 16:44:24 -05:00
# ifdef HAVE_LIBOTR
2014-12-10 17:23:33 -05:00
if ( otr_is_secure ( barejid ) ) {
2014-12-15 20:39:47 -05:00
chatwin - > is_otr = TRUE ;
2014-01-11 16:44:24 -05:00
}
# endif
2013-04-27 17:02:20 -04:00
win_created = TRUE ;
}
2012-02-29 19:34:54 -05:00
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) chatwin ;
int num = wins_get_num ( window ) ;
2013-08-27 18:38:25 -04:00
// currently viewing chat window with sender
2014-12-21 14:40:15 -05:00
if ( wins_is_current ( window ) ) {
2015-01-10 13:35:59 -05:00
win_print_incoming_message ( window , tv_stamp , user - > str , message ) ;
2013-08-27 18:38:25 -04:00
title_bar_set_typing ( FALSE ) ;
status_bar_active ( num ) ;
2012-11-08 17:14:41 -05:00
2013-08-27 18:38:25 -04:00
// not currently viewing chat window with sender
2012-11-24 18:58:10 -05:00
} else {
2013-08-27 18:38:25 -04:00
status_bar_new ( num ) ;
2015-01-10 13:35:59 -05:00
cons_show_incoming_message ( user - > str , num ) ;
2014-12-10 17:23:33 -05:00
if ( prefs_get_boolean ( PREF_FLASH ) ) {
2013-08-27 18:38:25 -04:00
flash ( ) ;
2014-12-10 17:23:33 -05:00
}
2013-08-27 18:38:25 -04:00
2014-12-21 18:14:01 -05:00
chatwin - > unread + + ;
2013-08-27 18:38:25 -04:00
if ( prefs_get_boolean ( PREF_CHLOG ) & & prefs_get_boolean ( PREF_HISTORY ) ) {
2014-12-10 17:23:33 -05:00
_win_show_history ( num , barejid ) ;
2013-08-27 18:38:25 -04:00
}
2012-11-24 18:58:10 -05:00
2013-10-06 14:16:20 -04:00
// show users status first, when receiving message via delayed delivery
if ( ( tv_stamp ! = NULL ) & & ( win_created ) ) {
2014-12-10 17:23:33 -05:00
PContact pcontact = roster_get_contact ( barejid ) ;
2013-10-06 14:16:20 -04:00
if ( pcontact ! = NULL ) {
2014-12-21 14:40:15 -05:00
win_show_contact ( window , pcontact ) ;
2013-10-06 14:16:20 -04:00
}
}
2015-01-10 13:35:59 -05:00
win_print_incoming_message ( window , tv_stamp , user - > str , message ) ;
2012-04-19 18:32:44 -04:00
}
2012-04-23 20:11:39 -04:00
2013-08-28 16:34:00 -04:00
int ui_index = num ;
2013-05-22 19:10:55 -04:00
if ( ui_index = = 10 ) {
ui_index = 0 ;
}
2014-12-10 17:23:33 -05:00
if ( prefs_get_boolean ( PREF_BEEP ) ) {
beep ( ) ;
}
if ( prefs_get_boolean ( PREF_NOTIFY_MESSAGE ) ) {
2014-12-21 14:40:15 -05:00
gboolean is_current = wins_is_current ( window ) ;
2014-12-10 17:23:33 -05:00
if ( ! is_current | | ( is_current & & prefs_get_boolean ( PREF_NOTIFY_MESSAGE_CURRENT ) ) ) {
if ( prefs_get_boolean ( PREF_NOTIFY_MESSAGE_TEXT ) ) {
2015-01-10 13:35:59 -05:00
notify_message ( user - > str , ui_index , message ) ;
2014-12-10 17:23:33 -05:00
} else {
2015-01-10 13:35:59 -05:00
notify_message ( user - > str , ui_index , NULL ) ;
2014-12-10 17:23:33 -05:00
}
}
}
2015-01-10 13:35:59 -05:00
g_string_free ( user , TRUE ) ;
2014-12-10 17:23:33 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_incoming_private_msg ( const char * const fulljid , const char * const message , GTimeVal * tv_stamp )
2014-12-10 17:23:33 -05:00
{
char * display_from = NULL ;
display_from = get_nick_from_full_jid ( fulljid ) ;
2014-12-18 18:57:19 -05:00
ProfPrivateWin * privatewin = wins_get_private ( fulljid ) ;
if ( privatewin = = NULL ) {
ProfWin * window = wins_new_private ( fulljid ) ;
privatewin = ( ProfPrivateWin * ) window ;
2014-12-10 17:23:33 -05:00
}
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) privatewin ;
int num = wins_get_num ( window ) ;
2014-12-10 17:23:33 -05:00
// currently viewing chat window with sender
2014-12-21 14:40:15 -05:00
if ( wins_is_current ( window ) ) {
win_print_incoming_message ( window , tv_stamp , display_from , message ) ;
2014-12-10 17:23:33 -05:00
title_bar_set_typing ( FALSE ) ;
status_bar_active ( num ) ;
// not currently viewing chat window with sender
} else {
status_bar_new ( num ) ;
cons_show_incoming_message ( display_from , num ) ;
if ( prefs_get_boolean ( PREF_FLASH ) ) {
flash ( ) ;
}
2014-12-21 18:14:01 -05:00
privatewin - > unread + + ;
2014-12-10 17:23:33 -05:00
if ( prefs_get_boolean ( PREF_CHLOG ) & & prefs_get_boolean ( PREF_HISTORY ) ) {
_win_show_history ( num , fulljid ) ;
}
2014-12-21 14:40:15 -05:00
win_print_incoming_message ( window , tv_stamp , display_from , message ) ;
2014-12-10 17:23:33 -05:00
}
int ui_index = num ;
if ( ui_index = = 10 ) {
ui_index = 0 ;
}
if ( prefs_get_boolean ( PREF_BEEP ) ) {
2012-04-23 20:24:54 -04:00
beep ( ) ;
2014-12-10 17:23:33 -05:00
}
2014-05-24 15:46:03 -04:00
if ( prefs_get_boolean ( PREF_NOTIFY_MESSAGE ) ) {
2014-12-21 14:40:15 -05:00
gboolean is_current = wins_is_current ( window ) ;
2014-05-24 15:46:03 -04:00
if ( ! is_current | | ( is_current & & prefs_get_boolean ( PREF_NOTIFY_MESSAGE_CURRENT ) ) ) {
2014-05-24 17:14:26 -04:00
if ( prefs_get_boolean ( PREF_NOTIFY_MESSAGE_TEXT ) ) {
notify_message ( display_from , ui_index , message ) ;
} else {
notify_message ( display_from , ui_index , NULL ) ;
}
2014-05-24 15:46:03 -04:00
}
}
2013-01-10 20:35:25 -05:00
2013-08-03 07:27:07 -04:00
free ( display_from ) ;
2012-02-06 19:08:59 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_roster_add ( const char * const barejid , const char * const name )
2013-06-01 19:20:22 -04:00
{
if ( name ! = NULL ) {
cons_show ( " Roster item added: %s (%s) " , barejid , name ) ;
} else {
cons_show ( " Roster item added: %s " , barejid ) ;
}
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2013-06-01 19:20:22 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_roster_remove ( const char * const barejid )
2013-06-01 19:24:22 -04:00
{
cons_show ( " Roster item removed: %s " , barejid ) ;
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2013-06-01 19:24:22 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_contact_already_in_group ( const char * const contact , const char * const group )
2013-06-23 11:29:42 -04:00
{
2013-06-23 11:35:13 -04:00
cons_show ( " %s already in group %s " , contact , group ) ;
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2013-06-23 11:35:13 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_contact_not_in_group ( const char * const contact , const char * const group )
2013-06-23 11:35:13 -04:00
{
cons_show ( " %s is not currently in group %s " , contact , group ) ;
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2013-06-23 11:29:42 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_group_added ( const char * const contact , const char * const group )
2013-06-23 12:38:30 -04:00
{
cons_show ( " %s added to group %s " , contact , group ) ;
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2013-06-23 12:38:30 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_group_removed ( const char * const contact , const char * const group )
2013-06-23 12:38:30 -04:00
{
cons_show ( " %s removed from group %s " , contact , group ) ;
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2013-06-23 12:38:30 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_auto_away ( void )
2014-04-07 15:41:06 -04:00
{
2014-06-17 19:32:36 -04:00
char * pref_autoaway_message = prefs_get_string ( PREF_AUTOAWAY_MESSAGE ) ;
if ( pref_autoaway_message ! = NULL ) {
2014-04-07 15:41:06 -04:00
int pri =
accounts_get_priority_for_presence_type ( jabber_get_account_name ( ) ,
RESOURCE_AWAY ) ;
cons_show ( " Idle for %d minutes, status set to away (priority %d), \" %s \" . " ,
2014-06-17 19:32:36 -04:00
prefs_get_autoaway_time ( ) , pri , pref_autoaway_message ) ;
2014-04-07 15:41:06 -04:00
title_bar_set_presence ( CONTACT_AWAY ) ;
} else {
int pri =
accounts_get_priority_for_presence_type ( jabber_get_account_name ( ) ,
RESOURCE_AWAY ) ;
cons_show ( " Idle for %d minutes, status set to away (priority %d). " ,
prefs_get_autoaway_time ( ) , pri ) ;
title_bar_set_presence ( CONTACT_AWAY ) ;
}
2014-06-17 19:32:36 -04:00
prefs_free_string ( pref_autoaway_message ) ;
2014-04-07 15:41:06 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_end_auto_away ( void )
2014-04-07 15:41:06 -04:00
{
int pri =
accounts_get_priority_for_presence_type ( jabber_get_account_name ( ) , RESOURCE_ONLINE ) ;
cons_show ( " No longer idle, status set to online (priority %d). " , pri ) ;
title_bar_set_presence ( CONTACT_ONLINE ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_titlebar_presence ( contact_presence_t presence )
2014-04-07 15:41:06 -04:00
{
title_bar_set_presence ( presence ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_handle_login_account_success ( ProfAccount * account )
2014-04-07 15:41:06 -04:00
{
resource_presence_t resource_presence = accounts_get_login_presence ( account - > name ) ;
contact_presence_t contact_presence = contact_presence_from_resource_presence ( resource_presence ) ;
cons_show_login_success ( account ) ;
title_bar_set_presence ( contact_presence ) ;
status_bar_print_message ( account - > jid ) ;
status_bar_update_virtual ( ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_update_presence ( const resource_presence_t resource_presence ,
2014-04-07 15:41:06 -04:00
const char * const message , const char * const show )
{
contact_presence_t contact_presence = contact_presence_from_resource_presence ( resource_presence ) ;
title_bar_set_presence ( contact_presence ) ;
gint priority = accounts_get_priority_for_presence_type ( jabber_get_account_name ( ) , resource_presence ) ;
if ( message ! = NULL ) {
cons_show ( " Status set to %s (priority %d), \" %s \" . " , show , priority , message ) ;
} else {
cons_show ( " Status set to %s (priority %d). " , show , priority ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_recipient_not_found ( const char * const recipient , const char * const err_msg )
2014-01-26 13:30:34 -05:00
{
2014-01-26 17:19:22 -05:00
// intended recipient was invalid chat room
2014-12-19 19:52:35 -05:00
ProfMucWin * mucwin = wins_get_muc ( recipient ) ;
if ( mucwin ) {
cons_show_error ( " Room %s not found: %s " , recipient , err_msg ) ;
2014-12-21 14:40:15 -05:00
win_save_vprint ( ( ProfWin * ) mucwin , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Room %s not found: %s " , recipient , err_msg ) ;
2014-12-19 19:52:35 -05:00
return ;
}
2014-01-26 13:30:34 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_handle_recipient_error ( const char * const recipient , const char * const err_msg )
2014-01-27 17:09:16 -05:00
{
// always show in console
2014-12-19 19:52:35 -05:00
cons_show_error ( " Error from %s: %s " , recipient , err_msg ) ;
2014-01-27 17:09:16 -05:00
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( recipient ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error from %s: %s " , recipient , err_msg ) ;
return ;
2014-01-27 17:09:16 -05:00
}
2014-12-19 19:52:35 -05:00
ProfMucWin * mucwin = wins_get_muc ( recipient ) ;
if ( mucwin ) {
win_save_vprint ( ( ProfWin * ) mucwin , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error from %s: %s " , recipient , err_msg ) ;
return ;
}
ProfPrivateWin * privatewin = wins_get_private ( recipient ) ;
if ( privatewin ) {
win_save_vprint ( ( ProfWin * ) privatewin , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error from %s: %s " , recipient , err_msg ) ;
return ;
}
2014-01-27 17:09:16 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_handle_error ( const char * const err_msg )
2014-01-27 17:09:16 -05:00
{
GString * msg = g_string_new ( " " ) ;
g_string_printf ( msg , " Error %s " , err_msg ) ;
cons_show_error ( msg - > str ) ;
g_string_free ( msg , TRUE ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_invalid_command_usage ( const char * const usage , void ( * setting_func ) ( void ) )
2014-04-09 17:05:31 -04:00
{
if ( setting_func ! = NULL ) {
cons_show ( " " ) ;
( * setting_func ) ( ) ;
cons_show ( " Usage: %s " , usage ) ;
} else {
cons_show ( " " ) ;
cons_show ( " Usage: %s " , usage ) ;
if ( ui_current_win_type ( ) = = WIN_CHAT ) {
char usage_cpy [ strlen ( usage ) + 8 ] ;
sprintf ( usage_cpy , " Usage: %s " , usage ) ;
ui_current_print_line ( usage_cpy ) ;
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_disconnected ( void )
2012-11-25 19:57:41 -05:00
{
2013-08-20 18:08:21 -04:00
wins_lost_connection ( ) ;
2014-01-16 13:13:22 -05:00
title_bar_set_presence ( CONTACT_OFFLINE ) ;
2013-02-03 18:06:06 -05:00
status_bar_clear_message ( ) ;
2014-04-01 16:52:04 -04:00
status_bar_update_virtual ( ) ;
2014-11-12 19:22:22 -05:00
ui_hide_roster ( ) ;
2012-10-18 11:18:44 -04:00
}
2014-12-22 17:13:42 -05:00
void
2015-01-14 18:54:46 -05:00
ui_handle_special_keys ( const wint_t ch , const int result )
2012-11-25 19:57:41 -05:00
{
_win_handle_switch ( ch ) ;
2014-10-07 16:12:19 -04:00
_win_handle_page ( ch , result ) ;
2015-01-14 18:54:46 -05:00
if ( ch = = KEY_RESIZE ) {
2014-11-19 11:32:26 -05:00
ui_resize ( ) ;
2013-02-02 18:52:47 -05:00
}
2012-11-25 19:57:41 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_close_connected_win ( int index )
2013-05-16 19:33:00 -04:00
{
2014-12-21 19:28:03 -05:00
ProfWin * window = wins_get_by_num ( index ) ;
if ( window ) {
if ( window - > type = = WIN_MUC ) {
ProfMucWin * mucwin = ( ProfMucWin * ) window ;
assert ( mucwin - > memcheck = = PROFMUCWIN_MEMCHECK ) ;
presence_leave_chat_room ( mucwin - > roomjid ) ;
} else if ( window - > type = = WIN_CHAT ) {
ProfChatWin * chatwin = ( ProfChatWin * ) window ;
assert ( chatwin - > memcheck = = PROFCHATWIN_MEMCHECK ) ;
2014-01-11 18:28:11 -05:00
# ifdef HAVE_LIBOTR
2014-12-21 19:28:03 -05:00
if ( chatwin - > is_otr ) {
otr_end_session ( chatwin - > barejid ) ;
}
2014-01-11 18:28:11 -05:00
# endif
2015-01-11 15:20:17 -05:00
chat_state_gone ( chatwin - > barejid , chatwin - > state ) ;
2015-01-07 19:57:25 -05:00
chat_session_remove ( chatwin - > barejid ) ;
2013-05-16 19:33:00 -04:00
}
}
}
2014-12-22 17:13:42 -05:00
int
ui_close_all_wins ( void )
2013-08-26 13:06:33 -04:00
{
2013-08-29 19:33:46 -04:00
int count = 0 ;
2013-08-26 13:06:33 -04:00
jabber_conn_status_t conn_status = jabber_get_connection_status ( ) ;
2013-08-29 19:33:46 -04:00
GList * win_nums = wins_get_nums ( ) ;
GList * curr = win_nums ;
while ( curr ! = NULL ) {
int num = GPOINTER_TO_INT ( curr - > data ) ;
2014-09-15 17:31:15 -04:00
if ( ( num ! = 1 ) & & ( ! ui_win_has_unsaved_form ( num ) ) ) {
2013-08-26 13:06:33 -04:00
if ( conn_status = = JABBER_CONNECTED ) {
2013-08-29 19:33:46 -04:00
ui_close_connected_win ( num ) ;
2013-08-26 13:06:33 -04:00
}
2013-08-29 19:33:46 -04:00
ui_close_win ( num ) ;
2013-08-26 13:06:33 -04:00
count + + ;
}
2013-08-29 19:33:46 -04:00
curr = g_list_next ( curr ) ;
2013-08-26 13:06:33 -04:00
}
2013-08-29 19:33:46 -04:00
g_list_free ( curr ) ;
g_list_free ( win_nums ) ;
2013-08-26 13:06:33 -04:00
return count ;
}
2014-12-22 17:13:42 -05:00
int
ui_close_read_wins ( void )
2013-08-26 13:06:33 -04:00
{
2013-08-29 19:33:46 -04:00
int count = 0 ;
2013-08-26 13:06:33 -04:00
jabber_conn_status_t conn_status = jabber_get_connection_status ( ) ;
2013-08-29 19:33:46 -04:00
GList * win_nums = wins_get_nums ( ) ;
GList * curr = win_nums ;
while ( curr ! = NULL ) {
int num = GPOINTER_TO_INT ( curr - > data ) ;
2014-09-15 17:31:15 -04:00
if ( ( num ! = 1 ) & & ( ui_win_unread ( num ) = = 0 ) & & ( ! ui_win_has_unsaved_form ( num ) ) ) {
2013-08-26 13:06:33 -04:00
if ( conn_status = = JABBER_CONNECTED ) {
2013-08-29 19:33:46 -04:00
ui_close_connected_win ( num ) ;
2013-08-26 13:06:33 -04:00
}
2013-08-29 19:33:46 -04:00
ui_close_win ( num ) ;
2013-08-26 13:06:33 -04:00
count + + ;
}
2013-08-29 19:33:46 -04:00
curr = g_list_next ( curr ) ;
2013-08-26 13:06:33 -04:00
}
2013-08-29 19:33:46 -04:00
g_list_free ( curr ) ;
g_list_free ( win_nums ) ;
2013-08-26 13:06:33 -04:00
return count ;
}
2014-12-22 17:13:42 -05:00
void
ui_redraw_all_room_rosters ( void )
2014-10-18 15:22:34 -04:00
{
GList * win_nums = wins_get_nums ( ) ;
GList * curr = win_nums ;
while ( curr ! = NULL ) {
int num = GPOINTER_TO_INT ( curr - > data ) ;
ProfWin * window = wins_get_by_num ( num ) ;
2014-12-15 20:39:47 -05:00
if ( window - > type = = WIN_MUC & & win_has_active_subwin ( window ) ) {
2014-12-18 18:57:19 -05:00
ProfMucWin * mucwin = ( ProfMucWin * ) window ;
assert ( mucwin - > memcheck = = PROFMUCWIN_MEMCHECK ) ;
occupantswin_occupants ( mucwin - > roomjid ) ;
2014-10-18 15:22:34 -04:00
}
curr = g_list_next ( curr ) ;
}
g_list_free ( curr ) ;
g_list_free ( win_nums ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_hide_all_room_rosters ( void )
2014-11-19 18:58:55 -05:00
{
GList * win_nums = wins_get_nums ( ) ;
GList * curr = win_nums ;
while ( curr ! = NULL ) {
int num = GPOINTER_TO_INT ( curr - > data ) ;
ProfWin * window = wins_get_by_num ( num ) ;
2014-12-15 20:39:47 -05:00
if ( window - > type = = WIN_MUC & & win_has_active_subwin ( window ) ) {
2014-12-18 18:57:19 -05:00
ProfMucWin * mucwin = ( ProfMucWin * ) window ;
assert ( mucwin - > memcheck = = PROFMUCWIN_MEMCHECK ) ;
ui_room_hide_occupants ( mucwin - > roomjid ) ;
2014-11-19 18:58:55 -05:00
}
curr = g_list_next ( curr ) ;
}
g_list_free ( curr ) ;
g_list_free ( win_nums ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_show_all_room_rosters ( void )
2014-11-19 18:58:55 -05:00
{
GList * win_nums = wins_get_nums ( ) ;
GList * curr = win_nums ;
while ( curr ! = NULL ) {
int num = GPOINTER_TO_INT ( curr - > data ) ;
ProfWin * window = wins_get_by_num ( num ) ;
2014-12-15 20:39:47 -05:00
if ( window - > type = = WIN_MUC & & ! win_has_active_subwin ( window ) ) {
2014-12-18 18:57:19 -05:00
ProfMucWin * mucwin = ( ProfMucWin * ) window ;
assert ( mucwin - > memcheck = = PROFMUCWIN_MEMCHECK ) ;
ui_room_show_occupants ( mucwin - > roomjid ) ;
2014-11-19 18:58:55 -05:00
}
curr = g_list_next ( curr ) ;
}
g_list_free ( curr ) ;
g_list_free ( win_nums ) ;
}
2014-12-22 17:13:42 -05:00
gboolean
ui_win_has_unsaved_form ( int num )
2014-09-15 17:31:15 -04:00
{
ProfWin * window = wins_get_by_num ( num ) ;
2014-12-21 19:01:43 -05:00
if ( window - > type = = WIN_MUC_CONFIG ) {
ProfMucConfWin * confwin = ( ProfMucConfWin * ) window ;
assert ( confwin - > memcheck = = PROFCONFWIN_MEMCHECK ) ;
return confwin - > form - > modified ;
} else {
2014-09-15 17:31:15 -04:00
return FALSE ;
}
}
2014-12-22 17:13:42 -05:00
gboolean
ui_switch_win ( const int i )
2012-11-25 19:57:41 -05:00
{
2014-04-01 18:54:26 -04:00
if ( ui_win_exists ( i ) ) {
2014-10-18 18:16:19 -04:00
ProfWin * old_current = wins_get_current ( ) ;
if ( old_current - > type = = WIN_MUC_CONFIG ) {
2014-12-15 20:39:47 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) old_current ;
cmd_autocomplete_remove_form_fields ( confwin - > form ) ;
2014-10-18 18:16:19 -04:00
}
2014-04-01 18:54:26 -04:00
ProfWin * new_current = wins_get_by_num ( i ) ;
2014-10-18 18:16:19 -04:00
if ( new_current - > type = = WIN_MUC_CONFIG ) {
2014-12-15 20:39:47 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) new_current ;
cmd_autocomplete_add_form_fields ( confwin - > form ) ;
2014-10-18 18:16:19 -04:00
}
2013-08-20 18:08:21 -04:00
wins_set_current_by_num ( i ) ;
2012-11-25 19:57:41 -05:00
2013-08-27 19:50:15 -04:00
if ( i = = 1 ) {
2014-01-16 13:04:25 -05:00
title_bar_console ( ) ;
2013-10-02 18:33:48 -04:00
status_bar_current ( 1 ) ;
2013-08-27 19:50:15 -04:00
status_bar_active ( 1 ) ;
2012-11-25 19:57:41 -05:00
} else {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2013-10-02 18:33:48 -04:00
status_bar_current ( i ) ;
2012-11-25 19:57:41 -05:00
status_bar_active ( i ) ;
}
2014-04-01 18:54:26 -04:00
return TRUE ;
} else {
return FALSE ;
2012-11-25 19:57:41 -05:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_previous_win ( void )
2014-10-18 17:43:47 -04:00
{
2014-10-18 18:16:19 -04:00
ProfWin * old_current = wins_get_current ( ) ;
if ( old_current - > type = = WIN_MUC_CONFIG ) {
2014-12-15 20:39:47 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) old_current ;
cmd_autocomplete_remove_form_fields ( confwin - > form ) ;
2014-10-18 18:16:19 -04:00
}
2014-10-18 17:43:47 -04:00
ProfWin * new_current = wins_get_previous ( ) ;
2014-10-18 18:16:19 -04:00
if ( new_current - > type = = WIN_MUC_CONFIG ) {
2014-12-15 20:39:47 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) new_current ;
cmd_autocomplete_add_form_fields ( confwin - > form ) ;
2014-10-18 18:16:19 -04:00
}
2014-10-18 17:43:47 -04:00
int i = wins_get_num ( new_current ) ;
wins_set_current_by_num ( i ) ;
if ( i = = 1 ) {
title_bar_console ( ) ;
status_bar_current ( 1 ) ;
status_bar_active ( 1 ) ;
} else {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2014-10-18 17:43:47 -04:00
status_bar_current ( i ) ;
status_bar_active ( i ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_next_win ( void )
2013-09-25 19:25:04 -04:00
{
2014-10-18 18:16:19 -04:00
ProfWin * old_current = wins_get_current ( ) ;
if ( old_current - > type = = WIN_MUC_CONFIG ) {
2014-12-15 20:39:47 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) old_current ;
cmd_autocomplete_remove_form_fields ( confwin - > form ) ;
2014-10-18 18:16:19 -04:00
}
2013-09-25 19:25:04 -04:00
ProfWin * new_current = wins_get_next ( ) ;
2014-10-18 18:16:19 -04:00
if ( new_current - > type = = WIN_MUC_CONFIG ) {
2014-12-15 20:39:47 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) new_current ;
cmd_autocomplete_add_form_fields ( confwin - > form ) ;
2014-10-18 18:16:19 -04:00
}
2013-09-25 19:25:04 -04:00
int i = wins_get_num ( new_current ) ;
wins_set_current_by_num ( i ) ;
if ( i = = 1 ) {
2014-01-16 13:04:25 -05:00
title_bar_console ( ) ;
2013-10-02 18:33:48 -04:00
status_bar_current ( 1 ) ;
2013-09-25 19:25:04 -04:00
status_bar_active ( 1 ) ;
} else {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2013-10-02 18:33:48 -04:00
status_bar_current ( i ) ;
2013-09-25 19:25:04 -04:00
status_bar_active ( i ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_gone_secure ( const char * const barejid , gboolean trusted )
2014-01-11 16:44:24 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = NULL ;
2014-01-11 16:44:24 -05:00
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
window = ( ProfWin * ) chatwin ;
} else {
window = wins_new_chat ( barejid ) ;
chatwin = ( ProfChatWin * ) window ;
2014-12-09 20:33:46 -05:00
}
2014-12-15 20:39:47 -05:00
chatwin - > is_otr = TRUE ;
chatwin - > is_trusted = trusted ;
2014-04-18 19:03:11 -04:00
if ( trusted ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , THEME_OTR_STARTED_TRUSTED , " " , " OTR session started (trusted). " ) ;
2014-04-18 19:03:11 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , THEME_OTR_STARTED_UNTRUSTED , " " , " OTR session started (untrusted). " ) ;
2014-04-18 19:03:11 -04:00
}
if ( wins_is_current ( window ) ) {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2014-04-18 19:03:11 -04:00
} else {
int num = wins_get_num ( window ) ;
status_bar_new ( num ) ;
2014-04-18 19:56:57 -04:00
int ui_index = num ;
if ( ui_index = = 10 ) {
ui_index = 0 ;
}
2014-12-14 19:28:28 -05:00
cons_show ( " %s started an OTR session (%d). " , barejid , ui_index ) ;
2014-04-18 19:56:57 -04:00
cons_alert ( ) ;
2014-01-11 16:44:24 -05:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_gone_insecure ( const char * const barejid )
2014-04-26 18:29:05 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
chatwin - > is_otr = FALSE ;
chatwin - > is_trusted = FALSE ;
ProfWin * window = ( ProfWin * ) chatwin ;
win_save_print ( window , ' ! ' , NULL , 0 , THEME_OTR_ENDED , " " , " OTR session ended. " ) ;
if ( wins_is_current ( window ) ) {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2014-12-19 19:52:35 -05:00
}
2014-04-26 18:29:05 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_recipient_initiated ( const char * const barejid )
2014-04-30 18:59:40 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " %s wants to authenticate your identity, use '/otr secret <secret>'. " , barejid ) ;
2014-04-30 18:59:40 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_recipient_initiated_q ( const char * const barejid , const char * question )
2014-04-26 18:29:05 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " %s wants to authenticate your identity with the following question: " , barejid ) ;
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " %s " , question ) ;
win_save_print ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " use '/otr answer <answer>'. " ) ;
2014-04-26 18:29:05 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_unsuccessful_sender ( const char * const barejid )
2014-04-26 18:29:05 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " Authentication failed, the secret you entered does not match the secret entered by %s. " , barejid ) ;
2014-04-26 18:29:05 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_unsuccessful_receiver ( const char * const barejid )
2014-04-26 18:29:05 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " Authentication failed, the secret entered by %s does not match yours. " , barejid ) ;
2014-04-26 20:17:38 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_aborted ( const char * const barejid )
2014-04-26 20:17:38 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_print ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " SMP session aborted. " ) ;
2014-04-26 18:29:05 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_successful ( const char * const barejid )
2014-05-07 15:41:05 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_print ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " Authentication successful. " ) ;
2014-05-07 15:41:05 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_answer_success ( const char * const barejid )
2014-05-07 15:41:05 -04:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " %s successfully authenticated you. " , barejid ) ;
2014-05-07 15:41:05 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_smp_answer_failure ( const char * const barejid )
2014-01-11 18:28:11 -05:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " %s failed to authenticate you. " , barejid ) ;
}
}
2014-01-11 18:28:11 -05:00
2014-12-22 17:13:42 -05:00
void
ui_otr_authenticating ( const char * const barejid )
2014-12-19 19:52:35 -05:00
{
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " Authenticating %s... " , barejid ) ;
2014-01-11 18:28:11 -05:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_otr_authetication_waiting ( const char * const barejid )
2014-01-11 20:20:22 -05:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , 0 , " " , " Awaiting authentication from %s... " , barejid ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_trust ( const char * const barejid )
2014-12-19 19:52:35 -05:00
{
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
2014-12-15 20:39:47 -05:00
chatwin - > is_otr = TRUE ;
chatwin - > is_trusted = TRUE ;
2014-01-11 20:20:22 -05:00
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) chatwin ;
win_save_print ( window , ' ! ' , NULL , 0 , THEME_OTR_TRUSTED , " " , " OTR session trusted. " ) ;
2014-01-11 20:20:22 -05:00
if ( wins_is_current ( window ) ) {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2014-01-11 20:20:22 -05:00
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_untrust ( const char * const barejid )
2014-01-11 20:20:22 -05:00
{
2014-12-19 19:52:35 -05:00
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
2014-12-15 20:39:47 -05:00
chatwin - > is_otr = TRUE ;
chatwin - > is_trusted = FALSE ;
2014-01-11 20:20:22 -05:00
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) chatwin ;
win_save_print ( window , ' ! ' , NULL , 0 , THEME_OTR_UNTRUSTED , " " , " OTR session untrusted. " ) ;
2014-01-11 20:20:22 -05:00
if ( wins_is_current ( window ) ) {
2014-12-21 17:01:56 -05:00
title_bar_switch ( ) ;
2014-01-11 20:20:22 -05:00
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_clear_current ( void )
2013-03-02 16:55:55 -05:00
{
2013-08-20 18:08:21 -04:00
wins_clear_current ( ) ;
2013-03-02 16:55:55 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_close_win ( int index )
2013-05-12 17:57:36 -04:00
{
2014-10-18 18:56:10 -04:00
ProfWin * window = wins_get_by_num ( index ) ;
2014-12-15 20:39:47 -05:00
if ( window & & window - > type = = WIN_MUC_CONFIG ) {
ProfMucConfWin * confwin = ( ProfMucConfWin * ) window ;
if ( confwin - > form ) {
cmd_autocomplete_remove_form_fields ( confwin - > form ) ;
2014-10-18 18:56:10 -04:00
}
}
2013-08-20 18:08:21 -04:00
wins_close_by_num ( index ) ;
2014-01-16 13:04:25 -05:00
title_bar_console ( ) ;
2013-10-02 18:33:48 -04:00
status_bar_current ( 1 ) ;
2013-08-27 19:50:15 -04:00
status_bar_active ( 1 ) ;
2013-05-12 17:57:36 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_tidy_wins ( void )
2013-05-16 19:33:00 -04:00
{
2013-08-20 18:08:21 -04:00
gboolean tidied = wins_tidy ( ) ;
2013-05-16 19:33:00 -04:00
if ( tidied ) {
cons_show ( " Windows tidied. " ) ;
} else {
cons_show ( " No tidy needed. " ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_prune_wins ( void )
2013-05-16 19:33:00 -04:00
{
jabber_conn_status_t conn_status = jabber_get_connection_status ( ) ;
gboolean pruned = FALSE ;
2014-12-19 19:52:35 -05:00
GSList * wins = wins_get_prune_wins ( ) ;
if ( wins ! = NULL ) {
2013-08-20 18:08:21 -04:00
pruned = TRUE ;
}
2014-12-19 19:52:35 -05:00
GSList * curr = wins ;
while ( curr ! = NULL ) {
ProfWin * window = curr - > data ;
if ( window - > type = = WIN_CHAT ) {
if ( conn_status = = JABBER_CONNECTED ) {
2014-12-28 20:17:59 -05:00
ProfChatWin * chatwin = ( ProfChatWin * ) window ;
2015-01-07 19:57:25 -05:00
chat_session_remove ( chatwin - > barejid ) ;
2013-05-16 19:33:00 -04:00
}
}
2013-08-20 18:08:21 -04:00
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
curr = g_slist_next ( curr ) ;
}
2014-12-19 19:52:35 -05:00
if ( wins ! = NULL ) {
g_slist_free ( wins ) ;
2013-05-16 19:33:00 -04:00
}
2013-08-20 18:08:21 -04:00
wins_tidy ( ) ;
2013-05-16 19:33:00 -04:00
if ( pruned ) {
cons_show ( " Windows pruned. " ) ;
} else {
cons_show ( " No prune needed. " ) ;
}
}
2014-12-22 17:13:42 -05:00
gboolean
ui_swap_wins ( int source_win , int target_win )
2014-04-24 16:50:59 -04:00
{
return wins_swap ( source_win , target_win ) ;
}
2014-12-22 17:13:42 -05:00
win_type_t
ui_current_win_type ( void )
2013-01-10 20:05:59 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * current = wins_get_current ( ) ;
2013-04-21 13:40:22 -04:00
return current - > type ;
2012-11-25 19:57:41 -05:00
}
2014-12-22 17:13:42 -05:00
gboolean
ui_current_win_is_otr ( void )
2014-01-11 12:03:01 -05:00
{
ProfWin * current = wins_get_current ( ) ;
2014-12-18 18:57:19 -05:00
if ( current - > type = = WIN_CHAT ) {
ProfChatWin * chatwin = ( ProfChatWin * ) current ;
assert ( chatwin - > memcheck = = PROFCHATWIN_MEMCHECK ) ;
return chatwin - > is_otr ;
} else {
return FALSE ;
}
2014-01-11 12:03:01 -05:00
}
2014-12-22 17:13:42 -05:00
int
ui_current_win_index ( void )
2013-05-12 17:57:36 -04:00
{
2013-08-20 18:08:21 -04:00
return wins_get_current_num ( ) ;
2013-05-12 17:57:36 -04:00
}
2014-12-22 17:13:42 -05:00
win_type_t
ui_win_type ( int index )
2013-05-12 17:57:36 -04:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_num ( index ) ;
return window - > type ;
2013-05-12 17:57:36 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_current_print_line ( const char * const msg , . . . )
2012-11-25 19:57:41 -05:00
{
2014-07-20 19:18:37 -04:00
ProfWin * window = wins_get_current ( ) ;
2012-11-27 16:53:56 -05:00
va_list arg ;
va_start ( arg , msg ) ;
2014-01-11 14:10:00 -05:00
GString * fmt_msg = g_string_new ( NULL ) ;
g_string_vprintf ( fmt_msg , msg , arg ) ;
2014-07-20 19:18:37 -04:00
win_save_println ( window , fmt_msg - > str ) ;
2012-11-27 16:53:56 -05:00
va_end ( arg ) ;
2014-01-11 14:10:00 -05:00
g_string_free ( fmt_msg , TRUE ) ;
2012-11-25 19:57:41 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_current_print_formatted_line ( const char show_char , int attrs , const char * const msg , . . . )
2014-01-16 18:16:37 -05:00
{
ProfWin * current = wins_get_current ( ) ;
va_list arg ;
va_start ( arg , msg ) ;
GString * fmt_msg = g_string_new ( NULL ) ;
g_string_vprintf ( fmt_msg , msg , arg ) ;
2014-06-21 04:16:50 -04:00
win_save_print ( current , show_char , NULL , 0 , attrs , " " , fmt_msg - > str ) ;
2014-01-16 18:16:37 -05:00
va_end ( arg ) ;
g_string_free ( fmt_msg , TRUE ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_current_error_line ( const char * const msg )
2012-11-25 19:57:41 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * current = wins_get_current ( ) ;
2014-11-16 15:40:19 -05:00
win_save_print ( current , ' - ' , NULL , 0 , THEME_ERROR , " " , msg ) ;
2012-11-25 19:57:41 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_print_system_msg_from_recipient ( const char * const barejid , const char * message )
2012-11-11 07:00:21 -05:00
{
2014-12-10 19:02:51 -05:00
if ( barejid = = NULL | | message = = NULL )
2012-11-11 07:00:21 -05:00
return ;
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_chat ( barejid ) ;
2013-08-20 18:08:21 -04:00
if ( window = = NULL ) {
2014-04-25 19:36:36 -04:00
int num = 0 ;
2014-12-10 19:02:51 -05:00
window = wins_new_chat ( barejid ) ;
2013-08-20 18:08:21 -04:00
if ( window ! = NULL ) {
num = wins_get_num ( window ) ;
status_bar_active ( num ) ;
} else {
num = 0 ;
window = wins_get_console ( ) ;
2013-08-27 19:50:15 -04:00
status_bar_active ( 1 ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-11 07:00:21 -05:00
}
2014-12-10 19:02:51 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " *%s %s " , barejid , message ) ;
2012-11-11 07:00:21 -05:00
}
2014-12-22 17:13:42 -05:00
void
2015-01-11 18:04:22 -05:00
ui_recipient_gone ( const char * const barejid , const char * const resource )
2012-08-15 19:50:32 -04:00
{
2013-05-20 17:51:35 -04:00
if ( barejid = = NULL )
2012-11-25 19:57:41 -05:00
return ;
2015-01-11 18:04:22 -05:00
if ( resource = = NULL )
return ;
2012-10-21 15:02:20 -04:00
2015-01-11 18:04:22 -05:00
gboolean show_message = TRUE ;
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin ) {
ChatSession * session = chat_session_get ( barejid ) ;
if ( session & & g_strcmp0 ( session - > resource , resource ) ! = 0 ) {
show_message = FALSE ;
2014-08-19 16:22:43 -04:00
}
2015-01-11 18:04:22 -05:00
if ( show_message ) {
const char * display_usr = NULL ;
PContact contact = roster_get_contact ( barejid ) ;
if ( contact ! = NULL ) {
if ( p_contact_name ( contact ) ! = NULL ) {
display_usr = p_contact_name ( contact ) ;
} else {
display_usr = barejid ;
}
} else {
display_usr = barejid ;
}
2013-05-20 17:51:35 -04:00
2015-01-11 18:04:22 -05:00
win_save_vprint ( ( ProfWin * ) chatwin , ' ! ' , NULL , 0 , THEME_GONE , " " , " <- %s has left the conversation. " , display_usr ) ;
}
2012-11-25 19:57:41 -05:00
}
2012-06-28 18:29:46 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_new_private_win ( const char * const fulljid )
2012-11-29 19:19:03 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_private ( fulljid ) ;
2013-08-20 18:08:21 -04:00
int num = 0 ;
2012-11-29 19:19:03 -05:00
// create new window
2013-08-20 18:08:21 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
window = wins_new_private ( fulljid ) ;
num = wins_get_num ( window ) ;
} else {
num = wins_get_num ( window ) ;
}
2013-01-21 17:46:33 -05:00
2014-12-19 19:52:35 -05:00
ui_switch_win ( num ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_new_chat_win ( const char * const barejid )
2014-12-19 19:52:35 -05:00
{
ProfWin * window = ( ProfWin * ) wins_get_chat ( barejid ) ;
int num = 0 ;
// create new window
if ( window = = NULL ) {
window = wins_new_chat ( barejid ) ;
2013-01-21 17:46:33 -05:00
2013-08-20 18:08:21 -04:00
num = wins_get_num ( window ) ;
2012-11-29 19:19:03 -05:00
2013-02-02 21:35:04 -05:00
if ( prefs_get_boolean ( PREF_CHLOG ) & & prefs_get_boolean ( PREF_HISTORY ) ) {
2014-12-19 19:52:35 -05:00
_win_show_history ( num , barejid ) ;
2012-11-29 19:19:03 -05:00
}
2014-12-19 19:52:35 -05:00
// if the contact is offline, show a message
PContact contact = roster_get_contact ( barejid ) ;
2012-11-29 19:19:03 -05:00
if ( contact ! = NULL ) {
if ( strcmp ( p_contact_presence ( contact ) , " offline " ) = = 0 ) {
2013-11-10 13:48:55 -05:00
const char * const show = p_contact_presence ( contact ) ;
const char * const status = p_contact_status ( contact ) ;
2014-12-19 19:52:35 -05:00
win_show_status_string ( window , barejid , show , status , NULL , " -- " , " offline " ) ;
2012-11-29 19:19:03 -05:00
}
}
} else {
2013-08-20 18:08:21 -04:00
num = wins_get_num ( window ) ;
2012-11-29 19:19:03 -05:00
}
2013-08-20 18:08:21 -04:00
ui_switch_win ( num ) ;
2012-11-29 19:19:03 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_create_xmlconsole_win ( void )
2014-04-15 08:16:32 -04:00
{
2014-12-14 19:28:28 -05:00
ProfWin * window = wins_new_xmlconsole ( ) ;
2014-04-15 08:16:32 -04:00
int num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_open_xmlconsole_win ( void )
2014-04-24 19:04:01 -04:00
{
2014-12-21 19:28:03 -05:00
ProfXMLWin * xmlwin = wins_get_xmlconsole ( ) ;
if ( xmlwin ! = NULL ) {
int num = wins_get_num ( ( ProfWin * ) xmlwin ) ;
2014-04-24 19:04:01 -04:00
ui_switch_win ( num ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_outgoing_chat_msg ( const char * const from , const char * const barejid ,
2012-03-08 20:06:55 -05:00
const char * const message )
2012-02-06 19:37:42 -05:00
{
2014-12-19 19:52:35 -05:00
PContact contact = roster_get_contact ( barejid ) ;
ProfWin * window = ( ProfWin * ) wins_get_chat ( barejid ) ;
2013-08-20 18:08:21 -04:00
int num = 0 ;
2012-10-17 05:55:48 -04:00
// create new window
2013-08-20 18:08:21 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
window = wins_new_chat ( barejid ) ;
2015-01-11 15:20:17 -05:00
ProfChatWin * chatwin = ( ProfChatWin * ) window ;
2014-01-11 16:44:24 -05:00
# ifdef HAVE_LIBOTR
2014-12-19 19:52:35 -05:00
if ( otr_is_secure ( barejid ) ) {
chatwin - > is_otr = TRUE ;
2012-11-13 19:39:34 -05:00
}
2014-12-19 19:52:35 -05:00
# endif
2013-08-20 18:08:21 -04:00
num = wins_get_num ( window ) ;
2012-10-17 05:55:48 -04:00
2013-02-02 21:35:04 -05:00
if ( prefs_get_boolean ( PREF_CHLOG ) & & prefs_get_boolean ( PREF_HISTORY ) ) {
2014-12-19 19:52:35 -05:00
_win_show_history ( num , barejid ) ;
2012-10-17 05:55:48 -04:00
}
2012-10-04 18:55:15 -04:00
2012-10-18 03:20:53 -04:00
if ( contact ! = NULL ) {
2012-10-28 16:52:30 -04:00
if ( strcmp ( p_contact_presence ( contact ) , " offline " ) = = 0 ) {
2013-12-27 14:56:47 -05:00
const char * show = p_contact_presence ( contact ) ;
const char * status = p_contact_status ( contact ) ;
2014-12-19 19:52:35 -05:00
win_show_status_string ( window , barejid , show , status , NULL , " -- " , " offline " ) ;
2012-10-04 18:55:15 -04:00
}
2012-10-04 18:33:38 -04:00
}
2012-10-17 05:55:48 -04:00
// use existing window
} else {
2013-08-20 18:08:21 -04:00
num = wins_get_num ( window ) ;
2012-10-04 18:18:48 -04:00
}
2015-01-11 15:20:17 -05:00
ProfChatWin * chatwin = ( ProfChatWin * ) window ;
chat_state_active ( chatwin - > state ) ;
2012-10-17 05:55:48 -04:00
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , 0 , THEME_TEXT_ME , from , message ) ;
2014-09-01 16:30:31 -04:00
ui_switch_win ( num ) ;
2012-02-06 19:37:42 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_outgoing_private_msg ( const char * const from , const char * const fulljid ,
2014-12-19 19:52:35 -05:00
const char * const message )
2012-11-05 16:36:32 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_private ( fulljid ) ;
2013-08-20 18:08:21 -04:00
int num = 0 ;
2012-11-05 16:36:32 -05:00
// create new window
2013-08-20 18:08:21 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
window = wins_new_private ( fulljid ) ;
num = wins_get_num ( window ) ;
// use existing window
} else {
num = wins_get_num ( window ) ;
2012-11-05 16:36:32 -05:00
}
2014-12-19 19:52:35 -05:00
win_save_print ( window , ' - ' , NULL , 0 , THEME_TEXT_ME , from , message ) ;
ui_switch_win ( num ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_room_join ( const char * const roomjid , gboolean focus )
2014-12-19 19:52:35 -05:00
{
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
int num = 0 ;
// create new window
if ( window = = NULL ) {
window = wins_new_muc ( roomjid ) ;
}
char * nick = muc_nick ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " -> You have joined the room as %s " , nick ) ;
2014-10-18 15:22:34 -04:00
if ( prefs_get_boolean ( PREF_MUC_PRIVILEGES ) ) {
2014-12-19 19:52:35 -05:00
char * role = muc_role_str ( roomjid ) ;
char * affiliation = muc_affiliation_str ( roomjid ) ;
2014-10-18 15:22:34 -04:00
if ( role ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , role: %s " , role ) ;
2014-10-18 15:22:34 -04:00
}
if ( affiliation ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , affiliation: %s " , affiliation ) ;
2014-10-18 15:22:34 -04:00
}
2014-10-11 21:10:46 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-11 21:10:46 -04:00
2013-08-20 18:08:21 -04:00
num = wins_get_num ( window ) ;
2014-04-12 21:52:25 -04:00
if ( focus ) {
ui_switch_win ( num ) ;
} else {
status_bar_active ( num ) ;
2014-04-14 15:32:51 -04:00
ProfWin * console = wins_get_console ( ) ;
2014-12-19 19:52:35 -05:00
char * nick = muc_nick ( roomjid ) ;
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " -> Autojoined %s as %s (%d). " , roomjid , nick , num ) ;
2014-04-12 21:52:25 -04:00
}
2012-11-05 16:36:32 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_switch_to_room ( const char * const roomjid )
2014-10-17 19:40:44 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-17 19:40:44 -04:00
int num = wins_get_num ( window ) ;
num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_room_role_change ( const char * const roomjid , const char * const role , const char * const actor ,
2014-10-17 20:37:52 -04:00
const char * const reason )
2014-10-11 21:10:46 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " Your role has been changed to: %s " , role ) ;
2014-10-17 20:37:52 -04:00
if ( actor ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , by: %s " , actor ) ;
2014-10-17 20:37:52 -04:00
}
if ( reason ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , reason: %s " , reason ) ;
2014-10-17 20:37:52 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-11 21:10:46 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_affiliation_change ( const char * const roomjid , const char * const affiliation , const char * const actor ,
2014-10-17 20:37:52 -04:00
const char * const reason )
2014-10-11 21:10:46 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " Your affiliation has been changed to: %s " , affiliation ) ;
2014-10-17 20:37:52 -04:00
if ( actor ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , by: %s " , actor ) ;
2014-10-17 20:37:52 -04:00
}
if ( reason ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , reason: %s " , reason ) ;
2014-10-17 20:37:52 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-11 21:10:46 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_role_and_affiliation_change ( const char * const roomjid , const char * const role , const char * const affiliation ,
2014-10-17 20:37:52 -04:00
const char * const actor , const char * const reason )
2014-10-17 20:07:25 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " Your role and affiliation have been changed, role: %s, affiliation: %s " , role , affiliation ) ;
2014-10-17 20:37:52 -04:00
if ( actor ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , by: %s " , actor ) ;
2014-10-17 20:37:52 -04:00
}
if ( reason ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , reason: %s " , reason ) ;
2014-10-17 20:37:52 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-17 20:07:25 -04:00
}
2014-10-18 14:10:50 -04:00
2014-12-22 17:13:42 -05:00
void
ui_room_occupant_role_change ( const char * const roomjid , const char * const nick , const char * const role ,
2014-10-18 14:10:50 -04:00
const char * const actor , const char * const reason )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " %s's role has been changed to: %s " , nick , role ) ;
2014-10-18 14:10:50 -04:00
if ( actor ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , by: %s " , actor ) ;
2014-10-18 14:10:50 -04:00
}
if ( reason ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , reason: %s " , reason ) ;
2014-10-18 14:10:50 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-18 14:10:50 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_occupant_affiliation_change ( const char * const roomjid , const char * const nick , const char * const affiliation ,
2014-10-18 14:10:50 -04:00
const char * const actor , const char * const reason )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " %s's affiliation has been changed to: %s " , nick , affiliation ) ;
2014-10-18 14:10:50 -04:00
if ( actor ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , by: %s " , actor ) ;
2014-10-18 14:10:50 -04:00
}
if ( reason ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , reason: %s " , reason ) ;
2014-10-18 14:10:50 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-18 14:10:50 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_occupant_role_and_affiliation_change ( const char * const roomjid , const char * const nick , const char * const role ,
2014-10-18 14:10:50 -04:00
const char * const affiliation , const char * const actor , const char * const reason )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " %s's role and affiliation have been changed, role: %s, affiliation: %s " , nick , role , affiliation ) ;
2014-10-18 14:10:50 -04:00
if ( actor ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , by: %s " , actor ) ;
2014-10-18 14:10:50 -04:00
}
if ( reason ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ROOMINFO , " " , " , reason: %s " , reason ) ;
2014-10-18 14:10:50 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2014-10-18 14:10:50 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_info_error ( const char * const roomjid , const char * const error )
2014-10-02 18:37:10 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-02 18:37:10 -04:00
if ( window ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Room info request failed: %s " , error ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_show_room_disco_info ( const char * const roomjid , GSList * identities , GSList * features )
2014-10-02 18:37:10 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-02 18:37:10 -04:00
if ( window ) {
if ( ( ( identities ! = NULL ) & & ( g_slist_length ( identities ) > 0 ) ) | |
( ( features ! = NULL ) & & ( g_slist_length ( features ) > 0 ) ) ) {
if ( identities ! = NULL ) {
2014-10-02 18:52:17 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Identities: " ) ;
2014-10-02 18:37:10 -04:00
}
while ( identities ! = NULL ) {
DiscoIdentity * identity = identities - > data ; // anme trpe, cat
2014-10-02 18:52:17 -04:00
GString * identity_str = g_string_new ( " " ) ;
2014-10-02 18:37:10 -04:00
if ( identity - > name ! = NULL ) {
identity_str = g_string_append ( identity_str , identity - > name ) ;
identity_str = g_string_append ( identity_str , " " ) ;
}
if ( identity - > type ! = NULL ) {
identity_str = g_string_append ( identity_str , identity - > type ) ;
identity_str = g_string_append ( identity_str , " " ) ;
}
if ( identity - > category ! = NULL ) {
identity_str = g_string_append ( identity_str , identity - > category ) ;
}
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , identity_str - > str ) ;
2014-10-31 21:48:36 -04:00
g_string_free ( identity_str , TRUE ) ;
2014-10-02 18:37:10 -04:00
identities = g_slist_next ( identities ) ;
}
if ( features ! = NULL ) {
2014-10-02 18:52:17 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Features: " ) ;
2014-10-02 18:37:10 -04:00
}
while ( features ! = NULL ) {
2014-10-02 18:52:17 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , features - > data ) ;
2014-10-02 18:37:10 -04:00
features = g_slist_next ( features ) ;
}
2014-10-02 18:52:17 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-10-02 18:37:10 -04:00
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_roster ( const char * const roomjid , GList * roster , const char * const presence )
2012-11-05 16:36:32 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received room roster but no window open for %s. " , roomjid ) ;
2012-11-07 19:22:15 -05:00
} else {
2014-08-20 16:30:10 -04:00
if ( ( roster = = NULL ) | | ( g_list_length ( roster ) = = 0 ) ) {
if ( presence = = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " , " Room is empty. " ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " , " No occupants %s. " , presence ) ;
2014-08-20 16:30:10 -04:00
}
2013-01-15 18:17:07 -05:00
} else {
2014-08-20 16:30:10 -04:00
int length = g_list_length ( roster ) ;
if ( presence = = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " %d occupants: " , length ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " %d %s: " , length , presence ) ;
2014-08-20 16:30:10 -04:00
}
2012-11-07 17:46:20 -05:00
2014-08-20 16:30:10 -04:00
while ( roster ! = NULL ) {
2014-09-29 19:16:01 -04:00
Occupant * occupant = roster - > data ;
const char * presence_str = string_from_resource_presence ( occupant - > presence ) ;
2012-12-05 19:23:11 -05:00
2014-11-16 18:37:07 -05:00
theme_item_t presence_colour = theme_main_presence_attrs ( presence_str ) ;
2014-09-29 19:16:01 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , presence_colour , " " , " %s " , occupant - > nick ) ;
2012-12-05 19:23:11 -05:00
2014-08-20 16:30:10 -04:00
if ( roster - > next ! = NULL ) {
win_save_print ( window , ' ! ' , NULL , NO_DATE | NO_EOL , 0 , " " , " , " ) ;
}
roster = g_list_next ( roster ) ;
2012-11-07 19:22:15 -05:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ONLINE , " " , " " ) ;
2012-12-05 19:23:11 -05:00
2012-11-07 17:46:20 -05:00
}
2013-08-20 18:08:21 -04:00
}
2012-11-05 16:36:32 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_join_error ( const char * const roomjid , const char * const err )
2014-04-20 19:37:04 -04:00
{
2014-12-19 19:52:35 -05:00
cons_show_error ( " Error joining room %s, reason: %s " , roomjid , err ) ;
2014-04-20 19:37:04 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_member_offline ( const char * const roomjid , const char * const nick )
2012-11-07 19:05:32 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received offline presence for room participant %s, but no window open for %s. " , nick , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_OFFLINE , " " , " <- %s has left the room. " , nick ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-07 19:05:32 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_member_kicked ( const char * const roomjid , const char * const nick , const char * const actor ,
2014-10-05 15:52:34 -04:00
const char * const reason )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-05 15:52:34 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received kick for room participant %s, but no window open for %s. " , nick , roomjid ) ;
2014-10-05 15:52:34 -04:00
} else {
GString * message = g_string_new ( nick ) ;
g_string_append ( message , " has been kicked from the room " ) ;
if ( actor ) {
g_string_append ( message , " by " ) ;
g_string_append ( message , actor ) ;
}
if ( reason ) {
g_string_append ( message , " , reason: " ) ;
g_string_append ( message , reason ) ;
}
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_OFFLINE , " " , " <- %s " , message - > str ) ;
2014-10-05 15:52:34 -04:00
g_string_free ( message , TRUE ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_member_banned ( const char * const roomjid , const char * const nick , const char * const actor ,
2014-10-06 17:59:25 -04:00
const char * const reason )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-06 17:59:25 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received ban for room participant %s, but no window open for %s. " , nick , roomjid ) ;
2014-10-06 17:59:25 -04:00
} else {
GString * message = g_string_new ( nick ) ;
g_string_append ( message , " has been banned from the room " ) ;
if ( actor ) {
g_string_append ( message , " by " ) ;
g_string_append ( message , actor ) ;
}
if ( reason ) {
g_string_append ( message , " , reason: " ) ;
g_string_append ( message , reason ) ;
}
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_OFFLINE , " " , " <- %s " , message - > str ) ;
2014-10-06 17:59:25 -04:00
g_string_free ( message , TRUE ) ;
}
}
2014-10-05 15:52:34 -04:00
2014-12-22 17:13:42 -05:00
void
ui_room_member_online ( const char * const roomjid , const char * const nick , const char * const role ,
2014-10-17 19:52:42 -04:00
const char * const affiliation , const char * const show , const char * const status )
2012-11-07 19:05:32 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received online presence for room participant %s, but no window open for %s. " , nick , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ONLINE , " " , " -> %s has joined the room " , nick ) ;
2014-10-18 15:22:34 -04:00
if ( prefs_get_boolean ( PREF_MUC_PRIVILEGES ) ) {
if ( role ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ONLINE , " " , " , role: %s " , role ) ;
2014-10-18 15:22:34 -04:00
}
if ( affiliation ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , THEME_ONLINE , " " , " , affiliation: %s " , affiliation ) ;
2014-10-18 15:22:34 -04:00
}
2014-10-17 19:52:42 -04:00
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , THEME_ROOMINFO , " " , " " ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-07 19:05:32 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_member_presence ( const char * const roomjid , const char * const nick ,
2012-11-18 19:26:31 -05:00
const char * const show , const char * const status )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received presence for room participant %s, but no window open for %s. " , nick , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
2013-10-06 18:52:50 -04:00
win_show_status_string ( window , nick , show , status , NULL , " ++ " , " online " ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-18 19:26:31 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_member_nick_change ( const char * const roomjid ,
2012-11-18 16:46:58 -05:00
const char * const old_nick , const char * const nick )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received nick change for room participant %s, but no window open for %s. " , old_nick , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_THEM , " " , " ** %s is now known as %s " , old_nick , nick ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-18 17:49:01 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_nick_change ( const char * const roomjid , const char * const nick )
2012-11-18 17:49:01 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received self nick change %s, but no window open for %s. " , nick , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ME , " " , " ** You are now known as %s " , nick ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-18 16:46:58 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_history ( const char * const roomjid , const char * const nick ,
2012-11-05 17:21:03 -05:00
GTimeVal tv_stamp , const char * const message )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Room history message received from %s, but no window open for %s " , nick , roomjid ) ;
2014-07-22 17:16:17 -04:00
} else {
2014-08-20 16:30:10 -04:00
GString * line = g_string_new ( " " ) ;
if ( strncmp ( message , " /me " , 4 ) = = 0 ) {
g_string_append ( line , " * " ) ;
g_string_append ( line , nick ) ;
2014-12-01 08:38:17 -05:00
g_string_append ( line , " " ) ;
2014-08-20 16:30:10 -04:00
g_string_append ( line , message + 4 ) ;
} else {
g_string_append ( line , nick ) ;
g_string_append ( line , " : " ) ;
g_string_append ( line , message ) ;
}
2014-07-22 17:16:17 -04:00
2014-11-08 19:36:25 -05:00
win_save_print ( window , ' - ' , & tv_stamp , NO_COLOUR_DATE , 0 , " " , line - > str ) ;
2014-08-20 16:30:10 -04:00
g_string_free ( line , TRUE ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-05 17:21:03 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_message ( const char * const roomjid , const char * const nick ,
2012-11-05 17:28:06 -05:00
const char * const message )
{
2014-12-21 18:14:01 -05:00
ProfMucWin * mucwin = wins_get_muc ( roomjid ) ;
if ( mucwin = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Room message received from %s, but no window open for %s " , nick , roomjid ) ;
2012-11-05 17:49:40 -05:00
} else {
2014-12-21 18:14:01 -05:00
ProfWin * window = ( ProfWin * ) mucwin ;
2014-08-20 16:30:10 -04:00
int num = wins_get_num ( window ) ;
2014-12-19 19:52:35 -05:00
char * my_nick = muc_nick ( roomjid ) ;
2012-11-05 17:49:40 -05:00
2014-11-07 16:05:51 -05:00
if ( g_strcmp0 ( nick , my_nick ) ! = 0 ) {
2014-08-20 16:30:10 -04:00
if ( g_strrstr ( message , my_nick ) ! = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_ME , THEME_ROOMMENTION , nick , message ) ;
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_ME , THEME_TEXT_THEM , nick , message ) ;
2012-11-05 18:24:29 -05:00
}
2014-08-20 16:30:10 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , 0 , THEME_TEXT_ME , nick , message ) ;
2012-11-05 18:24:29 -05:00
}
2012-11-05 17:49:40 -05:00
2014-08-20 16:30:10 -04:00
// currently in groupchat window
if ( wins_is_current ( window ) ) {
status_bar_active ( num ) ;
2012-11-05 17:49:40 -05:00
2014-08-20 16:30:10 -04:00
// not currenlty on groupchat window
} else {
status_bar_new ( num ) ;
cons_show_incoming_message ( nick , num ) ;
2013-05-22 19:10:55 -04:00
2014-08-20 16:30:10 -04:00
if ( strcmp ( nick , my_nick ) ! = 0 ) {
if ( prefs_get_boolean ( PREF_FLASH ) ) {
flash ( ) ;
}
}
2014-12-21 18:14:01 -05:00
mucwin - > unread + + ;
2012-11-05 18:24:29 -05:00
}
2014-05-24 15:46:03 -04:00
2014-08-20 16:30:10 -04:00
int ui_index = num ;
if ( ui_index = = 10 ) {
ui_index = 0 ;
2014-05-24 11:46:05 -04:00
}
2014-08-20 16:30:10 -04:00
2014-12-19 19:52:35 -05:00
if ( strcmp ( nick , muc_nick ( roomjid ) ) ! = 0 ) {
2014-08-20 16:30:10 -04:00
if ( prefs_get_boolean ( PREF_BEEP ) ) {
beep ( ) ;
}
gboolean notify = FALSE ;
char * room_setting = prefs_get_string ( PREF_NOTIFY_ROOM ) ;
if ( g_strcmp0 ( room_setting , " on " ) = = 0 ) {
2014-05-24 11:59:45 -04:00
notify = TRUE ;
}
2014-08-20 16:30:10 -04:00
if ( g_strcmp0 ( room_setting , " mention " ) = = 0 ) {
char * message_lower = g_utf8_strdown ( message , - 1 ) ;
char * nick_lower = g_utf8_strdown ( nick , - 1 ) ;
if ( g_strrstr ( message_lower , nick_lower ) ! = NULL ) {
notify = TRUE ;
}
g_free ( message_lower ) ;
g_free ( nick_lower ) ;
}
prefs_free_string ( room_setting ) ;
if ( notify ) {
gboolean is_current = wins_is_current ( window ) ;
if ( ! is_current | | ( is_current & & prefs_get_boolean ( PREF_NOTIFY_ROOM_CURRENT ) ) ) {
2014-12-19 19:52:35 -05:00
Jid * jidp = jid_create ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( prefs_get_boolean ( PREF_NOTIFY_ROOM_TEXT ) ) {
notify_room_message ( nick , jidp - > localpart , ui_index , message ) ;
} else {
notify_room_message ( nick , jidp - > localpart , ui_index , NULL ) ;
}
jid_destroy ( jidp ) ;
2014-05-24 17:14:26 -04:00
}
2014-05-24 15:46:03 -04:00
}
2012-11-05 18:24:29 -05:00
}
2014-03-31 16:50:33 -04:00
}
2012-11-05 17:28:06 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_room_requires_config ( const char * const roomjid )
2014-09-02 19:23:04 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-09-02 19:23:04 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received room config request, but no window open for %s. " , roomjid ) ;
2014-09-02 19:23:04 -04:00
} else {
int num = wins_get_num ( window ) ;
2014-09-03 17:00:08 -04:00
int ui_index = num ;
if ( ui_index = = 10 ) {
ui_index = 0 ;
}
2014-09-02 19:23:04 -04:00
2014-09-17 19:15:32 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " ,
2014-10-23 18:58:25 -04:00
" Room locked, requires configuration. " ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " ,
2014-09-17 19:15:32 -04:00
" Use '/room accept' to accept the defaults " ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " ,
2014-09-17 19:15:32 -04:00
" Use '/room destroy' to cancel and destroy the room " ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " ,
2014-09-17 19:15:32 -04:00
" Use '/room config' to edit the room configuration " ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-02 19:23:04 -04:00
// currently in groupchat window
if ( wins_is_current ( window ) ) {
status_bar_active ( num ) ;
// not currenlty on groupchat window
} else {
status_bar_new ( num ) ;
}
2014-09-03 17:00:08 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_destroy ( const char * const roomjid )
2014-09-03 17:00:08 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-09-03 17:00:08 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received room destroy result, but no window open for %s. " , roomjid ) ;
2014-09-03 17:00:08 -04:00
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
2014-12-19 19:52:35 -05:00
cons_show ( " Room destroyed: %s " , roomjid ) ;
2014-09-02 19:23:04 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_leave_room ( const char * const roomjid )
2014-10-05 15:52:34 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-05 15:52:34 -04:00
if ( window ) {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_destroyed ( const char * const roomjid , const char * const reason , const char * const new_jid ,
2014-10-05 15:52:34 -04:00
const char * const password )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-05 15:52:34 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received room destroy, but no window open for %s. " , roomjid ) ;
2014-10-05 15:52:34 -04:00
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
ProfWin * console = wins_get_console ( ) ;
if ( reason ) {
2014-12-19 19:52:35 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " <- Room destroyed: %s, reason: %s " , roomjid , reason ) ;
2014-10-05 15:52:34 -04:00
} else {
2014-12-19 19:52:35 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " <- Room destroyed: %s " , roomjid ) ;
2014-10-05 15:52:34 -04:00
}
if ( new_jid ) {
if ( password ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " Replacement room: %s, password: %s " , new_jid , password ) ;
2014-10-05 15:52:34 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " Replacement room: %s " , new_jid ) ;
2014-10-05 15:52:34 -04:00
}
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_kicked ( const char * const roomjid , const char * const actor , const char * const reason )
2014-10-05 15:52:34 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-05 15:52:34 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received kick, but no window open for %s. " , roomjid ) ;
2014-10-05 15:52:34 -04:00
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
GString * message = g_string_new ( " Kicked from " ) ;
2014-12-19 19:52:35 -05:00
g_string_append ( message , roomjid ) ;
2014-10-05 15:52:34 -04:00
if ( actor ) {
g_string_append ( message , " by " ) ;
g_string_append ( message , actor ) ;
}
if ( reason ) {
g_string_append ( message , " , reason: " ) ;
g_string_append ( message , reason ) ;
}
ProfWin * console = wins_get_console ( ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " <- %s " , message - > str ) ;
2014-10-05 15:52:34 -04:00
g_string_free ( message , TRUE ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_banned ( const char * const roomjid , const char * const actor , const char * const reason )
2014-10-06 17:59:25 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-06 17:59:25 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received ban, but no window open for %s. " , roomjid ) ;
2014-10-06 17:59:25 -04:00
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
GString * message = g_string_new ( " Banned from " ) ;
2014-12-19 19:52:35 -05:00
g_string_append ( message , roomjid ) ;
2014-10-06 17:59:25 -04:00
if ( actor ) {
g_string_append ( message , " by " ) ;
g_string_append ( message , actor ) ;
}
if ( reason ) {
g_string_append ( message , " , reason: " ) ;
g_string_append ( message , reason ) ;
}
ProfWin * console = wins_get_console ( ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_TYPING , " " , " <- %s " , message - > str ) ;
2014-10-06 17:59:25 -04:00
g_string_free ( message , TRUE ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_subject ( const char * const roomjid , const char * const nick , const char * const subject )
2012-11-09 22:30:27 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received room subject, but no window open for %s. " , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
int num = wins_get_num ( window ) ;
2012-11-09 22:30:27 -05:00
2014-10-04 22:05:46 -04:00
if ( subject ) {
if ( nick ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " *%s has set the room subject: " , nick ) ;
2014-10-04 22:05:46 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE , 0 , " " , " %s " , subject ) ;
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " Room subject: " ) ;
2014-10-04 22:05:46 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE , 0 , " " , " %s " , subject ) ;
}
} else {
if ( nick ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " , " *%s has cleared the room subject: " , nick ) ;
2014-10-04 22:05:46 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " , " Room subject cleared " ) ;
2014-10-04 22:05:46 -04:00
}
}
2012-11-09 22:30:27 -05:00
2014-08-20 16:30:10 -04:00
// currently in groupchat window
if ( wins_is_current ( window ) ) {
status_bar_active ( num ) ;
2012-11-09 22:30:27 -05:00
2014-08-20 16:30:10 -04:00
// not currenlty on groupchat window
} else {
status_bar_active ( num ) ;
}
2012-11-09 22:30:27 -05:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_kick_error ( const char * const roomjid , const char * const nick , const char * const error )
2014-10-04 22:52:55 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-04 22:52:55 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Kick error received for %s, but no window open for %s. " , nick , roomjid ) ;
2014-10-04 22:52:55 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error kicking %s: %s " , nick , error ) ;
2014-10-04 22:52:55 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_broadcast ( const char * const roomjid , const char * const message )
2012-11-19 17:15:53 -05:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-12-19 19:52:35 -05:00
log_error ( " Received room broadcast, but no window open for %s. " , roomjid ) ;
2014-08-20 16:30:10 -04:00
} else {
int num = wins_get_num ( window ) ;
2012-11-19 17:15:53 -05:00
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , THEME_ROOMINFO , " " , " Room message: " ) ;
2014-08-20 16:30:10 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_DATE , 0 , " " , " %s " , message ) ;
2012-11-19 17:15:53 -05:00
2014-08-20 16:30:10 -04:00
// currently in groupchat window
if ( wins_is_current ( window ) ) {
status_bar_active ( num ) ;
2012-11-19 17:15:53 -05:00
2014-08-20 16:30:10 -04:00
// not currenlty on groupchat window
} else {
status_bar_new ( num ) ;
}
2012-11-19 17:15:53 -05:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_affiliation_list_error ( const char * const roomjid , const char * const affiliation ,
2014-10-04 20:39:48 -04:00
const char * const error )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-04 20:39:48 -04:00
if ( window ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error retrieving %s list: %s " , affiliation , error ) ;
2014-10-04 20:39:48 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_affiliation_list ( const char * const roomjid , const char * const affiliation , GSList * jids )
2014-10-04 20:39:48 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-04 20:39:48 -04:00
if ( window ) {
if ( jids ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Affiliation: %s " , affiliation ) ;
GSList * curr_jid = jids ;
while ( curr_jid ) {
char * jid = curr_jid - > data ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , jid ) ;
curr_jid = g_slist_next ( curr_jid ) ;
}
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " " ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " No users found with affiliation: %s " , affiliation ) ;
2014-10-11 20:10:46 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " " ) ;
2014-10-04 20:39:48 -04:00
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_role_list_error ( const char * const roomjid , const char * const role , const char * const error )
2014-10-06 16:42:09 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-06 16:42:09 -04:00
if ( window ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error retrieving %s list: %s " , role , error ) ;
2014-10-06 16:42:09 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_role_list ( const char * const roomjid , const char * const role , GSList * nicks )
2014-10-06 16:42:09 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-06 16:42:09 -04:00
if ( window ) {
if ( nicks ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Role: %s " , role ) ;
GSList * curr_nick = nicks ;
while ( curr_nick ) {
char * nick = curr_nick - > data ;
2014-12-19 19:52:35 -05:00
Occupant * occupant = muc_roster_item ( roomjid , nick ) ;
2014-10-06 16:42:09 -04:00
if ( occupant ) {
if ( occupant - > jid ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s (%s) " , nick , occupant - > jid ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , nick ) ;
}
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , nick ) ;
}
curr_nick = g_slist_next ( curr_nick ) ;
}
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " " ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " No occupants found with role: %s " , role ) ;
2014-10-11 20:10:46 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " " ) ;
2014-10-06 16:42:09 -04:00
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_affiliation_set_error ( const char * const roomjid , const char * const jid , const char * const affiliation ,
2014-10-04 20:39:48 -04:00
const char * const error )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-04 20:39:48 -04:00
if ( window ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error setting %s affiliation for %s: %s " , affiliation , jid , error ) ;
2014-10-04 20:39:48 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_role_set_error ( const char * const roomjid , const char * const nick , const char * const role ,
2014-10-06 16:42:09 -04:00
const char * const error )
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-10-06 16:42:09 -04:00
if ( window ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Error setting %s role for %s: %s " , role , nick , error ) ;
2014-10-06 16:42:09 -04:00
}
}
2014-12-22 17:13:42 -05:00
gint
ui_unread ( void )
2012-11-25 19:57:41 -05:00
{
2013-08-20 18:08:21 -04:00
return wins_get_total_unread ( ) ;
2012-11-25 19:57:41 -05:00
}
2014-12-22 17:13:42 -05:00
int
ui_win_unread ( int index )
2013-05-16 17:34:05 -04:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_num ( index ) ;
if ( window ! = NULL ) {
2014-12-21 18:14:01 -05:00
return win_unread ( window ) ;
2013-05-16 17:34:05 -04:00
} else {
return 0 ;
}
}
2014-12-22 17:13:42 -05:00
char *
ui_ask_password ( void )
2013-12-15 14:38:23 -05:00
{
char * passwd = malloc ( sizeof ( char ) * ( MAX_PASSWORD_SIZE + 1 ) ) ;
status_bar_get_password ( ) ;
2014-04-01 16:52:04 -04:00
status_bar_update_virtual ( ) ;
2013-12-15 14:38:23 -05:00
inp_block ( ) ;
inp_get_password ( passwd ) ;
2015-01-08 17:43:11 -05:00
inp_non_block ( prefs_get_inpblock ( ) ) ;
2013-12-15 14:38:23 -05:00
return passwd ;
}
2014-12-22 17:13:42 -05:00
void
ui_chat_win_contact_online ( PContact contact , Resource * resource , GDateTime * last_activity )
2014-01-19 13:31:02 -05:00
{
const char * show = string_from_resource_presence ( resource - > presence ) ;
char * display_str = p_contact_create_display_string ( contact , resource - > name ) ;
const char * barejid = p_contact_barejid ( contact ) ;
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_chat ( barejid ) ;
2014-01-19 13:31:02 -05:00
if ( window ! = NULL ) {
win_show_status_string ( window , display_str , show , resource - > status ,
last_activity , " ++ " , " online " ) ;
}
free ( display_str ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_chat_win_contact_offline ( PContact contact , char * resource , char * status )
2014-01-19 13:31:02 -05:00
{
char * display_str = p_contact_create_display_string ( contact , resource ) ;
const char * barejid = p_contact_barejid ( contact ) ;
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_chat ( barejid ) ;
2014-01-19 13:31:02 -05:00
if ( window ! = NULL ) {
win_show_status_string ( window , display_str , " offline " , status , NULL , " -- " ,
" offline " ) ;
}
free ( display_str ) ;
}
2015-01-11 15:20:17 -05:00
void
ui_contact_offline ( char * barejid , char * resource , char * status )
{
char * show_console = prefs_get_string ( PREF_STATUSES_CONSOLE ) ;
char * show_chat_win = prefs_get_string ( PREF_STATUSES_CHAT ) ;
Jid * jid = jid_create_from_bare_and_resource ( barejid , resource ) ;
PContact contact = roster_get_contact ( barejid ) ;
if ( p_contact_subscription ( contact ) ! = NULL ) {
if ( strcmp ( p_contact_subscription ( contact ) , " none " ) ! = 0 ) {
// show in console if "all"
if ( g_strcmp0 ( show_console , " all " ) = = 0 ) {
cons_show_contact_offline ( contact , resource , status ) ;
// show in console of "online"
} else if ( g_strcmp0 ( show_console , " online " ) = = 0 ) {
cons_show_contact_offline ( contact , resource , status ) ;
}
// show in chat win if "all"
if ( g_strcmp0 ( show_chat_win , " all " ) = = 0 ) {
ui_chat_win_contact_offline ( contact , resource , status ) ;
// show in char win if "online" and presence online
} else if ( g_strcmp0 ( show_chat_win , " online " ) = = 0 ) {
ui_chat_win_contact_offline ( contact , resource , status ) ;
}
}
}
ProfChatWin * chatwin = wins_get_chat ( barejid ) ;
if ( chatwin & & chatwin - > resource_override & & ( g_strcmp0 ( resource , chatwin - > resource_override ) = = 0 ) ) {
FREE_SET_NULL ( chatwin - > resource_override ) ;
}
prefs_free_string ( show_console ) ;
prefs_free_string ( show_chat_win ) ;
jid_destroy ( jid ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_clear_win_title ( void )
2014-04-03 16:13:59 -04:00
{
2014-04-03 16:46:43 -04:00
printf ( " %c]0;%c " , ' \033 ' , ' \007 ' ) ;
2014-04-03 16:13:59 -04:00
}
2014-12-29 21:05:50 -05:00
void
ui_goodbye_title ( void )
{
2015-01-02 21:05:55 -05:00
int result = system ( " /bin/echo -ne \" \033 ]0;Thanks for using Profanity \007 \" " ) ;
if ( result = = - 1 ) log_error ( " Error printing title on shutdown " ) ;
2014-12-29 21:05:50 -05:00
}
2014-12-22 17:13:42 -05:00
void
ui_statusbar_new ( const int win )
2014-04-07 16:12:30 -04:00
{
status_bar_new ( win ) ;
}
2013-04-21 12:30:04 -04:00
static void
2014-04-05 19:47:14 -04:00
_ui_draw_term_title ( void )
2013-04-21 12:30:04 -04:00
{
char new_win_title [ 100 ] ;
jabber_conn_status_t status = jabber_get_connection_status ( ) ;
if ( status = = JABBER_CONNECTED ) {
2013-05-21 17:00:42 -04:00
const char * const jid = jabber_get_fulljid ( ) ;
2013-04-21 15:17:06 -04:00
gint unread = ui_unread ( ) ;
2013-04-21 12:30:04 -04:00
if ( unread ! = 0 ) {
2013-10-06 20:35:20 -04:00
snprintf ( new_win_title , sizeof ( new_win_title ) ,
2015-01-02 20:35:27 -05:00
" /bin/echo -n \" %c]0;%s (%d) - %s%c \" " , ' \033 ' , " Profanity " ,
2013-10-06 20:35:20 -04:00
unread , jid , ' \007 ' ) ;
2013-04-21 12:30:04 -04:00
} else {
2013-10-06 20:35:20 -04:00
snprintf ( new_win_title , sizeof ( new_win_title ) ,
2015-01-02 20:35:27 -05:00
" /bin/echo -n \" %c]0;%s - %s%c \" " , ' \033 ' , " Profanity " , jid ,
2013-10-06 20:35:20 -04:00
' \007 ' ) ;
2013-04-21 12:30:04 -04:00
}
} else {
2015-01-02 20:35:27 -05:00
snprintf ( new_win_title , sizeof ( new_win_title ) , " /bin/echo -n \" %c]0;%s%c \" " , ' \033 ' ,
2014-04-03 16:46:43 -04:00
" Profanity " , ' \007 ' ) ;
2013-04-21 12:30:04 -04:00
}
if ( g_strcmp0 ( win_title , new_win_title ) ! = 0 ) {
// print to x-window title bar
2014-12-30 20:48:52 -05:00
int res = system ( new_win_title ) ;
if ( res = = - 1 ) {
2015-01-01 17:51:52 -05:00
log_error ( " Error writing terminal window title. " ) ;
2014-12-30 20:48:52 -05:00
}
2013-04-21 12:30:04 -04:00
if ( win_title ! = NULL ) {
free ( win_title ) ;
}
win_title = strdup ( new_win_title ) ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_show_room_info ( ProfMucWin * mucwin )
2014-09-30 18:08:48 -04:00
{
2014-12-18 18:57:19 -05:00
char * role = muc_role_str ( mucwin - > roomjid ) ;
char * affiliation = muc_affiliation_str ( mucwin - > roomjid ) ;
2014-09-30 18:08:48 -04:00
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) mucwin ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Room: %s " , mucwin - > roomjid ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Affiliation: %s " , affiliation ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Role: %s " , role ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-30 18:08:48 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_show_room_role_list ( ProfMucWin * mucwin , muc_role_t role )
2014-09-30 19:27:25 -04:00
{
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) mucwin ;
2014-12-18 18:57:19 -05:00
GSList * occupants = muc_occupants_by_role ( mucwin - > roomjid , role ) ;
2014-09-30 19:27:25 -04:00
if ( ! occupants ) {
switch ( role ) {
case MUC_ROLE_MODERATOR :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No moderators found. " ) ;
2014-09-30 19:27:25 -04:00
break ;
case MUC_ROLE_PARTICIPANT :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No participants found. " ) ;
2014-09-30 19:27:25 -04:00
break ;
case MUC_ROLE_VISITOR :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No visitors found. " ) ;
2014-09-30 19:27:25 -04:00
break ;
default :
break ;
}
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-30 19:27:25 -04:00
} else {
switch ( role ) {
case MUC_ROLE_MODERATOR :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Moderators: " ) ;
2014-09-30 19:27:25 -04:00
break ;
case MUC_ROLE_PARTICIPANT :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Participants: " ) ;
2014-09-30 19:27:25 -04:00
break ;
case MUC_ROLE_VISITOR :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Visitors: " ) ;
2014-09-30 19:27:25 -04:00
break ;
default :
break ;
}
GSList * curr_occupant = occupants ;
while ( curr_occupant ) {
Occupant * occupant = curr_occupant - > data ;
if ( occupant - > role = = role ) {
2014-10-01 08:27:01 -04:00
if ( occupant - > jid ) {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s (%s) " , occupant - > nick , occupant - > jid ) ;
2014-10-01 08:27:01 -04:00
} else {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , occupant - > nick ) ;
2014-10-01 08:27:01 -04:00
}
2014-09-30 19:27:25 -04:00
}
curr_occupant = g_slist_next ( curr_occupant ) ;
}
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-30 19:27:25 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_show_room_affiliation_list ( ProfMucWin * mucwin , muc_affiliation_t affiliation )
2014-09-30 19:46:58 -04:00
{
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) mucwin ;
2014-12-18 18:57:19 -05:00
GSList * occupants = muc_occupants_by_affiliation ( mucwin - > roomjid , affiliation ) ;
2014-09-30 19:46:58 -04:00
if ( ! occupants ) {
switch ( affiliation ) {
case MUC_AFFILIATION_OWNER :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No owners found. " ) ;
2014-09-30 19:46:58 -04:00
break ;
case MUC_AFFILIATION_ADMIN :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No admins found. " ) ;
2014-09-30 19:46:58 -04:00
break ;
case MUC_AFFILIATION_MEMBER :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No members found. " ) ;
2014-09-30 19:46:58 -04:00
break ;
case MUC_AFFILIATION_OUTCAST :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No outcasts found. " ) ;
2014-09-30 19:46:58 -04:00
break ;
default :
break ;
}
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-30 19:46:58 -04:00
} else {
switch ( affiliation ) {
case MUC_AFFILIATION_OWNER :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Owners: " ) ;
2014-09-30 19:46:58 -04:00
break ;
case MUC_AFFILIATION_ADMIN :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Admins: " ) ;
2014-09-30 19:46:58 -04:00
break ;
case MUC_AFFILIATION_MEMBER :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Members: " ) ;
2014-09-30 19:46:58 -04:00
break ;
case MUC_AFFILIATION_OUTCAST :
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Outcasts: " ) ;
2014-09-30 19:46:58 -04:00
break ;
default :
break ;
}
GSList * curr_occupant = occupants ;
while ( curr_occupant ) {
Occupant * occupant = curr_occupant - > data ;
if ( occupant - > affiliation = = affiliation ) {
2014-10-01 08:27:01 -04:00
if ( occupant - > jid ) {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s (%s) " , occupant - > nick , occupant - > jid ) ;
2014-10-01 08:27:01 -04:00
} else {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , occupant - > nick ) ;
2014-10-01 08:27:01 -04:00
}
2014-09-30 19:46:58 -04:00
}
curr_occupant = g_slist_next ( curr_occupant ) ;
}
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-30 19:46:58 -04:00
}
}
2014-09-10 14:59:30 -04:00
static void
2014-09-13 20:56:53 -04:00
_ui_handle_form_field ( ProfWin * window , char * tag , FormField * field )
2014-09-10 14:59:30 -04:00
{
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , NO_EOL , THEME_AWAY , " " , " [%s] " , tag ) ;
2014-09-13 20:56:53 -04:00
win_save_vprint ( window , ' - ' , NULL , NO_EOL | NO_DATE , 0 , " " , " %s " , field - > label ) ;
if ( field - > required ) {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , 0 , " " , " (required): " ) ;
} else {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , 0 , " " , " : " ) ;
}
2014-09-10 14:59:30 -04:00
GSList * values = field - > values ;
GSList * curr_value = values ;
switch ( field - > type_t ) {
case FIELD_HIDDEN :
break ;
case FIELD_TEXT_SINGLE :
if ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
if ( value ! = NULL ) {
if ( g_strcmp0 ( field - > var , " muc#roomconfig_roomsecret " ) = = 0 ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , THEME_ONLINE , " " , " [hidden] " ) ;
2014-09-10 14:59:30 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , THEME_ONLINE , " " , value ) ;
2014-09-10 14:59:30 -04:00
}
}
}
win_save_newline ( window ) ;
break ;
case FIELD_TEXT_PRIVATE :
if ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
if ( value ! = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , THEME_ONLINE , " " , " [hidden] " ) ;
2014-09-10 14:59:30 -04:00
}
}
win_save_newline ( window ) ;
break ;
case FIELD_TEXT_MULTI :
win_save_newline ( window ) ;
2014-09-13 20:53:52 -04:00
int index = 1 ;
2014-09-10 14:59:30 -04:00
while ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
2014-09-14 13:36:44 -04:00
GString * val_tag = g_string_new ( " " ) ;
g_string_printf ( val_tag , " val%d " , index + + ) ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , THEME_ONLINE , " " , " [%s] %s " , val_tag - > str , value ) ;
2014-09-14 13:36:44 -04:00
g_string_free ( val_tag , TRUE ) ;
2014-09-10 14:59:30 -04:00
curr_value = g_slist_next ( curr_value ) ;
}
break ;
case FIELD_BOOLEAN :
if ( curr_value = = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE , THEME_OFFLINE , " " , " FALSE " ) ;
2014-09-10 14:59:30 -04:00
} else {
char * value = curr_value - > data ;
if ( value = = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE , THEME_OFFLINE , " " , " FALSE " ) ;
2014-09-10 14:59:30 -04:00
} else {
if ( g_strcmp0 ( value , " 0 " ) = = 0 ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE , THEME_OFFLINE , " " , " FALSE " ) ;
2014-09-10 14:59:30 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE , THEME_ONLINE , " " , " TRUE " ) ;
2014-09-10 14:59:30 -04:00
}
}
}
break ;
case FIELD_LIST_SINGLE :
if ( curr_value ! = NULL ) {
win_save_newline ( window ) ;
char * value = curr_value - > data ;
GSList * options = field - > options ;
GSList * curr_option = options ;
while ( curr_option ! = NULL ) {
FormOption * option = curr_option - > data ;
if ( g_strcmp0 ( option - > value , value ) = = 0 ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , THEME_ONLINE , " " , " [%s] %s " , option - > value , option - > label ) ;
2014-09-10 14:59:30 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , THEME_OFFLINE , " " , " [%s] %s " , option - > value , option - > label ) ;
2014-09-10 14:59:30 -04:00
}
curr_option = g_slist_next ( curr_option ) ;
}
}
break ;
2014-09-13 19:18:06 -04:00
case FIELD_LIST_MULTI :
2014-09-10 14:59:30 -04:00
if ( curr_value ! = NULL ) {
win_save_newline ( window ) ;
GSList * options = field - > options ;
GSList * curr_option = options ;
while ( curr_option ! = NULL ) {
FormOption * option = curr_option - > data ;
if ( g_slist_find_custom ( curr_value , option - > value , ( GCompareFunc ) g_strcmp0 ) ! = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , THEME_ONLINE , " " , " [%s] %s " , option - > value , option - > label ) ;
2014-09-10 14:59:30 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , THEME_OFFLINE , " " , " [%s] %s " , option - > value , option - > label ) ;
2014-09-10 14:59:30 -04:00
}
curr_option = g_slist_next ( curr_option ) ;
}
}
break ;
case FIELD_JID_SINGLE :
if ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
if ( value ! = NULL ) {
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , THEME_ONLINE , " " , value ) ;
2014-09-10 14:59:30 -04:00
}
}
win_save_newline ( window ) ;
break ;
case FIELD_JID_MULTI :
win_save_newline ( window ) ;
while ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
2014-11-16 15:40:19 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , THEME_ONLINE , " " , " %s " , value ) ;
2014-09-10 14:59:30 -04:00
curr_value = g_slist_next ( curr_value ) ;
}
break ;
case FIELD_FIXED :
if ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
if ( value ! = NULL ) {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , 0 , " " , value ) ;
}
}
win_save_newline ( window ) ;
break ;
default :
break ;
}
}
2014-12-22 17:13:42 -05:00
void
ui_show_form ( ProfMucConfWin * confwin )
2014-09-06 19:22:11 -04:00
{
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) confwin ;
2014-12-18 18:57:19 -05:00
if ( confwin - > form - > title ! = NULL ) {
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , NO_EOL , 0 , " " , " Form title: " ) ;
win_save_print ( window , ' - ' , NULL , NO_DATE , 0 , " " , confwin - > form - > title ) ;
2014-09-08 19:14:40 -04:00
} else {
2014-12-21 17:01:56 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Configuration for room %s. " , confwin - > roomjid ) ;
2014-09-06 19:22:11 -04:00
}
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-08 19:14:40 -04:00
2014-12-18 18:57:19 -05:00
ui_show_form_help ( confwin ) ;
2014-09-06 19:22:11 -04:00
2014-12-18 18:57:19 -05:00
GSList * fields = confwin - > form - > fields ;
2014-09-06 19:22:11 -04:00
GSList * curr_field = fields ;
while ( curr_field ! = NULL ) {
FormField * field = curr_field - > data ;
2014-10-01 08:01:20 -04:00
if ( ( g_strcmp0 ( field - > type , " fixed " ) = = 0 ) & & field - > values ) {
if ( field - > values ) {
char * value = field - > values - > data ;
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , value ) ;
2014-10-01 08:01:20 -04:00
}
} else if ( g_strcmp0 ( field - > type , " hidden " ) ! = 0 & & field - > var ) {
2014-12-18 18:57:19 -05:00
char * tag = g_hash_table_lookup ( confwin - > form - > var_to_tag , field - > var ) ;
2014-12-21 14:40:15 -05:00
_ui_handle_form_field ( window , tag , field ) ;
2014-09-06 19:22:11 -04:00
}
curr_field = g_slist_next ( curr_field ) ;
}
2014-09-10 18:05:35 -04:00
}
2014-09-06 19:22:11 -04:00
2014-12-22 17:13:42 -05:00
void
ui_show_form_field ( ProfWin * window , DataForm * form , char * tag )
2014-09-15 18:28:12 -04:00
{
FormField * field = form_get_field_by_tag ( form , tag ) ;
_ui_handle_form_field ( window , tag , field ) ;
win_save_println ( window , " " ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_configuration ( const char * const roomjid , DataForm * form )
2014-09-15 17:51:53 -04:00
{
2014-12-21 17:01:56 -05:00
ProfWin * window = wins_new_muc_config ( roomjid , form ) ;
2014-12-18 18:57:19 -05:00
ProfMucConfWin * confwin = ( ProfMucConfWin * ) window ;
2014-12-21 19:28:03 -05:00
assert ( confwin - > memcheck = = PROFCONFWIN_MEMCHECK ) ;
2014-09-15 17:51:53 -04:00
int num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
2014-12-18 18:57:19 -05:00
ui_show_form ( confwin ) ;
2014-10-07 16:31:34 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-10-23 19:21:00 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Use '/form submit' to save changes. " ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Use '/form cancel' to cancel changes. " ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " See '/form help' for more information. " ) ;
2014-10-07 16:31:34 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-15 17:51:53 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_configuration_form_error ( const char * const roomjid , const char * const message )
2014-09-17 15:59:56 -04:00
{
ProfWin * window = NULL ;
GString * message_str = g_string_new ( " " ) ;
2014-12-19 19:52:35 -05:00
if ( roomjid ) {
window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
g_string_printf ( message_str , " Could not get room configuration for %s " , roomjid ) ;
2014-09-17 15:59:56 -04:00
} else {
window = wins_get_console ( ) ;
g_string_printf ( message_str , " Could not get room configuration " ) ;
}
if ( message ) {
g_string_append ( message_str , " : " ) ;
g_string_append ( message_str , message ) ;
}
2014-11-16 15:40:19 -05:00
win_save_print ( window , ' - ' , NULL , 0 , THEME_ERROR , " " , message_str - > str ) ;
2014-09-17 15:59:56 -04:00
g_string_free ( message_str , TRUE ) ;
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_config_submit_result ( const char * const roomjid )
2014-09-10 18:05:35 -04:00
{
2014-09-17 16:48:55 -04:00
ProfWin * muc_window = NULL ;
ProfWin * form_window = NULL ;
int num ;
2014-12-19 19:52:35 -05:00
if ( roomjid ) {
muc_window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-09-17 16:48:55 -04:00
2014-12-19 19:52:35 -05:00
GString * form_recipient = g_string_new ( roomjid ) ;
g_string_append ( form_recipient , " config " ) ;
form_window = ( ProfWin * ) wins_get_muc_conf ( form_recipient - > str ) ;
2014-09-17 16:48:55 -04:00
g_string_free ( form_recipient , TRUE ) ;
if ( form_window ) {
num = wins_get_num ( form_window ) ;
wins_close_by_num ( num ) ;
}
if ( muc_window ) {
int num = wins_get_num ( muc_window ) ;
ui_switch_win ( num ) ;
2014-11-16 15:40:19 -05:00
win_save_print ( muc_window , ' ! ' , NULL , 0 , THEME_ROOMINFO , " " , " Room configuration successful " ) ;
2014-09-17 16:48:55 -04:00
} else {
ui_switch_win ( 1 ) ;
2014-12-19 19:52:35 -05:00
cons_show ( " Room configuration successful: %s " , roomjid ) ;
2014-09-17 16:48:55 -04:00
}
} else {
2014-09-23 19:30:05 -04:00
cons_show ( " Room configuration successful " ) ;
2014-09-17 16:48:55 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_handle_room_config_submit_result_error ( const char * const roomjid , const char * const message )
2014-09-17 16:48:55 -04:00
{
ProfWin * console = wins_get_console ( ) ;
ProfWin * muc_window = NULL ;
ProfWin * form_window = NULL ;
2014-12-19 19:52:35 -05:00
if ( roomjid ) {
muc_window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-09-17 16:48:55 -04:00
2014-12-19 19:52:35 -05:00
GString * form_recipient = g_string_new ( roomjid ) ;
g_string_append ( form_recipient , " config " ) ;
form_window = ( ProfWin * ) wins_get_muc_conf ( form_recipient - > str ) ;
2014-09-17 16:48:55 -04:00
g_string_free ( form_recipient , TRUE ) ;
if ( form_window ) {
if ( message ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( form_window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error: %s " , message ) ;
2014-09-17 16:48:55 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( form_window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error " ) ;
2014-09-17 16:48:55 -04:00
}
} else if ( muc_window ) {
if ( message ) {
2014-11-16 15:40:19 -05:00
win_save_vprint ( muc_window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error: %s " , message ) ;
2014-09-17 16:48:55 -04:00
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( muc_window , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error " ) ;
2014-09-17 16:48:55 -04:00
}
} else {
if ( message ) {
2014-12-19 19:52:35 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error for %s: %s " , roomjid , message ) ;
2014-09-17 16:48:55 -04:00
} else {
2014-12-19 19:52:35 -05:00
win_save_vprint ( console , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error for %s " , roomjid ) ;
2014-09-17 16:48:55 -04:00
}
}
} else {
2014-11-16 15:40:19 -05:00
win_save_print ( console , ' ! ' , NULL , 0 , THEME_ERROR , " " , " Configuration error " ) ;
2014-09-17 16:48:55 -04:00
}
2014-09-06 19:22:11 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_show_form_field_help ( ProfMucConfWin * confwin , char * tag )
2014-09-16 15:52:38 -04:00
{
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) confwin ;
2014-12-18 18:57:19 -05:00
FormField * field = form_get_field_by_tag ( confwin - > form , tag ) ;
2014-09-16 16:51:16 -04:00
if ( field ! = NULL ) {
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , NO_EOL , 0 , " " , field - > label ) ;
2014-09-16 16:51:16 -04:00
if ( field - > required ) {
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE , 0 , " " , " (Required): " ) ;
2014-09-16 16:51:16 -04:00
} else {
2014-12-21 14:40:15 -05:00
win_save_print ( window , ' - ' , NULL , NO_DATE , 0 , " " , " : " ) ;
2014-09-16 16:51:16 -04:00
}
if ( field - > description ! = NULL ) {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Description : %s " , field - > description ) ;
2014-09-16 16:51:16 -04:00
}
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Type : %s " , field - > type ) ;
2014-09-16 16:51:16 -04:00
int num_values = 0 ;
GSList * curr_option = NULL ;
FormOption * option = NULL ;
switch ( field - > type_t ) {
case FIELD_TEXT_SINGLE :
case FIELD_TEXT_PRIVATE :
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is any text " ) ;
2014-09-16 16:51:16 -04:00
break ;
case FIELD_TEXT_MULTI :
2014-12-18 18:57:19 -05:00
num_values = form_get_value_count ( confwin - > form , tag ) ;
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Add : /%s add <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is any text " ) ;
2014-09-16 16:51:16 -04:00
if ( num_values > 0 ) {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Remove : /%s remove <value> " , tag ) ;
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> between 'val1' and 'val%d' " , num_values ) ;
2014-09-16 16:51:16 -04:00
}
break ;
case FIELD_BOOLEAN :
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is either 'on' or 'off' " ) ;
2014-09-16 16:51:16 -04:00
break ;
case FIELD_LIST_SINGLE :
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is one of " ) ;
2014-09-16 16:51:16 -04:00
curr_option = field - > options ;
while ( curr_option ! = NULL ) {
option = curr_option - > data ;
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " %s " , option - > value ) ;
2014-09-16 16:51:16 -04:00
curr_option = g_slist_next ( curr_option ) ;
}
break ;
case FIELD_LIST_MULTI :
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Add : /%s add <value> " , tag ) ;
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Remove : /%s remove <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is one of " ) ;
2014-09-16 16:51:16 -04:00
curr_option = field - > options ;
while ( curr_option ! = NULL ) {
option = curr_option - > data ;
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " %s " , option - > value ) ;
2014-09-16 16:51:16 -04:00
curr_option = g_slist_next ( curr_option ) ;
}
break ;
case FIELD_JID_SINGLE :
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is a valid Jabber ID " ) ;
2014-09-16 16:51:16 -04:00
break ;
case FIELD_JID_MULTI :
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Add : /%s add <value> " , tag ) ;
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Remove : /%s remove <value> " , tag ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is a valid Jabber ID " ) ;
2014-09-16 16:51:16 -04:00
break ;
case FIELD_FIXED :
case FIELD_UNKNOWN :
case FIELD_HIDDEN :
default :
break ;
}
} else {
2014-12-21 14:40:15 -05:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " No such field %s " , tag ) ;
2014-09-16 16:51:16 -04:00
}
2014-09-16 15:52:38 -04:00
}
2014-12-22 17:13:42 -05:00
void
ui_show_form_help ( ProfMucConfWin * confwin )
2014-09-16 15:52:38 -04:00
{
2014-12-18 18:57:19 -05:00
if ( confwin - > form - > instructions ! = NULL ) {
2014-12-21 14:40:15 -05:00
ProfWin * window = ( ProfWin * ) confwin ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Supplied instructions: " ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , confwin - > form - > instructions ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-16 15:52:38 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_show_lines ( ProfWin * window , const gchar * * lines )
2014-09-16 15:52:38 -04:00
{
if ( lines ! = NULL ) {
int i ;
for ( i = 0 ; lines [ i ] ! = NULL ; i + + ) {
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , lines [ i ] ) ;
}
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_show_occupants ( const char * const roomjid )
2014-10-09 08:16:36 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-12-15 20:39:47 -05:00
if ( window & & ! win_has_active_subwin ( window ) ) {
2014-10-09 16:42:09 -04:00
wins_show_subwin ( window ) ;
2014-12-19 19:52:35 -05:00
occupantswin_occupants ( roomjid ) ;
2014-10-09 08:16:36 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_room_hide_occupants ( const char * const roomjid )
2014-10-09 08:16:36 -04:00
{
2014-12-19 19:52:35 -05:00
ProfWin * window = ( ProfWin * ) wins_get_muc ( roomjid ) ;
2014-12-15 20:39:47 -05:00
if ( window & & win_has_active_subwin ( window ) ) {
2014-10-09 16:27:16 -04:00
wins_hide_subwin ( window ) ;
2014-10-09 08:16:36 -04:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_show_roster ( void )
2014-11-10 18:23:02 -05:00
{
ProfWin * window = wins_get_console ( ) ;
2014-12-15 20:39:47 -05:00
if ( window & & ! win_has_active_subwin ( window ) ) {
2014-11-10 18:23:02 -05:00
wins_show_subwin ( window ) ;
2014-12-16 18:00:05 -05:00
rosterwin_roster ( ) ;
2014-11-10 18:23:02 -05:00
}
}
2014-12-22 17:13:42 -05:00
void
ui_hide_roster ( void )
2014-11-10 18:23:02 -05:00
{
ProfWin * window = wins_get_console ( ) ;
2014-12-15 20:39:47 -05:00
if ( window & & win_has_active_subwin ( window ) ) {
2014-11-10 18:23:02 -05:00
wins_hide_subwin ( window ) ;
}
}
2012-07-24 18:19:48 -04:00
static void
2015-01-14 18:54:46 -05:00
_win_handle_switch ( const wint_t ch )
2012-03-10 15:46:30 -05:00
{
2015-01-14 18:54:46 -05:00
if ( ch = = KEY_F ( 1 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 1 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 2 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 2 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 3 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 3 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 4 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 4 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 5 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 5 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 6 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 6 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 7 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 7 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 8 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 8 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 9 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 9 ) ;
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_F ( 10 ) ) {
2013-08-31 18:00:46 -04:00
ui_switch_win ( 0 ) ;
2012-03-10 15:46:30 -05:00
}
}
2012-07-24 18:19:48 -04:00
static void
2015-01-14 18:54:46 -05:00
_win_handle_page ( const wint_t ch , const int result )
2012-03-10 15:46:30 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * current = wins_get_current ( ) ;
2012-09-10 17:57:42 -04:00
int rows = getmaxy ( stdscr ) ;
2014-12-15 20:39:47 -05:00
int y = getcury ( current - > layout - > win ) ;
2012-03-10 15:46:30 -05:00
int page_space = rows - 4 ;
2014-12-15 20:39:47 -05:00
int * page_start = & ( current - > layout - > y_pos ) ;
2012-10-21 15:02:20 -04:00
2013-02-02 21:35:04 -05:00
if ( prefs_get_boolean ( PREF_MOUSE ) ) {
2013-01-17 14:40:55 -05:00
MEVENT mouse_event ;
2012-11-19 20:53:30 -05:00
2015-01-14 18:54:46 -05:00
if ( ch = = KEY_MOUSE ) {
2013-01-17 14:40:55 -05:00
if ( getmouse ( & mouse_event ) = = OK ) {
2012-11-25 12:37:04 -05:00
# ifdef PLATFORM_CYGWIN
2013-01-17 14:40:55 -05:00
if ( mouse_event . bstate & BUTTON5_PRESSED ) { // mouse wheel down
2012-11-25 12:37:04 -05:00
# else
2013-01-17 14:40:55 -05:00
if ( mouse_event . bstate & BUTTON2_PRESSED ) { // mouse wheel down
2012-11-25 12:37:04 -05:00
# endif
2013-01-17 14:40:55 -05:00
* page_start + = 4 ;
2012-11-19 20:53:30 -05:00
2013-01-17 14:40:55 -05:00
// only got half a screen, show full screen
if ( ( y - ( * page_start ) ) < page_space )
* page_start = y - page_space ;
2012-11-19 20:53:30 -05:00
2013-01-17 14:40:55 -05:00
// went past end, show full screen
else if ( * page_start > = y )
* page_start = y - page_space ;
2012-11-19 20:53:30 -05:00
2014-12-15 20:39:47 -05:00
current - > layout - > paged = 1 ;
2014-04-06 16:06:50 -04:00
win_update_virtual ( current ) ;
2013-01-17 14:40:55 -05:00
} else if ( mouse_event . bstate & BUTTON4_PRESSED ) { // mouse wheel up
* page_start - = 4 ;
2012-11-19 20:53:30 -05:00
2013-01-17 14:40:55 -05:00
// went past beginning, show first page
if ( * page_start < 0 )
* page_start = 0 ;
2012-11-19 20:53:30 -05:00
2014-12-15 20:39:47 -05:00
current - > layout - > paged = 1 ;
2014-04-06 16:06:50 -04:00
win_update_virtual ( current ) ;
2013-01-17 14:40:55 -05:00
}
2012-11-19 20:53:30 -05:00
}
}
2013-01-17 14:40:55 -05:00
}
2012-11-19 20:53:30 -05:00
2012-03-10 15:46:30 -05:00
// page up
2015-01-14 18:54:46 -05:00
if ( ch = = KEY_PPAGE ) {
2012-03-10 15:46:30 -05:00
* page_start - = page_space ;
2012-10-21 15:02:20 -04:00
2012-03-10 15:46:30 -05:00
// went past beginning, show first page
if ( * page_start < 0 )
* page_start = 0 ;
2012-10-21 15:02:20 -04:00
2014-12-15 20:39:47 -05:00
current - > layout - > paged = 1 ;
2014-04-06 16:06:50 -04:00
win_update_virtual ( current ) ;
2012-03-10 15:46:30 -05:00
// page down
2015-01-14 18:54:46 -05:00
} else if ( ch = = KEY_NPAGE ) {
2012-03-10 15:46:30 -05:00
* page_start + = page_space ;
// only got half a screen, show full screen
if ( ( y - ( * page_start ) ) < page_space )
* page_start = y - page_space ;
// went past end, show full screen
else if ( * page_start > = y )
2014-08-31 18:46:13 -04:00
* page_start = y - page_space - 1 ;
2012-10-21 15:02:20 -04:00
2014-12-15 20:39:47 -05:00
current - > layout - > paged = 1 ;
2014-04-06 16:06:50 -04:00
win_update_virtual ( current ) ;
2012-03-10 15:46:30 -05:00
}
2014-03-31 16:44:34 -04:00
2014-08-31 18:46:13 -04:00
// switch off page if last line and space line visible
if ( ( y ) - * page_start = = page_space ) {
2014-12-15 20:39:47 -05:00
current - > layout - > paged = 0 ;
2014-03-31 16:44:34 -04:00
}
2014-10-07 16:12:19 -04:00
2014-12-16 16:08:48 -05:00
if ( current - > layout - > type = = LAYOUT_SPLIT ) {
ProfLayoutSplit * split_layout = ( ProfLayoutSplit * ) current - > layout ;
int sub_y = getcury ( split_layout - > subwin ) ;
int * sub_y_pos = & ( split_layout - > sub_y_pos ) ;
2014-12-09 19:54:46 -05:00
2014-10-07 16:12:19 -04:00
// alt up arrow
2015-01-14 18:54:46 -05:00
if ( ( result = = KEY_CODE_YES ) & & ( ( ch = = 565 ) | | ( ch = = 337 ) ) ) {
2014-12-09 19:54:46 -05:00
* sub_y_pos - = page_space ;
2014-10-07 16:12:19 -04:00
// went past beginning, show first page
2014-12-09 19:54:46 -05:00
if ( * sub_y_pos < 0 )
* sub_y_pos = 0 ;
2014-10-07 16:12:19 -04:00
win_update_virtual ( current ) ;
// alt down arrow
2015-01-14 18:54:46 -05:00
} else if ( ( result = = KEY_CODE_YES ) & & ( ( ch = = 524 ) | | ( ch = = 336 ) ) ) {
2014-12-09 19:54:46 -05:00
* sub_y_pos + = page_space ;
2014-10-07 16:12:19 -04:00
// only got half a screen, show full screen
2014-12-09 19:54:46 -05:00
if ( ( sub_y - ( * sub_y_pos ) ) < page_space )
* sub_y_pos = sub_y - page_space ;
2014-10-07 16:12:19 -04:00
// went past end, show full screen
2014-12-09 19:54:46 -05:00
else if ( * sub_y_pos > = sub_y )
* sub_y_pos = sub_y - page_space - 1 ;
2014-10-07 16:12:19 -04:00
win_update_virtual ( current ) ;
}
}
2012-03-10 15:46:30 -05:00
}
2012-09-23 15:52:47 -04:00
2012-10-14 17:36:29 -04:00
static void
2014-12-10 16:49:21 -05:00
_win_show_history ( int win_index , const char * const contact )
2012-10-14 17:36:29 -04:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_num ( win_index ) ;
2014-12-15 20:39:47 -05:00
if ( window - > type = = WIN_CHAT ) {
2014-12-21 19:01:43 -05:00
ProfChatWin * chatwin = ( ProfChatWin * ) window ;
assert ( chatwin - > memcheck = = PROFCHATWIN_MEMCHECK ) ;
if ( ! chatwin - > history_shown ) {
2014-12-15 20:39:47 -05:00
Jid * jid = jid_create ( jabber_get_fulljid ( ) ) ;
GSList * history = chat_log_get_previous ( jid - > barejid , contact ) ;
jid_destroy ( jid ) ;
GSList * curr = history ;
while ( curr ! = NULL ) {
char * line = curr - > data ;
// entry
if ( line [ 2 ] = = ' : ' ) {
char hh [ 3 ] ; memcpy ( hh , & line [ 0 ] , 2 ) ; hh [ 2 ] = ' \0 ' ; int ihh = atoi ( hh ) ;
char mm [ 3 ] ; memcpy ( mm , & line [ 3 ] , 2 ) ; mm [ 2 ] = ' \0 ' ; int imm = atoi ( mm ) ;
char ss [ 3 ] ; memcpy ( ss , & line [ 6 ] , 2 ) ; ss [ 2 ] = ' \0 ' ; int iss = atoi ( ss ) ;
GDateTime * time = g_date_time_new_local ( 2000 , 1 , 1 , ihh , imm , iss ) ;
GTimeVal tv ;
g_date_time_to_timeval ( time , & tv ) ;
win_save_print ( window , ' - ' , & tv , NO_COLOUR_DATE , 0 , " " , curr - > data + 11 ) ;
g_date_time_unref ( time ) ;
// header
} else {
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , curr - > data ) ;
}
curr = g_slist_next ( curr ) ;
2014-11-08 19:36:25 -05:00
}
2014-12-15 20:39:47 -05:00
chatwin - > history_shown = TRUE ;
2012-10-14 17:36:29 -04:00
2014-12-15 20:39:47 -05:00
g_slist_free_full ( history , free ) ;
}
2012-10-14 17:36:29 -04:00
}
}
2013-12-22 18:54:22 -05:00