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>
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 ;
2013-01-02 19:16:39 -05:00
static void _win_handle_switch ( const wint_t * const ch ) ;
2014-10-07 16:12:19 -04:00
static void _win_handle_page ( const wint_t * const ch , const int result ) ;
2012-10-21 15:02:20 -04:00
static void _win_show_history ( WINDOW * win , int win_index ,
2012-10-14 17:36:29 -04:00
const char * const contact ) ;
2014-04-05 19:47:14 -04:00
static void _ui_draw_term_title ( void ) ;
2014-11-12 18:19:07 -05:00
static void _ui_roster_contact ( PContact contact ) ;
2012-07-01 19:58:35 -04:00
2013-12-22 17:14:15 -05:00
static 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
}
2013-12-22 17:14:15 -05:00
static void
2014-09-01 14:14:52 -04:00
_ui_update ( void )
2012-02-12 20:25:47 -05:00
{
2014-09-01 14:14:52 -04:00
ProfWin * current = wins_get_current ( ) ;
if ( current - > paged = = 0 ) {
win_move_to_end ( current ) ;
}
2014-09-16 19:22:55 -04:00
win_update_virtual ( current ) ;
2014-04-03 16:46:43 -04:00
if ( prefs_get_boolean ( PREF_TITLEBAR ) ) {
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-04-07 16:12:30 -04:00
static void
_ui_about ( void )
{
cons_show ( " " ) ;
cons_about ( ) ;
}
2013-12-22 17:14:15 -05:00
static 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 ;
}
2013-12-22 17:14:15 -05:00
static 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
2013-12-22 17:14:15 -05:00
static 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-04-07 16:50:28 -04:00
static wint_t
2014-10-07 16:12:19 -04:00
_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-04-07 16:50:28 -04:00
if ( ch ! = ERR ) {
ui_reset_idle_time ( ) ;
}
return ch ;
}
static void
_ui_input_clear ( void )
{
inp_win_reset ( ) ;
}
static void
_ui_replace_input ( char * input , const char * const new_input , int * size )
{
inp_replace_input ( input , new_input , size ) ;
}
static void
_ui_input_nonblocking ( void )
{
inp_non_block ( ) ;
}
2013-12-22 17:14:15 -05:00
static void
_ui_resize ( const int ch , const char * const input , const int size )
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 ( ) ;
2012-04-22 15:59:36 -04:00
inp_win_resize ( input , size ) ;
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
}
2013-12-22 17:14:15 -05:00
static void
_ui_load_colours ( void )
2012-11-25 19:01:34 -05:00
{
if ( has_colors ( ) ) {
use_default_colors ( ) ;
start_color ( ) ;
theme_init_colours ( ) ;
}
}
2013-12-22 17:14:15 -05:00
static 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-04-15 08:16:32 -04:00
static gboolean
_ui_xmlconsole_exists ( void )
{
return wins_xmlconsole_exists ( ) ;
}
2014-04-14 20:08:41 -04:00
static void
_ui_handle_stanza ( const char * const msg )
{
2014-04-15 08:16:32 -04:00
if ( ui_xmlconsole_exists ( ) ) {
ProfWin * xmlconsole = wins_get_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-11-08 17:35:47 -05:00
win_save_print ( xmlconsole , ' - ' , NULL , 0 , 0 , " " , " SENT: " ) ;
win_save_print ( xmlconsole , ' - ' , NULL , 0 , COLOUR_ONLINE , " " , & msg [ 6 ] ) ;
win_save_print ( xmlconsole , ' - ' , NULL , 0 , COLOUR_ONLINE , " " , " " ) ;
2014-04-15 18:45:17 -04:00
} else if ( g_str_has_prefix ( msg , " RECV: " ) ) {
2014-11-08 17:35:47 -05:00
win_save_print ( xmlconsole , ' - ' , NULL , 0 , 0 , " " , " RECV: " ) ;
win_save_print ( xmlconsole , ' - ' , NULL , 0 , COLOUR_AWAY , " " , & msg [ 6 ] ) ;
win_save_print ( xmlconsole , ' - ' , NULL , 0 , COLOUR_AWAY , " " , " " ) ;
2014-04-15 18:45:17 -04:00
}
2014-04-14 20:08:41 -04:00
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_contact_typing ( const char * const barejid )
2012-11-25 19:01:34 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( 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
2013-08-20 18:08:21 -04:00
if ( window = = 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
2013-08-20 18:08:21 -04: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
// in chat window with user
} else {
title_bar_set_typing ( TRUE ) ;
2013-08-20 18:08:21 -04:00
int num = wins_get_num ( window ) ;
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 ;
if ( window ! = NULL ) {
is_current = wins_is_current ( window ) ;
}
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
}
2013-12-22 17:14:15 -05:00
static GSList *
_ui_get_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
}
2013-12-22 17:14:15 -05:00
static void
_ui_incoming_msg ( const char * const from , const char * const message ,
2012-11-13 19:04:08 -05:00
GTimeVal * tv_stamp , gboolean priv )
2012-02-26 13:26:38 -05:00
{
2013-04-27 17:02:20 -04:00
gboolean win_created = FALSE ;
2013-08-03 07:27:07 -04:00
char * display_from = NULL ;
2012-11-13 19:04:08 -05:00
win_type_t win_type ;
2013-08-03 07:27:07 -04:00
2012-11-13 19:04:08 -05:00
if ( priv ) {
win_type = WIN_PRIVATE ;
2013-01-11 20:44:21 -05:00
display_from = get_nick_from_full_jid ( from ) ;
2012-11-13 19:04:08 -05:00
} else {
win_type = WIN_CHAT ;
2013-05-19 12:19:16 -04:00
PContact contact = roster_get_contact ( from ) ;
if ( contact ! = NULL ) {
if ( p_contact_name ( contact ) ! = NULL ) {
display_from = strdup ( p_contact_name ( contact ) ) ;
} else {
display_from = strdup ( from ) ;
}
} else {
display_from = strdup ( from ) ;
}
2012-11-13 19:04:08 -05:00
}
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( from ) ;
if ( window = = NULL ) {
window = wins_new ( from , win_type ) ;
2014-01-11 16:44:24 -05:00
# ifdef HAVE_LIBOTR
if ( otr_is_secure ( from ) ) {
window - > is_otr = TRUE ;
}
# endif
2013-04-27 17:02:20 -04:00
win_created = TRUE ;
}
2012-02-29 19:34:54 -05:00
2013-08-20 18:08:21 -04:00
int num = wins_get_num ( window ) ;
2013-08-27 18:38:25 -04:00
// currently viewing chat window with sender
if ( wins_is_current ( window ) ) {
2014-01-08 15:11:53 -05:00
win_print_incoming_message ( window , tv_stamp , display_from , 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 ) ;
cons_show_incoming_message ( display_from , num ) ;
if ( prefs_get_boolean ( PREF_FLASH ) )
flash ( ) ;
window - > unread + + ;
if ( prefs_get_boolean ( PREF_CHLOG ) & & prefs_get_boolean ( PREF_HISTORY ) ) {
_win_show_history ( window - > win , num , from ) ;
}
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 ) ) {
PContact pcontact = roster_get_contact ( from ) ;
if ( pcontact ! = NULL ) {
2013-10-06 18:22:46 -04:00
win_show_contact ( window , pcontact ) ;
2013-10-06 14:16:20 -04:00
}
}
2014-01-08 15:11:53 -05:00
win_print_incoming_message ( window , tv_stamp , display_from , 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 ;
}
2013-02-02 21:35:04 -05:00
if ( prefs_get_boolean ( PREF_BEEP ) )
2012-04-23 20:24:54 -04:00
beep ( ) ;
2014-05-24 15:46:03 -04:00
if ( prefs_get_boolean ( PREF_NOTIFY_MESSAGE ) ) {
gboolean is_current = wins_is_current ( window ) ;
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
}
2013-12-22 17:14:15 -05:00
static 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 ) ;
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_roster_remove ( const char * const barejid )
2013-06-01 19:24:22 -04:00
{
cons_show ( " Roster item removed: %s " , barejid ) ;
}
2013-12-22 17:14:15 -05:00
static 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 ) ;
}
2013-12-22 17:14:15 -05:00
static 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 ) ;
2013-06-23 11:29:42 -04:00
}
2013-12-22 17:14:15 -05:00
static 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 ) ;
}
2013-12-22 17:14:15 -05:00
static 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-04-07 15:41:06 -04:00
static void
_ui_auto_away ( void )
{
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
}
static void
_ui_end_auto_away ( void )
{
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 ) ;
}
static void
_ui_titlebar_presence ( contact_presence_t presence )
{
title_bar_set_presence ( presence ) ;
}
static void
_ui_handle_login_account_success ( ProfAccount * account )
{
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 ( ) ;
}
static void
_ui_update_presence ( const resource_presence_t resource_presence ,
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-01-26 13:30:34 -05:00
static void
2014-01-26 17:50:22 -05:00
_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:50:22 -05:00
ProfWin * win = wins_get_by_recipient ( recipient ) ;
2014-01-26 13:30:34 -05:00
GString * msg = g_string_new ( " " ) ;
2014-01-26 17:19:22 -05:00
// no window for intended recipient, show message in current and console
if ( win = = NULL ) {
2014-01-26 17:50:22 -05:00
g_string_printf ( msg , " Recipient %s not found: %s " , recipient , err_msg ) ;
2014-01-26 17:19:22 -05:00
cons_show_error ( msg - > str ) ;
// intended recipient was invalid chat room
} else if ( win - > type = = WIN_MUC ) {
2014-01-26 17:50:22 -05:00
g_string_printf ( msg , " Room %s not found: %s " , recipient , err_msg ) ;
2014-01-26 17:19:22 -05:00
cons_show_error ( msg - > str ) ;
2014-06-21 04:16:50 -04:00
win_save_print ( win , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , msg - > str ) ;
2014-01-26 13:30:34 -05:00
// unknown chat recipient
} else {
2014-01-26 17:50:22 -05:00
g_string_printf ( msg , " Recipient %s not found: %s " , recipient , err_msg ) ;
2014-01-26 17:19:22 -05:00
cons_show_error ( msg - > str ) ;
2014-06-21 04:16:50 -04:00
win_save_print ( win , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , msg - > str ) ;
2014-01-26 13:30:34 -05:00
}
g_string_free ( msg , TRUE ) ;
}
2014-01-27 17:09:16 -05:00
static void
_ui_handle_recipient_error ( const char * const recipient , const char * const err_msg )
{
ProfWin * win = wins_get_by_recipient ( recipient ) ;
GString * msg = g_string_new ( " " ) ;
g_string_printf ( msg , " Error from %s: %s " , recipient , err_msg ) ;
// always show in console
cons_show_error ( msg - > str ) ;
// show in window if exists for recipient
if ( win ! = NULL ) {
2014-06-21 04:16:50 -04:00
win_save_print ( win , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , msg - > str ) ;
2014-01-27 17:09:16 -05:00
}
g_string_free ( msg , TRUE ) ;
}
static void
_ui_handle_error ( const char * const err_msg )
{
GString * msg = g_string_new ( " " ) ;
g_string_printf ( msg , " Error %s " , err_msg ) ;
cons_show_error ( msg - > str ) ;
g_string_free ( msg , TRUE ) ;
}
2014-04-09 17:05:31 -04:00
static void
_ui_invalid_command_usage ( const char * const usage , void ( * * setting_func ) ( void ) )
{
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 ) ;
}
}
}
2013-12-22 17:14:15 -05:00
static 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 ( ) ;
2012-10-18 11:18:44 -04:00
}
2013-12-22 17:14:15 -05:00
static void
2014-10-07 16:12:19 -04:00
_ui_handle_special_keys ( const wint_t * const ch , const int result , const char * const inp ,
2013-02-02 18:52:47 -05:00
const int size )
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 ) ;
2013-02-02 18:52:47 -05:00
if ( * ch = = KEY_RESIZE ) {
ui_resize ( * ch , inp , size ) ;
}
2012-11-25 19:57:41 -05:00
}
2013-12-22 17:14:15 -05:00
static void
_ui_close_connected_win ( int index )
2013-05-16 19:33:00 -04:00
{
win_type_t win_type = ui_win_type ( index ) ;
if ( win_type = = WIN_MUC ) {
char * room_jid = ui_recipient ( index ) ;
presence_leave_chat_room ( room_jid ) ;
} else if ( ( win_type = = WIN_CHAT ) | | ( win_type = = WIN_PRIVATE ) ) {
2014-01-11 18:28:11 -05:00
# ifdef HAVE_LIBOTR
ProfWin * window = wins_get_by_num ( index ) ;
if ( window - > is_otr ) {
otr_end_session ( window - > from ) ;
}
# endif
2013-05-16 19:33:00 -04:00
if ( prefs_get_boolean ( PREF_STATES ) ) {
char * recipient = ui_recipient ( index ) ;
// send <gone/> chat state before closing
if ( chat_session_get_recipient_supports ( recipient ) ) {
chat_session_set_gone ( recipient ) ;
message_send_gone ( recipient ) ;
chat_session_end ( recipient ) ;
}
}
}
}
2013-12-22 17:14:15 -05:00
static 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 ;
}
2013-12-22 17:14:15 -05:00
static 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-10-18 15:22:34 -04:00
static void
_ui_redraw_all_room_rosters ( void )
{
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 ) ;
if ( window - > type = = WIN_MUC & & window - > subwin ) {
char * room = window - > from ;
ui_muc_roster ( room ) ;
}
curr = g_list_next ( curr ) ;
}
g_list_free ( curr ) ;
g_list_free ( win_nums ) ;
}
2014-09-15 17:31:15 -04:00
static gboolean
_ui_win_has_unsaved_form ( int num )
{
ProfWin * window = wins_get_by_num ( num ) ;
if ( window - > type ! = WIN_MUC_CONFIG ) {
return FALSE ;
}
if ( window - > form = = NULL ) {
return FALSE ;
}
return window - > form - > modified ;
}
2014-01-11 13:06:46 -05:00
GString *
_get_recipient_string ( ProfWin * window )
{
GString * result = g_string_new ( " " ) ;
PContact contact = roster_get_contact ( window - > from ) ;
if ( contact ! = NULL ) {
if ( p_contact_name ( contact ) ! = NULL ) {
g_string_append ( result , p_contact_name ( contact ) ) ;
} else {
g_string_append ( result , window - > from ) ;
}
} else {
g_string_append ( result , window - > from ) ;
}
return result ;
}
2014-04-01 18:54:26 -04:00
static gboolean
2013-12-22 17:14:15 -05:00
_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 ) {
cmd_autocomplete_remove_form_fields ( old_current - > form ) ;
}
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 ) {
cmd_autocomplete_add_form_fields ( new_current - > form ) ;
}
2013-08-20 18:08:21 -04:00
wins_set_current_by_num ( i ) ;
2012-11-25 19:57:41 -05:00
2013-08-20 18:08:21 -04:00
new_current - > unread = 0 ;
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-01-11 13:06:46 -05:00
GString * recipient_str = _get_recipient_string ( new_current ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
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-10-18 17:43:47 -04:00
static void
_ui_previous_win ( void )
{
2014-10-18 18:16:19 -04:00
ProfWin * old_current = wins_get_current ( ) ;
if ( old_current - > type = = WIN_MUC_CONFIG ) {
cmd_autocomplete_remove_form_fields ( old_current - > form ) ;
}
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 ) {
cmd_autocomplete_add_form_fields ( new_current - > form ) ;
}
2014-10-18 17:43:47 -04:00
int i = wins_get_num ( new_current ) ;
wins_set_current_by_num ( i ) ;
new_current - > unread = 0 ;
if ( i = = 1 ) {
title_bar_console ( ) ;
status_bar_current ( 1 ) ;
status_bar_active ( 1 ) ;
} else {
GString * recipient_str = _get_recipient_string ( new_current ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
status_bar_current ( i ) ;
status_bar_active ( i ) ;
}
}
2013-12-22 17:14:15 -05:00
static 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 ) {
cmd_autocomplete_remove_form_fields ( old_current - > form ) ;
}
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 ) {
cmd_autocomplete_add_form_fields ( new_current - > form ) ;
}
2013-09-25 19:25:04 -04:00
int i = wins_get_num ( new_current ) ;
wins_set_current_by_num ( i ) ;
new_current - > unread = 0 ;
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-01-11 13:06:46 -05:00
GString * recipient_str = _get_recipient_string ( new_current ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
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-01-11 16:44:24 -05:00
static void
2014-01-11 20:20:22 -05:00
_ui_gone_secure ( const char * const recipient , gboolean trusted )
2014-01-11 16:44:24 -05:00
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
2014-04-18 19:03:11 -04:00
if ( window = = NULL ) {
window = wins_new ( recipient , WIN_CHAT ) ;
}
2014-01-11 16:44:24 -05:00
2014-04-18 19:03:11 -04:00
window - > is_otr = TRUE ;
window - > is_trusted = trusted ;
if ( trusted ) {
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , COLOUR_OTR_STARTED_TRUSTED , " " , " OTR session started (trusted). " ) ;
2014-04-18 19:03:11 -04:00
} else {
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , COLOUR_OTR_STARTED_UNTRUSTED , " " , " OTR session started (untrusted). " ) ;
2014-04-18 19:03:11 -04:00
}
if ( wins_is_current ( window ) ) {
GString * recipient_str = _get_recipient_string ( window ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
} 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 ;
}
cons_show ( " %s started an OTR session (%d). " , recipient , ui_index ) ;
cons_alert ( ) ;
2014-01-11 16:44:24 -05:00
}
}
2014-04-26 18:29:05 -04:00
static void
_ui_smp_recipient_initiated ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s wants to authenticate your identity, use '/otr secret <secret>'. " , recipient ) ;
2014-04-26 18:29:05 -04:00
}
}
2014-04-30 18:59:40 -04:00
static void
_ui_smp_recipient_initiated_q ( const char * const recipient , const char * question )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s wants to authenticate your identity with the following question: " , recipient ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , question ) ;
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " use '/otr answer <answer>'. " ) ;
2014-04-30 18:59:40 -04:00
}
}
2014-04-26 18:29:05 -04:00
static void
_ui_smp_unsuccessful_sender ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Authentication failed, the secret you entered does not match the secret entered by %s. " , recipient ) ;
2014-04-26 18:29:05 -04:00
}
}
static void
_ui_smp_unsuccessful_receiver ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Authentication failed, the secret entered by %s does not match yours. " , recipient ) ;
2014-04-26 18:29:05 -04:00
}
}
static void
_ui_smp_aborted ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " SMP session aborted. " ) ;
2014-04-26 20:17:38 -04:00
}
}
static void
_ui_smp_successful ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Authentication successful. " ) ;
2014-04-26 18:29:05 -04:00
}
}
2014-05-07 15:41:05 -04:00
static void
_ui_smp_answer_success ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s successfully authenticated you. " , recipient ) ;
2014-05-07 15:41:05 -04:00
}
}
static void
_ui_smp_answer_failure ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s failed to authenticate you. " , recipient ) ;
2014-05-07 15:41:05 -04:00
}
}
2014-01-11 18:28:11 -05:00
static void
_ui_gone_insecure ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window ! = NULL ) {
window - > is_otr = FALSE ;
2014-01-11 20:20:22 -05:00
window - > is_trusted = FALSE ;
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , COLOUR_OTR_ENDED , " " , " OTR session ended. " ) ;
2014-01-11 18:28:11 -05:00
if ( wins_is_current ( window ) ) {
GString * recipient_str = _get_recipient_string ( window ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
}
}
}
2014-01-11 20:20:22 -05:00
static void
_ui_trust ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window ! = NULL ) {
window - > is_otr = TRUE ;
window - > is_trusted = TRUE ;
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , COLOUR_OTR_TRUSTED , " " , " OTR session trusted. " ) ;
2014-01-11 20:20:22 -05:00
if ( wins_is_current ( window ) ) {
GString * recipient_str = _get_recipient_string ( window ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
}
}
}
static void
_ui_untrust ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window ! = NULL ) {
window - > is_otr = TRUE ;
window - > is_trusted = FALSE ;
2014-06-21 04:16:50 -04:00
win_save_print ( window , ' ! ' , NULL , 0 , COLOUR_OTR_UNTRUSTED , " " , " OTR session untrusted. " ) ;
2014-01-11 20:20:22 -05:00
if ( wins_is_current ( window ) ) {
GString * recipient_str = _get_recipient_string ( window ) ;
title_bar_set_recipient ( recipient_str - > str ) ;
g_string_free ( recipient_str , TRUE ) ;
}
}
}
2013-12-22 17:14:15 -05:00
static 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
}
2013-12-22 17:14:15 -05:00
static void
_ui_close_current ( void )
2012-11-25 19:57:41 -05:00
{
2013-08-20 18:08:21 -04:00
int current_index = wins_get_current_num ( ) ;
2012-11-25 19:57:41 -05:00
status_bar_inactive ( current_index ) ;
2013-08-29 19:49:38 -04:00
wins_close_current ( ) ;
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
}
2013-12-22 17:14:15 -05:00
static 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 ) ;
if ( window ) {
if ( window - > type = = WIN_MUC_CONFIG & & window - > form ) {
cmd_autocomplete_remove_form_fields ( window - > form ) ;
}
}
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
}
2013-12-22 17:14:15 -05:00
static 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. " ) ;
}
}
2013-12-22 17:14:15 -05:00
static 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 ;
2013-08-20 18:08:21 -04:00
GSList * recipients = wins_get_prune_recipients ( ) ;
if ( recipients ! = NULL ) {
pruned = TRUE ;
}
GSList * curr = recipients ;
while ( curr ! = NULL ) {
char * recipient = curr - > data ;
if ( conn_status = = JABBER_CONNECTED ) {
if ( prefs_get_boolean ( PREF_STATES ) ) {
// send <gone/> chat state before closing
if ( chat_session_get_recipient_supports ( recipient ) ) {
chat_session_set_gone ( recipient ) ;
message_send_gone ( recipient ) ;
chat_session_end ( recipient ) ;
2013-05-22 18:48:24 -04:00
}
2013-05-16 19:33:00 -04:00
}
}
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( recipient ) ;
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
curr = g_slist_next ( curr ) ;
}
if ( recipients ! = NULL ) {
g_slist_free ( recipients ) ;
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-04-24 16:50:59 -04:00
static gboolean
_ui_swap_wins ( int source_win , int target_win )
{
return wins_swap ( source_win , target_win ) ;
}
2013-12-22 17:14:15 -05:00
static 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-01-11 12:03:01 -05:00
static gboolean
_ui_current_win_is_otr ( void )
{
ProfWin * current = wins_get_current ( ) ;
return current - > is_otr ;
}
static void
_ui_current_set_otr ( gboolean value )
{
ProfWin * current = wins_get_current ( ) ;
current - > is_otr = value ;
}
2014-04-30 17:41:53 -04:00
static void
_ui_otr_authenticating ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Authenticating %s... " , recipient ) ;
2014-04-30 17:41:53 -04:00
}
}
static void
_ui_otr_authetication_waiting ( const char * const recipient )
{
ProfWin * window = wins_get_by_recipient ( recipient ) ;
if ( window = = NULL ) {
return ;
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Awaiting authentication from %s... " , recipient ) ;
2014-04-30 17:41:53 -04:00
}
}
2013-12-22 17:14:15 -05:00
static 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
}
2013-12-22 17:14:15 -05:00
static 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
}
2013-12-22 17:14:15 -05:00
static char *
_ui_recipient ( 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 - > from ;
2013-05-12 17:57:36 -04:00
}
2013-12-22 17:14:15 -05:00
static char *
_ui_current_recipient ( void )
2012-11-25 19:57:41 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * current = wins_get_current ( ) ;
return current - > from ;
2012-11-25 19:57:41 -05:00
}
2013-12-22 17:14:15 -05:00
static 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-01-16 18:16:37 -05:00
static void
_ui_current_print_formatted_line ( const char show_char , int attrs , const char * const msg , . . . )
{
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 ) ;
}
2013-12-22 17:14:15 -05:00
static 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-06-21 04:16:50 -04:00
win_save_print ( current , ' - ' , NULL , 0 , COLOUR_ERROR , " " , msg ) ;
2012-11-25 19:57:41 -05:00
}
2013-12-22 17:14:15 -05:00
static void
_ui_print_system_msg_from_recipient ( const char * const from , const char * message )
2012-11-11 07:00:21 -05:00
{
if ( from = = NULL | | message = = NULL )
return ;
2014-04-02 16:01:20 -04:00
Jid * jid = jid_create ( from ) ;
2012-11-11 07:00:21 -05:00
2014-04-02 16:01:20 -04:00
ProfWin * window = wins_get_by_recipient ( jid - > barejid ) ;
2013-08-20 18:08:21 -04:00
if ( window = = NULL ) {
2014-04-25 19:36:36 -04:00
int num = 0 ;
2014-04-02 16:01:20 -04:00
window = wins_new ( jid - > barejid , WIN_CHAT ) ;
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-06-21 04:16:50 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " *%s %s " , jid - > barejid , message ) ;
2012-11-11 07:00:21 -05:00
2014-04-02 16:01:20 -04:00
jid_destroy ( jid ) ;
2012-11-11 07:00:21 -05:00
}
2013-12-22 17:14:15 -05:00
static void
_ui_recipient_gone ( const char * const barejid )
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 ;
2012-10-21 15:02:20 -04:00
2013-05-20 17:51:35 -04:00
const char * display_usr = NULL ;
2014-08-19 16:22:43 -04:00
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 ;
}
2013-05-20 17:51:35 -04:00
} else {
display_usr = barejid ;
}
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( barejid ) ;
if ( window ! = NULL ) {
2014-06-21 04:16:50 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_GONE , " " , " <- %s has left the conversation. " , display_usr ) ;
2012-11-25 19:57:41 -05:00
}
2012-06-28 18:29:46 -04:00
}
2013-12-22 17:14:15 -05:00
static void
_ui_new_chat_win ( const char * const to )
2012-11-29 19:19:03 -05:00
{
// if the contact is offline, show a message
2013-05-06 17:32:58 -04:00
PContact contact = roster_get_contact ( to ) ;
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( to ) ;
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 ) {
2013-01-21 17:46:33 -05:00
Jid * jid = jid_create ( to ) ;
2014-09-28 17:09:20 -04:00
if ( muc_active ( jid - > barejid ) ) {
2013-08-20 18:08:21 -04:00
window = wins_new ( to , WIN_PRIVATE ) ;
2013-01-21 17:46:33 -05:00
} else {
2013-08-20 18:08:21 -04:00
window = wins_new ( to , WIN_CHAT ) ;
2013-01-21 17:46:33 -05:00
}
jid_destroy ( jid ) ;
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 ) ) {
2013-08-20 18:08:21 -04:00
_win_show_history ( window - > win , num , to ) ;
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 ) ;
2013-10-06 18:52:50 -04:00
win_show_status_string ( window , to , 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-04-15 08:16:32 -04:00
static void
_ui_create_xmlconsole_win ( void )
{
ProfWin * window = wins_new ( " XML Console " , WIN_XML ) ;
int num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
}
2014-04-24 19:04:01 -04:00
static void
_ui_open_xmlconsole_win ( void )
{
ProfWin * window = wins_get_by_recipient ( " XML Console " ) ;
if ( window ! = NULL ) {
int num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_outgoing_msg ( const char * const from , const char * const to ,
2012-03-08 20:06:55 -05:00
const char * const message )
2012-02-06 19:37:42 -05:00
{
2013-05-06 17:32:58 -04:00
PContact contact = roster_get_contact ( to ) ;
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( to ) ;
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 ) {
2013-01-12 22:14:36 -05:00
Jid * jid = jid_create ( to ) ;
2012-11-13 19:39:34 -05:00
2014-09-28 17:09:20 -04:00
if ( muc_active ( jid - > barejid ) ) {
2013-08-20 18:08:21 -04:00
window = wins_new ( to , WIN_PRIVATE ) ;
2012-11-13 19:39:34 -05:00
} else {
2013-08-20 18:08:21 -04:00
window = wins_new ( to , WIN_CHAT ) ;
2014-01-11 16:44:24 -05:00
# ifdef HAVE_LIBOTR
if ( otr_is_secure ( to ) ) {
window - > is_otr = TRUE ;
}
# endif
2012-11-13 19:39:34 -05:00
}
2013-01-12 22:14:36 -05:00
jid_destroy ( jid ) ;
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 ) ) {
2013-08-20 18:08:21 -04:00
_win_show_history ( window - > win , num , to ) ;
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 ) ;
2013-10-06 18:52:50 -04:00
win_show_status_string ( window , to , 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
}
2012-10-17 05:55:48 -04:00
2014-11-07 15:54:55 -05:00
win_save_print ( window , ' - ' , NULL , 0 , COLOUR_TEXT_ME , from , message ) ;
2014-09-01 16:30:31 -04:00
ui_switch_win ( num ) ;
2012-02-06 19:37:42 -05:00
}
2013-12-22 17:14:15 -05:00
static void
2014-04-20 19:37:04 -04:00
_ui_room_join ( const char * const room , gboolean focus )
2012-11-05 16:36:32 -05:00
{
2014-03-08 16:10:23 -05:00
ProfWin * window = wins_get_by_recipient ( room ) ;
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-03-08 16:10:23 -05:00
window = wins_new ( room , WIN_MUC ) ;
2012-11-05 16:36:32 -05:00
}
2014-10-11 21:10:46 -04:00
char * nick = muc_nick ( room ) ;
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " -> You have joined the room as %s " , nick ) ;
2014-10-18 15:22:34 -04:00
if ( prefs_get_boolean ( PREF_MUC_PRIVILEGES ) ) {
char * role = muc_role_str ( room ) ;
char * affiliation = muc_affiliation_str ( room ) ;
if ( role ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , role: %s " , role ) ;
}
if ( affiliation ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , affiliation: %s " , affiliation ) ;
}
2014-10-11 21:10:46 -04:00
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
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-09-28 17:09:20 -04:00
char * nick = muc_nick ( room ) ;
2014-07-09 08:24:32 -04:00
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " -> Autojoined %s as %s (%d). " , room , nick , num ) ;
2014-04-12 21:52:25 -04:00
}
2012-11-05 16:36:32 -05:00
}
2014-10-17 19:40:44 -04:00
static void
_ui_switch_to_room ( const char * const room )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
int num = wins_get_num ( window ) ;
num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
}
2014-10-11 21:10:46 -04:00
static void
2014-10-17 20:37:52 -04:00
_ui_room_role_change ( const char * const room , const char * const role , const char * const actor ,
const char * const reason )
2014-10-11 21:10:46 -04:00
{
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-10-17 20:37:52 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " Your role has been changed to: %s " , role ) ;
if ( actor ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , by: %s " , actor ) ;
}
if ( reason ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , reason: %s " , reason ) ;
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
2014-10-11 21:10:46 -04:00
}
static void
2014-10-17 20:37:52 -04:00
_ui_room_affiliation_change ( const char * const room , const char * const affiliation , const char * const actor ,
const char * const reason )
2014-10-11 21:10:46 -04:00
{
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-10-17 20:37:52 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " Your affiliation has been changed to: %s " , affiliation ) ;
if ( actor ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , by: %s " , actor ) ;
}
if ( reason ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , reason: %s " , reason ) ;
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
2014-10-11 21:10:46 -04:00
}
2014-10-17 20:07:25 -04:00
static void
2014-10-17 20:37:52 -04:00
_ui_room_role_and_affiliation_change ( const char * const room , const char * const role , const char * const affiliation ,
const char * const actor , const char * const reason )
2014-10-17 20:07:25 -04:00
{
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-10-17 20:37:52 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " Your role and affiliation have been changed, role: %s, affiliation: %s " , role , affiliation ) ;
if ( actor ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , by: %s " , actor ) ;
}
if ( reason ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , reason: %s " , reason ) ;
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
2014-10-17 20:07:25 -04:00
}
2014-10-18 14:10:50 -04:00
static void
_ui_room_occupant_role_change ( const char * const room , const char * const nick , const char * const role ,
const char * const actor , const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " %s's role has been changed to: %s " , nick , role ) ;
if ( actor ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , by: %s " , actor ) ;
}
if ( reason ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , reason: %s " , reason ) ;
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
}
static void
_ui_room_occupant_affiliation_change ( const char * const room , const char * const nick , const char * const affiliation ,
const char * const actor , const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " %s's affiliation has been changed to: %s " , nick , affiliation ) ;
if ( actor ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , by: %s " , actor ) ;
}
if ( reason ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , reason: %s " , reason ) ;
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
}
static void
_ui_room_occupant_role_and_affiliation_change ( const char * const room , const char * const nick , const char * const role ,
const char * const affiliation , const char * const actor , const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " %s's role and affiliation have been changed, role: %s, affiliation: %s " , nick , role , affiliation ) ;
if ( actor ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , by: %s " , actor ) ;
}
if ( reason ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ROOMINFO , " " , " , reason: %s " , reason ) ;
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
}
2014-10-02 18:37:10 -04:00
static void
_ui_handle_room_info_error ( const char * const room , const char * const error )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Room info request failed: %s " , error ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
}
}
static void
_ui_show_room_disco_info ( const char * const room , GSList * identities , GSList * features )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
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
}
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_roster ( const char * const room , GList * roster , const char * const presence )
2012-11-05 16:36:32 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received room roster but no window open for %s. " , room ) ;
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 ) {
win_save_print ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " , " Room is empty. " ) ;
} else {
2014-09-29 19:16:01 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_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-09-29 19:16:01 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " %d occupants: " , length ) ;
2014-08-20 16:30:10 -04:00
} else {
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " %d %s: " , length , presence ) ;
}
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-09-29 19:16:01 -04:00
int presence_colour = win_presence_colour ( presence_str ) ;
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-08-20 16:30:10 -04:00
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_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-04-20 19:37:04 -04:00
static void
_ui_handle_room_join_error ( const char * const room , const char * const err )
{
cons_show_error ( " Error joining room %s, reason: %s " , room , err ) ;
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_member_offline ( const char * const room , const char * const nick )
2012-11-07 19:05:32 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received offline presence for room participant %s, but no window open for %s. " , nick , room ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_OFFLINE , " " , " <- %s has left the room. " , nick ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-07 19:05:32 -05:00
}
2014-10-05 15:52:34 -04:00
static void
_ui_room_member_kicked ( const char * const room , const char * const nick , const char * const actor ,
const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window = = NULL ) {
log_error ( " Received kick for room participant %s, but no window open for %s. " , nick , room ) ;
} 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 ) ;
}
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_OFFLINE , " " , " <- %s " , message - > str ) ;
g_string_free ( message , TRUE ) ;
}
}
2014-10-06 17:59:25 -04:00
static void
_ui_room_member_banned ( const char * const room , const char * const nick , const char * const actor ,
const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window = = NULL ) {
log_error ( " Received ban for room participant %s, but no window open for %s. " , nick , room ) ;
} 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 ) ;
}
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_OFFLINE , " " , " <- %s " , message - > str ) ;
g_string_free ( message , TRUE ) ;
}
}
2014-10-05 15:52:34 -04:00
2013-12-22 17:14:15 -05:00
static void
2014-10-17 19:52:42 -04:00
_ui_room_member_online ( const char * const room , const char * const nick , const char * const role ,
const char * const affiliation , const char * const show , const char * const status )
2012-11-07 19:05:32 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received online presence for room participant %s, but no window open for %s. " , nick , room ) ;
} else {
2014-10-17 19:52:42 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ONLINE , " " , " -> %s has joined the room " , nick ) ;
2014-10-18 15:22:34 -04:00
if ( prefs_get_boolean ( PREF_MUC_PRIVILEGES ) ) {
if ( role ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ONLINE , " " , " , role: %s " , role ) ;
}
if ( affiliation ) {
win_save_vprint ( window , ' ! ' , NULL , NO_DATE | NO_EOL , COLOUR_ONLINE , " " , " , affiliation: %s " , affiliation ) ;
}
2014-10-17 19:52:42 -04:00
}
win_save_print ( window , ' ! ' , NULL , NO_DATE , COLOUR_ROOMINFO , " " , " " ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-07 19:05:32 -05:00
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_member_presence ( const char * const room , const char * const nick ,
2012-11-18 19:26:31 -05:00
const char * const show , const char * const status )
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received presence for room participant %s, but no window open for %s. " , nick , room ) ;
} 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
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_member_nick_change ( const char * const room ,
2012-11-18 16:46:58 -05:00
const char * const old_nick , const char * const nick )
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received nick change for room participant %s, but no window open for %s. " , old_nick , room ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_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
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_nick_change ( const char * const room , const char * const nick )
2012-11-18 17:49:01 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received self nick change %s, but no window open for %s. " , nick , room ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ME , " " , " ** You are now known as %s " , nick ) ;
2013-08-20 18:08:21 -04:00
}
2012-11-18 16:46:58 -05:00
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_history ( const char * const room_jid , const char * const nick ,
2012-11-05 17:21:03 -05:00
GTimeVal tv_stamp , const char * const message )
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room_jid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Room history message received from %s, but no window open for %s " , nick , room_jid ) ;
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 ) ;
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
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_message ( const char * const room_jid , const char * const nick ,
2012-11-05 17:28:06 -05:00
const char * const message )
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room_jid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Room message received from %s, but no window open for %s " , nick , room_jid ) ;
2012-11-05 17:49:40 -05:00
} else {
2014-08-20 16:30:10 -04:00
int num = wins_get_num ( window ) ;
2014-09-28 17:09:20 -04:00
char * my_nick = muc_nick ( room_jid ) ;
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 ) {
win_save_print ( window , ' - ' , NULL , NO_ME , COLOUR_ROOMMENTION , nick , message ) ;
} else {
2014-11-07 16:05:51 -05:00
win_save_print ( window , ' - ' , NULL , NO_ME , COLOUR_TEXT_THEM , nick , message ) ;
2012-11-05 18:24:29 -05:00
}
2014-08-20 16:30:10 -04:00
} else {
2014-11-07 16:05:51 -05:00
win_save_print ( window , ' - ' , NULL , 0 , COLOUR_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 ( ) ;
}
}
window - > 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-09-28 17:09:20 -04:00
if ( strcmp ( nick , muc_nick ( room_jid ) ) ! = 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 ) ) ) {
Jid * jidp = jid_create ( room_jid ) ;
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-09-02 19:23:04 -04:00
static void
_ui_room_requires_config ( const char * const room_jid )
{
ProfWin * window = wins_get_by_recipient ( room_jid ) ;
if ( window = = NULL ) {
log_error ( " Received room config request, but no window open for %s. " , room_jid ) ;
} 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-09-04 17:29:57 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " ,
2014-10-23 18:58:25 -04:00
" Room locked, requires configuration. " ) ;
2014-09-17 19:15:32 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " ,
" Use '/room accept' to accept the defaults " ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " ,
" Use '/room destroy' to cancel and destroy the room " ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " ,
" 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
}
}
static void
2014-10-05 15:52:34 -04:00
_ui_room_destroy ( const char * const room_jid )
2014-09-03 17:00:08 -04:00
{
ProfWin * window = wins_get_by_recipient ( room_jid ) ;
if ( window = = NULL ) {
log_error ( " Received room destroy result, but no window open for %s. " , room_jid ) ;
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
cons_show ( " Room destroyed: %s " , room_jid ) ;
2014-09-02 19:23:04 -04:00
}
}
2014-10-05 15:52:34 -04:00
static void
_ui_leave_room ( const char * const room )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window ) {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
}
}
static void
_ui_room_destroyed ( const char * const room , const char * const reason , const char * const new_jid ,
const char * const password )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window = = NULL ) {
log_error ( " Received room destroy, but no window open for %s. " , room ) ;
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
ProfWin * console = wins_get_console ( ) ;
if ( reason ) {
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " <- Room destroyed: %s, reason: %s " , room , reason ) ;
} else {
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " <- Room destroyed: %s " , room ) ;
}
if ( new_jid ) {
if ( password ) {
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " Replacement room: %s, password: %s " , new_jid , password ) ;
} else {
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " Replacement room: %s " , new_jid ) ;
}
}
}
}
static void
_ui_room_kicked ( const char * const room , const char * const actor , const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window = = NULL ) {
log_error ( " Received kick, but no window open for %s. " , room ) ;
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
GString * message = g_string_new ( " Kicked from " ) ;
g_string_append ( message , 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 ) ;
}
ProfWin * console = wins_get_console ( ) ;
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " <- %s " , message - > str ) ;
g_string_free ( message , TRUE ) ;
}
}
2014-10-06 17:59:25 -04:00
static void
_ui_room_banned ( const char * const room , const char * const actor , const char * const reason )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window = = NULL ) {
log_error ( " Received ban, but no window open for %s. " , room ) ;
} else {
int num = wins_get_num ( window ) ;
ui_close_win ( num ) ;
GString * message = g_string_new ( " Banned from " ) ;
g_string_append ( message , 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 ) ;
}
ProfWin * console = wins_get_console ( ) ;
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_TYPING , " " , " <- %s " , message - > str ) ;
g_string_free ( message , TRUE ) ;
}
}
2013-12-22 17:14:15 -05:00
static void
2014-10-04 22:05:46 -04:00
_ui_room_subject ( const char * const room , const char * const nick , const char * const subject )
2012-11-09 22:30:27 -05:00
{
2014-10-04 22:05:46 -04:00
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
2014-10-04 22:05:46 -04:00
log_error ( " Received room subject, but no window open for %s. " , room ) ;
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 ) {
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " *%s has set the room subject: " , nick ) ;
win_save_vprint ( window , ' ! ' , NULL , NO_DATE , 0 , " " , " %s " , subject ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " Room subject: " ) ;
win_save_vprint ( window , ' ! ' , NULL , NO_DATE , 0 , " " , " %s " , subject ) ;
}
} else {
if ( nick ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " , " *%s has cleared the room subject: " , nick ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " , " Room subject cleared " ) ;
}
}
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-10-04 22:52:55 -04:00
static void
_ui_handle_room_kick_error ( const char * const room , const char * const nick , const char * const error )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window = = NULL ) {
log_error ( " Kick error received for %s, but no window open for %s. " , nick , room ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Error kicking %s: %s " , nick , error ) ;
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_room_broadcast ( const char * const room_jid , const char * const message )
2012-11-19 17:15:53 -05:00
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_recipient ( room_jid ) ;
2014-08-20 16:30:10 -04:00
if ( window = = NULL ) {
log_error ( " Received room broadcast, but no window open for %s. " , room_jid ) ;
} else {
int num = wins_get_num ( window ) ;
2012-11-19 17:15:53 -05:00
2014-08-20 16:30:10 -04:00
win_save_vprint ( window , ' ! ' , NULL , NO_EOL , COLOUR_ROOMINFO , " " , " Room message: " ) ;
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-10-04 20:39:48 -04:00
static void
_ui_handle_room_affiliation_list_error ( const char * const room , const char * const affiliation ,
const char * const error )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Error retrieving %s list: %s " , affiliation , error ) ;
}
}
static void
_ui_handle_room_affiliation_list ( const char * const room , const char * const affiliation , GSList * jids )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
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-10-06 16:42:09 -04:00
static void
_ui_handle_room_role_list_error ( const char * const room , const char * const role , const char * const error )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Error retrieving %s list: %s " , role , error ) ;
}
}
static void
_ui_handle_room_role_list ( const char * const room , const char * const role , GSList * nicks )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
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 ;
Occupant * occupant = muc_roster_item ( room , nick ) ;
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-10-04 20:39:48 -04:00
static void
_ui_handle_room_affiliation_set_error ( const char * const room , const char * const jid , const char * const affiliation ,
const char * const error )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Error setting %s affiliation for %s: %s " , affiliation , jid , error ) ;
}
}
2014-10-06 16:42:09 -04:00
static void
_ui_handle_room_role_set_error ( const char * const room , const char * const nick , const char * const role ,
const char * const error )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Error setting %s role for %s: %s " , role , nick , error ) ;
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_status ( void )
2013-01-17 17:46:50 -05:00
{
2013-04-21 14:44:31 -04:00
char * recipient = ui_current_recipient ( ) ;
2013-05-06 17:32:58 -04:00
PContact pcontact = roster_get_contact ( recipient ) ;
2014-07-20 19:18:37 -04:00
ProfWin * window = wins_get_current ( ) ;
2013-01-17 17:46:50 -05:00
if ( pcontact ! = NULL ) {
2014-07-20 19:18:37 -04:00
win_show_contact ( window , pcontact ) ;
2013-01-17 17:46:50 -05:00
} else {
2014-07-20 19:18:37 -04:00
win_save_println ( window , " Error getting contact info. " ) ;
2013-01-17 17:46:50 -05:00
}
}
2014-06-03 16:35:27 -04:00
static void
_ui_info ( void )
{
char * recipient = ui_current_recipient ( ) ;
PContact pcontact = roster_get_contact ( recipient ) ;
2014-07-20 19:18:37 -04:00
ProfWin * window = wins_get_current ( ) ;
2014-06-03 16:35:27 -04:00
if ( pcontact ! = NULL ) {
2014-07-20 19:18:37 -04:00
win_show_info ( window , pcontact ) ;
2014-06-03 16:35:27 -04:00
} else {
2014-07-20 19:18:37 -04:00
win_save_println ( window , " Error getting contact info. " ) ;
2014-06-03 16:35:27 -04:00
}
}
2013-12-22 17:14:15 -05:00
static void
_ui_status_private ( void )
2013-01-17 17:46:50 -05:00
{
2013-04-21 14:44:31 -04:00
Jid * jid = jid_create ( ui_current_recipient ( ) ) ;
2014-09-29 19:16:01 -04:00
Occupant * occupant = muc_roster_item ( jid - > barejid , jid - > resourcepart ) ;
2014-07-20 19:18:37 -04:00
ProfWin * window = wins_get_current ( ) ;
2013-01-17 17:46:50 -05:00
2014-09-29 19:16:01 -04:00
if ( occupant ) {
win_show_occupant ( window , occupant ) ;
2013-01-17 17:46:50 -05:00
} else {
2014-07-20 19:18:37 -04:00
win_save_println ( window , " Error getting contact info. " ) ;
2013-01-17 17:46:50 -05:00
}
jid_destroy ( jid ) ;
}
2014-06-03 16:35:27 -04:00
static void
_ui_info_private ( void )
{
Jid * jid = jid_create ( ui_current_recipient ( ) ) ;
2014-09-29 19:16:01 -04:00
Occupant * occupant = muc_roster_item ( jid - > barejid , jid - > resourcepart ) ;
2014-07-20 19:18:37 -04:00
ProfWin * window = wins_get_current ( ) ;
2014-06-03 16:35:27 -04:00
2014-09-29 19:16:01 -04:00
if ( occupant ) {
win_show_occupant_info ( window , jid - > barejid , occupant ) ;
2014-06-03 16:35:27 -04:00
} else {
2014-07-20 19:18:37 -04:00
win_save_println ( window , " Error getting contact info. " ) ;
2014-06-03 16:35:27 -04:00
}
jid_destroy ( jid ) ;
}
2013-12-22 17:14:15 -05:00
static void
_ui_status_room ( const char * const contact )
2013-01-14 19:02:23 -05:00
{
2014-09-29 19:16:01 -04:00
Occupant * occupant = muc_roster_item ( ui_current_recipient ( ) , contact ) ;
2013-08-20 18:08:21 -04:00
ProfWin * current = wins_get_current ( ) ;
2013-01-14 19:02:23 -05:00
2014-09-29 19:16:01 -04:00
if ( occupant ) {
win_show_occupant ( current , occupant ) ;
2013-01-14 19:02:23 -05:00
} else {
2014-06-21 04:16:50 -04:00
win_save_vprint ( current , ' - ' , NULL , 0 , 0 , " " , " No such participant \" %s \" in room. " , contact ) ;
2013-01-14 19:02:23 -05:00
}
}
2014-06-03 16:20:13 -04:00
2014-06-03 16:14:21 -04:00
static void
2014-09-29 19:16:01 -04:00
_ui_info_room ( const char * const room , Occupant * occupant )
2014-06-03 16:14:21 -04:00
{
ProfWin * current = wins_get_current ( ) ;
2014-09-29 19:16:01 -04:00
win_show_occupant_info ( current , room , occupant ) ;
2014-06-03 16:14:21 -04:00
}
2014-06-03 16:20:13 -04:00
2013-12-22 17:14:15 -05:00
static 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
}
2013-12-22 17:14:15 -05:00
static 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 ) {
return window - > unread ;
2013-05-16 17:34:05 -04:00
} else {
return 0 ;
}
}
2013-12-22 17:14:15 -05:00
static 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 ) ;
inp_non_block ( ) ;
return passwd ;
}
2014-01-19 13:31:02 -05:00
static void
_ui_chat_win_contact_online ( PContact contact , Resource * resource , GDateTime * last_activity )
{
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 ) ;
ProfWin * window = wins_get_by_recipient ( barejid ) ;
if ( window ! = NULL ) {
win_show_status_string ( window , display_str , show , resource - > status ,
last_activity , " ++ " , " online " ) ;
}
free ( display_str ) ;
}
static void
_ui_chat_win_contact_offline ( PContact contact , char * resource , char * status )
{
char * display_str = p_contact_create_display_string ( contact , resource ) ;
const char * barejid = p_contact_barejid ( contact ) ;
ProfWin * window = wins_get_by_recipient ( barejid ) ;
if ( window ! = NULL ) {
win_show_status_string ( window , display_str , " offline " , status , NULL , " -- " ,
" offline " ) ;
}
free ( display_str ) ;
}
2014-04-03 16:13:59 -04:00
static void
_ui_clear_win_title ( void )
{
2014-04-03 16:46:43 -04:00
printf ( " %c]0;%c " , ' \033 ' , ' \007 ' ) ;
2014-04-03 16:13:59 -04:00
}
2014-04-07 16:12:30 -04:00
static void
_ui_statusbar_new ( const int win )
{
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 ) ,
2014-04-03 16:46:43 -04:00
" %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 ) ,
2014-04-03 16:46:43 -04:00
" %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 {
2014-04-03 16:46:43 -04:00
snprintf ( new_win_title , sizeof ( new_win_title ) , " %c]0;%s%c " , ' \033 ' ,
" 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
printf ( " %s " , new_win_title ) ;
if ( win_title ! = NULL ) {
free ( win_title ) ;
}
win_title = strdup ( new_win_title ) ;
}
}
2014-09-30 18:08:48 -04:00
static void
_ui_show_room_info ( ProfWin * window , const char * const room )
{
char * role = muc_role_str ( room ) ;
char * affiliation = muc_affiliation_str ( room ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Room: %s " , room ) ;
2014-10-02 18:52:17 -04:00
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Affiliation: %s " , affiliation ) ;
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " Role: %s " , role ) ;
2014-09-30 18:08:48 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
}
2014-09-30 19:27:25 -04:00
static void
_ui_show_room_role_list ( ProfWin * window , const char * const room , muc_role_t role )
{
GSList * occupants = muc_occupants_by_role ( room , role ) ;
if ( ! occupants ) {
switch ( role ) {
case MUC_ROLE_MODERATOR :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No moderators found. " ) ;
break ;
case MUC_ROLE_PARTICIPANT :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No participants found. " ) ;
break ;
case MUC_ROLE_VISITOR :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No visitors found. " ) ;
break ;
default :
break ;
}
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
} else {
switch ( role ) {
case MUC_ROLE_MODERATOR :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Moderators: " ) ;
break ;
case MUC_ROLE_PARTICIPANT :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Participants: " ) ;
break ;
case MUC_ROLE_VISITOR :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Visitors: " ) ;
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 ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s (%s) " , occupant - > nick , occupant - > jid ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , occupant - > nick ) ;
}
2014-09-30 19:27:25 -04:00
}
curr_occupant = g_slist_next ( curr_occupant ) ;
}
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
}
}
2014-09-30 19:46:58 -04:00
static void
_ui_show_room_affiliation_list ( ProfWin * window , const char * const room , muc_affiliation_t affiliation )
{
GSList * occupants = muc_occupants_by_affiliation ( room , affiliation ) ;
if ( ! occupants ) {
switch ( affiliation ) {
case MUC_AFFILIATION_OWNER :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No owners found. " ) ;
break ;
case MUC_AFFILIATION_ADMIN :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No admins found. " ) ;
break ;
case MUC_AFFILIATION_MEMBER :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No members found. " ) ;
break ;
case MUC_AFFILIATION_OUTCAST :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " No outcasts found. " ) ;
break ;
default :
break ;
}
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
} else {
switch ( affiliation ) {
case MUC_AFFILIATION_OWNER :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Owners: " ) ;
break ;
case MUC_AFFILIATION_ADMIN :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Admins: " ) ;
break ;
case MUC_AFFILIATION_MEMBER :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Members: " ) ;
break ;
case MUC_AFFILIATION_OUTCAST :
win_save_print ( window , ' ! ' , NULL , 0 , 0 , " " , " Outcasts: " ) ;
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 ) {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s (%s) " , occupant - > nick , occupant - > jid ) ;
} else {
win_save_vprint ( window , ' ! ' , NULL , 0 , 0 , " " , " %s " , occupant - > nick ) ;
}
2014-09-30 19:46:58 -04:00
}
curr_occupant = g_slist_next ( curr_occupant ) ;
}
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
}
}
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-09-13 20:56:53 -04:00
win_save_vprint ( window , ' - ' , NULL , NO_EOL , COLOUR_AWAY , " " , " [%s] " , tag ) ;
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 ) {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , COLOUR_ONLINE , " " , " [hidden] " ) ;
} else {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , COLOUR_ONLINE , " " , value ) ;
}
}
}
win_save_newline ( window ) ;
break ;
case FIELD_TEXT_PRIVATE :
if ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
if ( value ! = NULL ) {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , COLOUR_ONLINE , " " , " [hidden] " ) ;
}
}
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 + + ) ;
win_save_vprint ( window , ' - ' , NULL , 0 , COLOUR_ONLINE , " " , " [%s] %s " , val_tag - > str , value ) ;
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 ) {
win_save_print ( window , ' - ' , NULL , NO_DATE , COLOUR_OFFLINE , " " , " FALSE " ) ;
} else {
char * value = curr_value - > data ;
if ( value = = NULL ) {
win_save_print ( window , ' - ' , NULL , NO_DATE , COLOUR_OFFLINE , " " , " FALSE " ) ;
} else {
if ( g_strcmp0 ( value , " 0 " ) = = 0 ) {
win_save_print ( window , ' - ' , NULL , NO_DATE , COLOUR_OFFLINE , " " , " FALSE " ) ;
} else {
win_save_print ( window , ' - ' , NULL , NO_DATE , COLOUR_ONLINE , " " , " TRUE " ) ;
}
}
}
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-09-13 20:53:52 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , COLOUR_ONLINE , " " , " [%s] %s " , option - > value , option - > label ) ;
2014-09-10 14:59:30 -04:00
} else {
2014-09-13 20:53:52 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , COLOUR_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-09-13 20:53:52 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , COLOUR_ONLINE , " " , " [%s] %s " , option - > value , option - > label ) ;
2014-09-10 14:59:30 -04:00
} else {
2014-09-13 20:53:52 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , COLOUR_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 ) {
win_save_print ( window , ' - ' , NULL , NO_DATE | NO_EOL , COLOUR_ONLINE , " " , value ) ;
}
}
win_save_newline ( window ) ;
break ;
case FIELD_JID_MULTI :
win_save_newline ( window ) ;
while ( curr_value ! = NULL ) {
char * value = curr_value - > data ;
win_save_vprint ( window , ' - ' , NULL , 0 , COLOUR_ONLINE , " " , " %s " , value ) ;
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-09-06 19:22:11 -04:00
static void
2014-09-15 17:51:53 -04:00
_ui_show_form ( ProfWin * window , const char * const room , DataForm * form )
2014-09-06 19:22:11 -04:00
{
if ( form - > title ! = NULL ) {
2014-10-23 19:21:00 -04:00
win_save_print ( window , ' - ' , NULL , NO_EOL , 0 , " " , " Form title: " ) ;
win_save_print ( window , ' - ' , NULL , NO_DATE , 0 , " " , form - > title ) ;
2014-09-08 19:14:40 -04:00
} else {
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Configuration for room %s. " , room ) ;
2014-09-06 19:22:11 -04:00
}
2014-09-08 19:14:40 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
2014-09-16 15:52:38 -04:00
ui_show_form_help ( window , form ) ;
2014-09-06 19:22:11 -04:00
GSList * fields = form - > fields ;
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 ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , value ) ;
}
} else if ( g_strcmp0 ( field - > type , " hidden " ) ! = 0 & & field - > var ) {
2014-09-13 20:53:52 -04:00
char * tag = g_hash_table_lookup ( form - > var_to_tag , field - > var ) ;
2014-09-13 20:56:53 -04: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-09-15 18:28:12 -04:00
static void
_ui_show_form_field ( ProfWin * window , DataForm * form , char * tag )
{
FormField * field = form_get_field_by_tag ( form , tag ) ;
_ui_handle_form_field ( window , tag , field ) ;
win_save_println ( window , " " ) ;
}
2014-09-15 17:51:53 -04:00
static void
_ui_handle_room_configuration ( const char * const room , DataForm * form )
{
GString * title = g_string_new ( room ) ;
g_string_append ( title , " config " ) ;
ProfWin * window = wins_new ( title - > str , WIN_MUC_CONFIG ) ;
g_string_free ( title , TRUE ) ;
window - > form = form ;
int num = wins_get_num ( window ) ;
ui_switch_win ( num ) ;
ui_show_form ( window , room , form ) ;
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-09-17 15:59:56 -04:00
static void
_ui_handle_room_configuration_form_error ( const char * const room , const char * const message )
{
ProfWin * window = NULL ;
GString * message_str = g_string_new ( " " ) ;
if ( room ) {
window = wins_get_by_recipient ( room ) ;
g_string_printf ( message_str , " Could not get room configuration for %s " , room ) ;
} 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 ) ;
}
win_save_print ( window , ' - ' , NULL , 0 , COLOUR_ERROR , " " , message_str - > str ) ;
g_string_free ( message_str , TRUE ) ;
}
2014-09-10 18:05:35 -04:00
static void
2014-09-17 16:48:55 -04:00
_ui_handle_room_config_submit_result ( const char * const room )
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 ;
if ( room ) {
GString * form_recipient = g_string_new ( room ) ;
g_string_append ( form_recipient , " config " ) ;
muc_window = wins_get_by_recipient ( room ) ;
form_window = wins_get_by_recipient ( form_recipient - > str ) ;
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-10-07 16:21:03 -04:00
win_save_print ( muc_window , ' ! ' , NULL , 0 , COLOUR_ROOMINFO , " " , " Room configuration successful " ) ;
2014-09-17 16:48:55 -04:00
} else {
ui_switch_win ( 1 ) ;
2014-10-07 16:21:03 -04:00
cons_show ( " Room configuration successful: %s " , room ) ;
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
}
}
static void
_ui_handle_room_config_submit_result_error ( const char * const room , const char * const message )
{
ProfWin * console = wins_get_console ( ) ;
ProfWin * muc_window = NULL ;
ProfWin * form_window = NULL ;
if ( room ) {
GString * form_recipient = g_string_new ( room ) ;
g_string_append ( form_recipient , " config " ) ;
muc_window = wins_get_by_recipient ( room ) ;
form_window = wins_get_by_recipient ( form_recipient - > str ) ;
g_string_free ( form_recipient , TRUE ) ;
if ( form_window ) {
if ( message ) {
win_save_vprint ( form_window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error: %s " , message ) ;
} else {
win_save_print ( form_window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error " ) ;
}
} else if ( muc_window ) {
if ( message ) {
win_save_vprint ( muc_window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error: %s " , message ) ;
} else {
win_save_print ( muc_window , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error " ) ;
}
} else {
if ( message ) {
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error for %s: %s " , room , message ) ;
} else {
win_save_vprint ( console , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error for %s " , room ) ;
}
}
} else {
win_save_print ( console , ' ! ' , NULL , 0 , COLOUR_ERROR , " " , " Configuration error " ) ;
}
2014-09-06 19:22:11 -04:00
}
2014-09-16 15:52:38 -04:00
static void
_ui_show_form_field_help ( ProfWin * window , DataForm * form , char * tag )
{
2014-09-16 16:51:16 -04:00
FormField * field = form_get_field_by_tag ( form , tag ) ;
if ( field ! = NULL ) {
win_save_print ( window , ' - ' , NULL , NO_EOL , 0 , " " , field - > label ) ;
if ( field - > required ) {
win_save_print ( window , ' - ' , NULL , NO_DATE , 0 , " " , " (Required): " ) ;
} else {
win_save_print ( window , ' - ' , NULL , NO_DATE , 0 , " " , " : " ) ;
}
if ( field - > description ! = NULL ) {
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Description : %s " , field - > description ) ;
}
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Type : %s " , field - > type ) ;
int num_values = 0 ;
GSList * curr_option = NULL ;
FormOption * option = NULL ;
switch ( field - > type_t ) {
case FIELD_TEXT_SINGLE :
case FIELD_TEXT_PRIVATE :
2014-10-18 20:27:44 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is any text " ) ;
break ;
case FIELD_TEXT_MULTI :
num_values = form_get_value_count ( form , tag ) ;
2014-10-18 20:27:44 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Add : /%s add <value> " , tag ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is any text " ) ;
if ( num_values > 0 ) {
2014-10-18 20:27:44 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Remove : /%s remove <value> " , tag ) ;
2014-09-16 16:51:16 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> between 'val1' and 'val%d' " , num_values ) ;
}
break ;
case FIELD_BOOLEAN :
2014-10-18 20:27:44 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is either 'on' or 'off' " ) ;
break ;
case FIELD_LIST_SINGLE :
2014-10-18 20:27:44 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is one of " ) ;
curr_option = field - > options ;
while ( curr_option ! = NULL ) {
option = curr_option - > data ;
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " %s " , option - > value ) ;
curr_option = g_slist_next ( curr_option ) ;
}
break ;
case FIELD_LIST_MULTI :
2014-10-18 20:27:44 -04: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 ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is one of " ) ;
curr_option = field - > options ;
while ( curr_option ! = NULL ) {
option = curr_option - > data ;
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " %s " , option - > value ) ;
curr_option = g_slist_next ( curr_option ) ;
}
break ;
case FIELD_JID_SINGLE :
2014-10-18 20:27:44 -04:00
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " Set : /%s <value> " , tag ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is a valid Jabber ID " ) ;
break ;
case FIELD_JID_MULTI :
2014-10-18 20:27:44 -04: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 ) ;
2014-09-16 16:51:16 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Where : <value> is a valid Jabber ID " ) ;
break ;
case FIELD_FIXED :
case FIELD_UNKNOWN :
case FIELD_HIDDEN :
default :
break ;
}
} else {
win_save_vprint ( window , ' - ' , NULL , 0 , 0 , " " , " No such field %s " , tag ) ;
}
2014-09-16 15:52:38 -04:00
}
static void
_ui_show_form_help ( ProfWin * window , DataForm * form )
{
if ( form - > instructions ! = NULL ) {
2014-10-07 16:31:34 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " Supplied instructions: " ) ;
2014-09-16 15:52:38 -04:00
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , form - > instructions ) ;
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , " " ) ;
}
}
static void
_ui_show_lines ( ProfWin * window , const gchar * * lines )
{
if ( lines ! = NULL ) {
int i ;
for ( i = 0 ; lines [ i ] ! = NULL ; i + + ) {
win_save_print ( window , ' - ' , NULL , 0 , 0 , " " , lines [ i ] ) ;
}
}
}
2014-11-12 18:19:07 -05:00
static void
_ui_roster_contact ( PContact contact )
{
if ( p_contact_subscribed ( contact ) ) {
ProfWin * window = wins_get_console ( ) ;
const char * name = p_contact_name_or_jid ( contact ) ;
const char * presence = p_contact_presence ( contact ) ;
if ( ( g_strcmp0 ( presence , " offline " ) ! = 0 ) | | ( ( g_strcmp0 ( presence , " offline " ) = = 0 ) & &
( prefs_get_boolean ( PREF_ROSTER_OFFLINE ) ) ) ) {
int presence_colour = win_presence_colour ( presence ) ;
wattron ( window - > subwin , presence_colour ) ;
GString * msg = g_string_new ( " " ) ;
g_string_append ( msg , name ) ;
win_printline_nowrap ( window - > subwin , msg - > str ) ;
g_string_free ( msg , TRUE ) ;
wattroff ( window - > subwin , presence_colour ) ;
if ( prefs_get_boolean ( PREF_ROSTER_RESOURCE ) ) {
GList * resources = p_contact_get_available_resources ( contact ) ;
GList * ordered_resources = NULL ;
// sort in order of availabiltiy
while ( resources ! = NULL ) {
Resource * resource = resources - > data ;
ordered_resources = g_list_insert_sorted ( ordered_resources , resource , ( GCompareFunc ) resource_compare_availability ) ;
resources = g_list_next ( resources ) ;
}
g_list_free ( resources ) ;
while ( ordered_resources ) {
Resource * resource = ordered_resources - > data ;
const char * resource_presence = string_from_resource_presence ( resource - > presence ) ;
int resource_presence_colour = win_presence_colour ( resource_presence ) ;
wattron ( window - > subwin , resource_presence_colour ) ;
GString * msg = g_string_new ( " " ) ;
g_string_append ( msg , resource - > name ) ;
win_printline_nowrap ( window - > subwin , msg - > str ) ;
g_string_free ( msg , TRUE ) ;
wattroff ( window - > subwin , resource_presence_colour ) ;
ordered_resources = g_list_next ( ordered_resources ) ;
}
g_list_free ( ordered_resources ) ;
}
}
}
}
static void
_ui_roster_contacts_by_presence ( const char * const presence , char * title )
{
ProfWin * window = wins_get_console ( ) ;
GSList * contacts = roster_get_contacts_by_presence ( presence ) ;
wattron ( window - > subwin , COLOUR_ROOMINFO ) ;
win_printline_nowrap ( window - > subwin , title ) ;
wattroff ( window - > subwin , COLOUR_ROOMINFO ) ;
if ( contacts ) {
GSList * curr_contact = contacts ;
while ( curr_contact ) {
PContact contact = curr_contact - > data ;
_ui_roster_contact ( contact ) ;
curr_contact = g_slist_next ( curr_contact ) ;
}
}
g_slist_free ( contacts ) ;
}
2014-11-09 19:31:11 -05:00
static void
_ui_roster ( void )
{
ProfWin * window = wins_get_console ( ) ;
if ( window ) {
2014-11-12 18:19:07 -05:00
if ( g_strcmp0 ( prefs_get_string ( PREF_ROSTER_BY ) , " presence " ) = = 0 ) {
2014-11-09 19:31:11 -05:00
werase ( window - > subwin ) ;
2014-11-12 18:19:07 -05:00
_ui_roster_contacts_by_presence ( " chat " , " -Available for chat " ) ;
_ui_roster_contacts_by_presence ( " online " , " -Online " ) ;
_ui_roster_contacts_by_presence ( " away " , " -Away " ) ;
_ui_roster_contacts_by_presence ( " xa " , " -Extended Away " ) ;
_ui_roster_contacts_by_presence ( " dnd " , " -Do not disturb " ) ;
if ( prefs_get_boolean ( PREF_ROSTER_OFFLINE ) ) {
_ui_roster_contacts_by_presence ( " offline " , " -Offline " ) ;
}
} else {
GSList * contacts = roster_get_contacts ( ) ;
if ( contacts ) {
werase ( window - > subwin ) ;
wattron ( window - > subwin , COLOUR_ROOMINFO ) ;
win_printline_nowrap ( window - > subwin , " -Roster " ) ;
wattroff ( window - > subwin , COLOUR_ROOMINFO ) ;
GSList * curr_contact = contacts ;
while ( curr_contact ) {
PContact contact = curr_contact - > data ;
_ui_roster_contact ( contact ) ;
curr_contact = g_slist_next ( curr_contact ) ;
2014-11-09 19:46:20 -05:00
}
2014-11-09 19:31:11 -05:00
}
2014-11-12 18:19:07 -05:00
g_slist_free ( contacts ) ;
2014-11-09 19:31:11 -05:00
}
}
}
2014-10-07 11:37:14 -04:00
static void
_ui_muc_roster ( const char * const room )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
2014-10-09 08:16:36 -04:00
if ( window ) {
2014-11-03 16:27:41 -05:00
GList * occupants = muc_roster ( room ) ;
if ( occupants ) {
2014-10-07 11:37:14 -04:00
werase ( window - > subwin ) ;
2014-10-18 15:22:34 -04:00
if ( prefs_get_boolean ( PREF_MUC_PRIVILEGES ) ) {
wattron ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-10 17:47:53 -05:00
win_printline_nowrap ( window - > subwin , " -Moderators " ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-03 16:27:41 -05:00
GList * roster_curr = occupants ;
2014-10-18 15:22:34 -04:00
while ( roster_curr ) {
Occupant * occupant = roster_curr - > data ;
if ( occupant - > role = = MUC_ROLE_MODERATOR ) {
const char * presence_str = string_from_resource_presence ( occupant - > presence ) ;
int presence_colour = win_presence_colour ( presence_str ) ;
wattron ( window - > subwin , presence_colour ) ;
2014-11-10 17:47:53 -05:00
GString * msg = g_string_new ( " " ) ;
g_string_append ( msg , occupant - > nick ) ;
win_printline_nowrap ( window - > subwin , msg - > str ) ;
g_string_free ( msg , TRUE ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , presence_colour ) ;
}
roster_curr = g_list_next ( roster_curr ) ;
2014-10-07 11:37:14 -04:00
}
2014-10-18 15:22:34 -04:00
wattron ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-10 17:47:53 -05:00
win_printline_nowrap ( window - > subwin , " -Participants " ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-03 16:27:41 -05:00
roster_curr = occupants ;
2014-10-18 15:22:34 -04:00
while ( roster_curr ) {
Occupant * occupant = roster_curr - > data ;
if ( occupant - > role = = MUC_ROLE_PARTICIPANT ) {
const char * presence_str = string_from_resource_presence ( occupant - > presence ) ;
int presence_colour = win_presence_colour ( presence_str ) ;
wattron ( window - > subwin , presence_colour ) ;
2014-11-10 17:47:53 -05:00
GString * msg = g_string_new ( " " ) ;
g_string_append ( msg , occupant - > nick ) ;
win_printline_nowrap ( window - > subwin , msg - > str ) ;
g_string_free ( msg , TRUE ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , presence_colour ) ;
}
roster_curr = g_list_next ( roster_curr ) ;
2014-10-07 11:37:14 -04:00
}
2014-10-18 15:22:34 -04:00
wattron ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-10 17:47:53 -05:00
win_printline_nowrap ( window - > subwin , " -Visitors " ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-03 16:27:41 -05:00
roster_curr = occupants ;
2014-10-18 15:22:34 -04:00
while ( roster_curr ) {
Occupant * occupant = roster_curr - > data ;
if ( occupant - > role = = MUC_ROLE_VISITOR ) {
const char * presence_str = string_from_resource_presence ( occupant - > presence ) ;
int presence_colour = win_presence_colour ( presence_str ) ;
wattron ( window - > subwin , presence_colour ) ;
2014-11-10 17:47:53 -05:00
GString * msg = g_string_new ( " " ) ;
g_string_append ( msg , occupant - > nick ) ;
win_printline_nowrap ( window - > subwin , msg - > str ) ;
g_string_free ( msg , TRUE ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , presence_colour ) ;
}
roster_curr = g_list_next ( roster_curr ) ;
}
} else {
wattron ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-10 17:47:53 -05:00
win_printline_nowrap ( window - > subwin , " -Occupants \n " ) ;
2014-10-18 15:22:34 -04:00
wattroff ( window - > subwin , COLOUR_ROOMINFO ) ;
2014-11-03 16:27:41 -05:00
GList * roster_curr = occupants ;
2014-10-18 15:22:34 -04:00
while ( roster_curr ) {
Occupant * occupant = roster_curr - > data ;
2014-10-07 11:37:14 -04:00
const char * presence_str = string_from_resource_presence ( occupant - > presence ) ;
int presence_colour = win_presence_colour ( presence_str ) ;
wattron ( window - > subwin , presence_colour ) ;
2014-11-10 17:47:53 -05:00
GString * msg = g_string_new ( " " ) ;
g_string_append ( msg , occupant - > nick ) ;
win_printline_nowrap ( window - > subwin , msg - > str ) ;
g_string_free ( msg , TRUE ) ;
2014-10-07 11:37:14 -04:00
wattroff ( window - > subwin , presence_colour ) ;
2014-10-18 15:22:34 -04:00
roster_curr = g_list_next ( roster_curr ) ;
2014-10-07 11:37:14 -04:00
}
}
}
2014-11-03 16:27:41 -05:00
g_list_free ( occupants ) ;
2014-10-07 11:37:14 -04:00
}
}
2014-10-09 08:16:36 -04:00
static void
_ui_room_show_occupants ( const char * const room )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window & & ! window - > subwin ) {
2014-10-09 16:42:09 -04:00
wins_show_subwin ( window ) ;
ui_muc_roster ( room ) ;
2014-10-09 08:16:36 -04:00
}
}
static void
_ui_room_hide_occupants ( const char * const room )
{
ProfWin * window = wins_get_by_recipient ( room ) ;
if ( window & & window - > subwin ) {
2014-10-09 16:27:16 -04:00
wins_hide_subwin ( window ) ;
2014-10-09 08:16:36 -04:00
}
}
2014-11-10 18:23:02 -05:00
static void
_ui_show_roster ( void )
{
ProfWin * window = wins_get_console ( ) ;
if ( window & & ! window - > subwin ) {
wins_show_subwin ( window ) ;
ui_roster ( ) ;
}
}
static void
_ui_hide_roster ( void )
{
ProfWin * window = wins_get_console ( ) ;
if ( window & & window - > subwin ) {
wins_hide_subwin ( window ) ;
}
}
2012-07-24 18:19:48 -04:00
static void
2013-01-02 19:16:39 -05:00
_win_handle_switch ( const wint_t * const ch )
2012-03-10 15:46:30 -05:00
{
if ( * ch = = KEY_F ( 1 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 1 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 2 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 2 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 3 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 3 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 4 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 4 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 5 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 5 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 6 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 6 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 7 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 7 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 8 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 8 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 9 ) ) {
2012-11-25 19:57:41 -05:00
ui_switch_win ( 9 ) ;
2013-08-31 18:00:46 -04:00
} else if ( * ch = = KEY_F ( 10 ) ) {
ui_switch_win ( 0 ) ;
2012-03-10 15:46:30 -05:00
}
}
2012-07-24 18:19:48 -04:00
static void
2014-10-07 16:12:19 -04:00
_win_handle_page ( const wint_t * const 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 ) ;
2012-11-22 19:19:29 -05:00
int y = getcury ( current - > win ) ;
2014-10-07 16:12:19 -04:00
int sub_y = getcury ( current - > subwin ) ;
2012-03-10 15:46:30 -05:00
int page_space = rows - 4 ;
2012-11-22 19:19:29 -05:00
int * page_start = & ( current - > 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
2013-01-17 14:40:55 -05:00
if ( * ch = = KEY_MOUSE ) {
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
2013-01-17 14:40:55 -05:00
current - > 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
2013-01-17 14:40:55 -05:00
current - > 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
2014-07-18 17:28:49 -04: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
2012-11-22 19:19:29 -05:00
current - > paged = 1 ;
2014-04-06 16:06:50 -04:00
win_update_virtual ( current ) ;
2012-03-10 15:46:30 -05:00
// page down
} else if ( * ch = = KEY_NPAGE ) {
* 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
2012-11-22 19:19:29 -05:00
current - > 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-03-31 16:44:34 -04:00
current - > paged = 0 ;
}
2014-10-07 16:12:19 -04:00
2014-11-09 20:10:43 -05:00
if ( ( current - > type = = WIN_MUC ) | | ( current - > type = = WIN_CONSOLE ) ) {
2014-10-07 16:12:19 -04:00
// alt up arrow
2014-10-07 19:50:28 -04:00
if ( ( result = = KEY_CODE_YES ) & & ( ( * ch = = 565 ) | | ( * ch = = 337 ) ) ) {
2014-10-07 16:12:19 -04:00
current - > sub_y_pos - = page_space ;
// went past beginning, show first page
if ( current - > sub_y_pos < 0 )
current - > sub_y_pos = 0 ;
win_update_virtual ( current ) ;
// alt down arrow
2014-10-07 19:50:28 -04:00
} else if ( ( result = = KEY_CODE_YES ) & & ( ( * ch = = 524 ) | | ( * ch = = 336 ) ) ) {
2014-10-07 16:12:19 -04:00
current - > sub_y_pos + = page_space ;
// only got half a screen, show full screen
if ( ( sub_y - ( current - > sub_y_pos ) ) < page_space )
current - > sub_y_pos = sub_y - page_space ;
// went past end, show full screen
else if ( current - > sub_y_pos > = sub_y )
current - > sub_y_pos = sub_y - page_space - 1 ;
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
_win_show_history ( WINDOW * win , int win_index , const char * const contact )
{
2013-08-20 18:08:21 -04:00
ProfWin * window = wins_get_by_num ( win_index ) ;
if ( ! window - > history_shown ) {
2013-05-21 17:00:42 -04:00
Jid * jid = jid_create ( jabber_get_fulljid ( ) ) ;
2014-06-26 19:38:53 -04:00
GSList * history = chat_log_get_previous ( jid - > barejid , contact ) ;
2013-01-29 18:01:15 -05:00
jid_destroy ( jid ) ;
2014-06-26 19:38:53 -04:00
GSList * curr = history ;
while ( curr ! = NULL ) {
2014-11-08 19:36:25 -05:00
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 ) ;
}
2014-06-26 19:38:53 -04:00
curr = g_slist_next ( curr ) ;
2012-10-14 17:36:29 -04:00
}
2013-08-20 18:08:21 -04:00
window - > history_shown = 1 ;
2012-10-14 17:36:29 -04:00
g_slist_free_full ( history , free ) ;
}
}
2013-12-22 18:54:22 -05:00
void
ui_init_module ( void )
{
ui_init = _ui_init ;
ui_get_idle_time = _ui_get_idle_time ;
ui_reset_idle_time = _ui_reset_idle_time ;
ui_close = _ui_close ;
ui_resize = _ui_resize ;
ui_load_colours = _ui_load_colours ;
ui_win_exists = _ui_win_exists ;
ui_contact_typing = _ui_contact_typing ;
ui_get_recipients = _ui_get_recipients ;
ui_incoming_msg = _ui_incoming_msg ;
ui_roster_add = _ui_roster_add ;
ui_roster_remove = _ui_roster_remove ;
ui_contact_already_in_group = _ui_contact_already_in_group ;
ui_contact_not_in_group = _ui_contact_not_in_group ;
ui_group_added = _ui_group_added ;
ui_group_removed = _ui_group_removed ;
ui_disconnected = _ui_disconnected ;
ui_handle_special_keys = _ui_handle_special_keys ;
ui_close_connected_win = _ui_close_connected_win ;
ui_close_all_wins = _ui_close_all_wins ;
ui_close_read_wins = _ui_close_read_wins ;
ui_switch_win = _ui_switch_win ;
ui_next_win = _ui_next_win ;
ui_previous_win = _ui_previous_win ;
ui_clear_current = _ui_clear_current ;
ui_close_current = _ui_close_current ;
ui_close_win = _ui_close_win ;
ui_tidy_wins = _ui_tidy_wins ;
ui_prune_wins = _ui_prune_wins ;
ui_current_win_type = _ui_current_win_type ;
ui_current_win_index = _ui_current_win_index ;
ui_win_type = _ui_win_type ;
ui_recipient = _ui_recipient ;
ui_current_recipient = _ui_current_recipient ;
ui_current_print_line = _ui_current_print_line ;
2014-01-16 18:16:37 -05:00
ui_current_print_formatted_line = _ui_current_print_formatted_line ;
2013-12-22 18:54:22 -05:00
ui_current_error_line = _ui_current_error_line ;
ui_print_system_msg_from_recipient = _ui_print_system_msg_from_recipient ;
ui_recipient_gone = _ui_recipient_gone ;
ui_new_chat_win = _ui_new_chat_win ;
ui_outgoing_msg = _ui_outgoing_msg ;
ui_room_join = _ui_room_join ;
ui_room_roster = _ui_room_roster ;
ui_room_member_offline = _ui_room_member_offline ;
ui_room_member_online = _ui_room_member_online ;
ui_room_member_presence = _ui_room_member_presence ;
ui_room_member_nick_change = _ui_room_member_nick_change ;
ui_room_nick_change = _ui_room_nick_change ;
ui_room_history = _ui_room_history ;
ui_room_message = _ui_room_message ;
ui_room_subject = _ui_room_subject ;
ui_room_broadcast = _ui_room_broadcast ;
ui_status = _ui_status ;
2014-06-03 16:35:27 -04:00
ui_info = _ui_info ;
2013-12-22 18:54:22 -05:00
ui_status_private = _ui_status_private ;
2014-06-03 16:35:27 -04:00
ui_info_private = _ui_info_private ;
2013-12-22 18:54:22 -05:00
ui_status_room = _ui_status_room ;
2014-06-03 16:20:13 -04:00
ui_info_room = _ui_info_room ;
2013-12-22 18:54:22 -05:00
ui_unread = _ui_unread ;
ui_win_unread = _ui_win_unread ;
ui_ask_password = _ui_ask_password ;
2014-01-11 12:03:01 -05:00
ui_current_win_is_otr = _ui_current_win_is_otr ;
ui_current_set_otr = _ui_current_set_otr ;
2014-04-30 17:41:53 -04:00
ui_otr_authenticating = _ui_otr_authenticating ;
ui_otr_authetication_waiting = _ui_otr_authetication_waiting ;
2014-01-11 16:44:24 -05:00
ui_gone_secure = _ui_gone_secure ;
2014-01-11 18:28:11 -05:00
ui_gone_insecure = _ui_gone_insecure ;
2014-01-11 20:20:22 -05:00
ui_trust = _ui_trust ;
ui_untrust = _ui_untrust ;
2014-04-26 18:29:05 -04:00
ui_smp_recipient_initiated = _ui_smp_recipient_initiated ;
2014-04-30 18:59:40 -04:00
ui_smp_recipient_initiated_q = _ui_smp_recipient_initiated_q ;
2014-04-26 20:17:38 -04:00
ui_smp_successful = _ui_smp_successful ;
2014-04-26 18:29:05 -04:00
ui_smp_unsuccessful_sender = _ui_smp_unsuccessful_sender ;
ui_smp_unsuccessful_receiver = _ui_smp_unsuccessful_receiver ;
ui_smp_aborted = _ui_smp_aborted ;
2014-05-07 15:41:05 -04:00
ui_smp_answer_success = _ui_smp_answer_success ;
ui_smp_answer_failure = _ui_smp_answer_failure ;
2014-01-19 13:31:02 -05:00
ui_chat_win_contact_online = _ui_chat_win_contact_online ;
ui_chat_win_contact_offline = _ui_chat_win_contact_offline ;
2014-01-26 13:30:34 -05:00
ui_handle_recipient_not_found = _ui_handle_recipient_not_found ;
2014-01-27 17:09:16 -05:00
ui_handle_recipient_error = _ui_handle_recipient_error ;
ui_handle_error = _ui_handle_error ;
2014-04-03 16:13:59 -04:00
ui_clear_win_title = _ui_clear_win_title ;
2014-04-07 15:41:06 -04:00
ui_auto_away = _ui_auto_away ;
ui_end_auto_away = _ui_end_auto_away ;
ui_titlebar_presence = _ui_titlebar_presence ;
ui_handle_login_account_success = _ui_handle_login_account_success ;
ui_update_presence = _ui_update_presence ;
2014-04-07 16:12:30 -04:00
ui_about = _ui_about ;
ui_statusbar_new = _ui_statusbar_new ;
2014-04-07 16:50:28 -04:00
ui_get_char = _ui_get_char ;
ui_input_clear = _ui_input_clear ;
ui_input_nonblocking = _ui_input_nonblocking ;
ui_replace_input = _ui_replace_input ;
2014-04-09 17:05:31 -04:00
ui_invalid_command_usage = _ui_invalid_command_usage ;
2014-04-14 20:08:41 -04:00
ui_handle_stanza = _ui_handle_stanza ;
2014-04-15 08:16:32 -04:00
ui_create_xmlconsole_win = _ui_create_xmlconsole_win ;
ui_xmlconsole_exists = _ui_xmlconsole_exists ;
2014-04-24 19:04:01 -04:00
ui_open_xmlconsole_win = _ui_open_xmlconsole_win ;
2014-04-20 19:37:04 -04:00
ui_handle_room_join_error = _ui_handle_room_join_error ;
2014-04-24 16:50:59 -04:00
ui_swap_wins = _ui_swap_wins ;
2014-09-01 14:14:52 -04:00
ui_update = _ui_update ;
2014-09-02 19:23:04 -04:00
ui_room_requires_config = _ui_room_requires_config ;
2014-10-05 15:52:34 -04:00
ui_room_destroy = _ui_room_destroy ;
2014-09-06 19:22:11 -04:00
ui_handle_room_configuration = _ui_handle_room_configuration ;
2014-09-10 18:05:35 -04:00
ui_handle_room_config_submit_result = _ui_handle_room_config_submit_result ;
2014-09-17 16:48:55 -04:00
ui_handle_room_config_submit_result_error = _ui_handle_room_config_submit_result_error ;
2014-09-15 17:31:15 -04:00
ui_win_has_unsaved_form = _ui_win_has_unsaved_form ;
2014-09-15 17:51:53 -04:00
ui_show_form = _ui_show_form ;
2014-09-15 18:28:12 -04:00
ui_show_form_field = _ui_show_form_field ;
2014-09-16 15:52:38 -04:00
ui_show_form_help = _ui_show_form_help ;
ui_show_form_field_help = _ui_show_form_field_help ;
ui_show_lines = _ui_show_lines ;
2014-09-17 15:59:56 -04:00
ui_handle_room_configuration_form_error = _ui_handle_room_configuration_form_error ;
2014-09-30 18:08:48 -04:00
ui_show_room_info = _ui_show_room_info ;
2014-09-30 19:27:25 -04:00
ui_show_room_role_list = _ui_show_room_role_list ;
2014-09-30 19:46:58 -04:00
ui_show_room_affiliation_list = _ui_show_room_affiliation_list ;
2014-10-02 18:37:10 -04:00
ui_handle_room_info_error = _ui_handle_room_info_error ;
ui_show_room_disco_info = _ui_show_room_disco_info ;
2014-10-04 20:39:48 -04:00
ui_handle_room_affiliation_list_error = _ui_handle_room_affiliation_list_error ;
2014-10-05 15:52:34 -04:00
ui_handle_room_affiliation_list = _ui_handle_room_affiliation_list ;
ui_handle_room_affiliation_set_error = _ui_handle_room_affiliation_set_error ;
ui_handle_room_kick_error = _ui_handle_room_kick_error ;
ui_room_destroyed = _ui_room_destroyed ;
ui_room_kicked = _ui_room_kicked ;
2014-10-06 17:59:25 -04:00
ui_room_banned = _ui_room_banned ;
2014-10-05 15:52:34 -04:00
ui_leave_room = _ui_leave_room ;
ui_room_member_kicked = _ui_room_member_kicked ;
2014-10-06 17:59:25 -04:00
ui_room_member_banned = _ui_room_member_banned ;
2014-10-06 16:42:09 -04:00
ui_handle_room_role_set_error = _ui_handle_room_role_set_error ;
ui_handle_room_role_list_error = _ui_handle_room_role_list_error ;
ui_handle_room_role_list = _ui_handle_room_role_list ;
2014-10-07 11:37:14 -04:00
ui_muc_roster = _ui_muc_roster ;
2014-11-09 19:31:11 -05:00
ui_roster = _ui_roster ;
2014-10-09 16:27:16 -04:00
ui_room_show_occupants = _ui_room_show_occupants ;
2014-10-09 08:16:36 -04:00
ui_room_hide_occupants = _ui_room_hide_occupants ;
2014-11-10 18:23:02 -05:00
ui_show_roster = _ui_show_roster ;
ui_hide_roster = _ui_hide_roster ;
2014-10-11 21:10:46 -04:00
ui_room_role_change = _ui_room_role_change ;
ui_room_affiliation_change = _ui_room_affiliation_change ;
2014-10-17 19:40:44 -04:00
ui_switch_to_room = _ui_switch_to_room ;
2014-10-17 20:07:25 -04:00
ui_room_role_and_affiliation_change = _ui_room_role_and_affiliation_change ;
2014-10-18 14:10:50 -04:00
ui_room_occupant_role_change = _ui_room_occupant_role_change ;
ui_room_occupant_affiliation_change = _ui_room_occupant_affiliation_change ;
ui_room_occupant_role_and_affiliation_change = _ui_room_occupant_role_and_affiliation_change ;
2014-10-18 15:22:34 -04:00
ui_redraw_all_room_rosters = _ui_redraw_all_room_rosters ;
2013-12-22 18:54:22 -05:00
}