diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index b84d4d2e..03c6e404 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -471,6 +471,7 @@ cmd_ac_init(void) wins_ac = autocomplete_new(); autocomplete_add(wins_ac, "unread"); + autocomplete_add(wins_ac, "attention"); autocomplete_add(wins_ac, "prune"); autocomplete_add(wins_ac, "swap"); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 4ebc3432..a1b00df0 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -973,6 +973,7 @@ static struct cmd_t command_defs[] = { parse_args, 0, 3, NULL, CMD_SUBFUNCS( { "unread", cmd_wins_unread }, + { "attention", cmd_wins_attention }, { "prune", cmd_wins_prune }, { "swap", cmd_wins_swap }) CMD_MAINFUNC(cmd_wins) @@ -981,6 +982,7 @@ static struct cmd_t command_defs[] = { CMD_SYN( "/wins", "/wins unread", + "/wins attention", "/wins prune", "/wins swap ") CMD_DESC( @@ -988,6 +990,7 @@ static struct cmd_t command_defs[] = { "Passing no argument will list all currently active windows and information about their usage.") CMD_ARGS( { "unread", "List windows with unread messages." }, + { "attention", "Marked windows" }, { "prune", "Close all windows with no unread messages." }, { "swap ", "Swap windows, target may be an empty position." }) CMD_NOEXAMPLES diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index b2262c5f..0f3fb3a8 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -1298,6 +1298,13 @@ cmd_wins_unread(ProfWin* window, const char* const command, gchar** args) return TRUE; } +gboolean +cmd_wins_attention(ProfWin* window, const char* const command, gchar** args) +{ + cons_show_wins(TRUE); + return TRUE; +} + gboolean cmd_wins_prune(ProfWin* window, const char* const command, gchar** args) { diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h index 0785963b..aadcb55f 100644 --- a/src/command/cmd_funcs.h +++ b/src/command/cmd_funcs.h @@ -209,6 +209,7 @@ gboolean cmd_otr_sendfile(ProfWin* window, const char* const command, gchar** ar gboolean cmd_wins(ProfWin* window, const char* const command, gchar** args); gboolean cmd_wins_unread(ProfWin* window, const char* const command, gchar** args); +gboolean cmd_wins_attention(ProfWin* window, const char* const command, gchar** args); gboolean cmd_wins_prune(ProfWin* window, const char* const command, gchar** args); gboolean cmd_wins_swap(ProfWin* window, const char* const command, gchar** args); diff --git a/src/ui/inputwin.c b/src/ui/inputwin.c index 74fcfbb4..e23fad68 100644 --- a/src/ui/inputwin.c +++ b/src/ui/inputwin.c @@ -125,6 +125,8 @@ static int _inp_rl_win_20_handler(int count, int key); static int _inp_rl_win_prev_handler(int count, int key); static int _inp_rl_win_next_handler(int count, int key); static int _inp_rl_win_next_unread_handler(int count, int key); +static int _inp_rl_win_attention_handler(int count, int key); +static int _inp_rl_win_attention_next_handler(int count, int key); static int _inp_rl_win_pageup_handler(int count, int key); static int _inp_rl_win_pagedown_handler(int count, int key); static int _inp_rl_subwin_pageup_handler(int count, int key); @@ -480,6 +482,8 @@ _inp_rl_startup_hook(void) rl_bind_keyseq("\\e\\e[C", _inp_rl_win_next_handler); rl_bind_keyseq("\\ea", _inp_rl_win_next_unread_handler); + rl_bind_keyseq("\\ef", _inp_rl_win_attention_handler); + rl_bind_keyseq("\\em", _inp_rl_win_attention_next_handler); rl_bind_keyseq("\\e\\e[5~", _inp_rl_subwin_pageup_handler); rl_bind_keyseq("\\e[5;3~", _inp_rl_subwin_pageup_handler); @@ -806,6 +810,24 @@ _inp_rl_win_next_unread_handler(int count, int key) return 0; } +static int +_inp_rl_win_attention_handler(int count, int key) { + ProfWin* current = wins_get_current(); + if ( current ) { + ProfChatWin* chatwin = (ProfChatWin*)current; + chatwin->has_attention = !chatwin->has_attention; + win_redraw(current); + } + return 0; +} + +static int +_inp_rl_win_attention_next_handler(int count, int key) { + //ProfWin* current = wins_get_current(); + return 0; +} + + static int _inp_rl_win_pageup_handler(int count, int key) { diff --git a/src/ui/titlebar.c b/src/ui/titlebar.c index dee6a7e2..0b2187ce 100644 --- a/src/ui/titlebar.c +++ b/src/ui/titlebar.c @@ -487,6 +487,18 @@ _show_privacy(ProfChatWin* chatwin) return; } + if (chatwin->has_attention) { + wprintw(win, " "); + wattron(win, bracket_attrs); + wprintw(win, "["); + wattroff(win, bracket_attrs); + wattron(win, encrypted_attrs); + wprintw(win, "ATTENTION"); + wattroff(win, encrypted_attrs); + wattron(win, bracket_attrs); + wprintw(win, "]"); + wattroff(win, bracket_attrs); + } if (chatwin->pgp_send || chatwin->pgp_recv) { GString* pgpmsg = g_string_new("PGP "); diff --git a/src/ui/win_types.h b/src/ui/win_types.h index e740b543..d40a5396 100644 --- a/src/ui/win_types.h +++ b/src/ui/win_types.h @@ -176,6 +176,7 @@ typedef struct prof_chat_win_t // For LMC char* last_message; char* last_msg_id; + gboolean has_attention; } ProfChatWin; typedef struct prof_muc_win_t diff --git a/src/ui/window.c b/src/ui/window.c index b6676774..f4439c74 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -158,7 +158,7 @@ win_create_chat(const char* const barejid) new_win->outgoing_char = NULL; new_win->last_message = NULL; new_win->last_msg_id = NULL; - + new_win->has_attention = FALSE; new_win->memcheck = PROFCHATWIN_MEMCHECK; return &new_win->window;