diff --git a/src/curses/ui_call_flow.c b/src/curses/ui_call_flow.c index 06889a3..c568c7a 100644 --- a/src/curses/ui_call_flow.c +++ b/src/curses/ui_call_flow.c @@ -1060,6 +1060,10 @@ call_flow_handle_key(ui_t *ui, int key) call_raw_set_group(info->group); call_raw_set_msg(call_flow_arrow_message(vector_item(info->darrows, info->cur_arrow))); break; + case ACTION_CLEAR_CALLS: + // Propagate the key to the previous panel + return KEY_PROPAGATED; + default: // Parse next action continue; @@ -1114,20 +1118,21 @@ call_flow_help(ui_t *ui) // A list of available keys in this window mvwprintw(help_win, 8, 2, "Available keys:"); mvwprintw(help_win, 9, 2, "Esc/Q Go back to Call list window"); - mvwprintw(help_win, 10, 2, "Enter Show current message Raw"); - mvwprintw(help_win, 11, 2, "F1/h Show this screen"); - mvwprintw(help_win, 12, 2, "F2/d Toggle SDP Address:Port info"); - mvwprintw(help_win, 13, 2, "F3/m Toggle RTP arrows display"); - mvwprintw(help_win, 14, 2, "F4/X Show call-flow with X-CID/X-Call-ID dialog"); - mvwprintw(help_win, 15, 2, "F5/s Toggle compressed view (One address <=> one column"); - mvwprintw(help_win, 16, 2, "F6/R Show original call messages in raw mode"); - mvwprintw(help_win, 17, 2, "F7/c Cycle between available color modes"); - mvwprintw(help_win, 18, 2, "F8/C Turn on/off message syntax highlighting"); - mvwprintw(help_win, 19, 2, "9/0 Increase/Decrease raw preview size"); - mvwprintw(help_win, 20, 2, "t Toggle raw preview display"); - mvwprintw(help_win, 21, 2, "T Restore raw preview size"); - mvwprintw(help_win, 22, 2, "D Only show SDP messages"); - + mvwprintw(help_win, 10, 2, "F5/Ctrl-L Leave screen and clear call list"); + mvwprintw(help_win, 11, 2, "Enter Show current message Raw"); + mvwprintw(help_win, 12, 2, "F1/h Show this screen"); + mvwprintw(help_win, 13, 2, "F2/d Toggle SDP Address:Port info"); + mvwprintw(help_win, 14, 2, "F3/m Toggle RTP arrows display"); + mvwprintw(help_win, 15, 2, "F4/X Show call-flow with X-CID/X-Call-ID dialog"); + mvwprintw(help_win, 16, 2, "F5/s Toggle compressed view (One address <=> one column"); + mvwprintw(help_win, 17, 2, "F6/R Show original call messages in raw mode"); + mvwprintw(help_win, 18, 2, "F7/c Cycle between available color modes"); + mvwprintw(help_win, 19, 2, "F8/C Turn on/off message syntax highlighting"); + mvwprintw(help_win, 20, 2, "F9/l Turn on/off resolved addresses"); + mvwprintw(help_win, 21, 2, "9/0 Increase/Decrease raw preview size"); + mvwprintw(help_win, 22, 2, "t Toggle raw preview display"); + mvwprintw(help_win, 23, 2, "T Restore raw preview size"); + mvwprintw(help_win, 24, 2, "D Only show SDP messages"); // Press any key to close wgetch(help_win); diff --git a/src/curses/ui_call_flow.h b/src/curses/ui_call_flow.h index 0964deb..5fde041 100644 --- a/src/curses/ui_call_flow.h +++ b/src/curses/ui_call_flow.h @@ -312,8 +312,8 @@ call_flow_draw_raw_rtcp(ui_t *ui, rtp_stream_t *rtcp); * @brief Handle Call flow extended key strokes * * This function will manage the custom keybindings of the panel. If this - * function returns -1, the ui manager will check if the pressed key - * is one of the common ones (like toggle colors and so). + * function returns -1, the ui manager will destroy the current panel and + * pass the key to the previous panel. * * @param panel Ncurses panel pointer * @param key Pressed keycode diff --git a/src/curses/ui_call_list.c b/src/curses/ui_call_list.c index 2cb8b93..1fd8a3e 100644 --- a/src/curses/ui_call_list.c +++ b/src/curses/ui_call_list.c @@ -756,7 +756,7 @@ call_list_help(ui_t *ui) mvwprintw(help_win, 14, 2, "F2/S Save captured packages to a file"); mvwprintw(help_win, 15, 2, "F3// Display filtering (match string case insensitive)"); mvwprintw(help_win, 16, 2, "F4/X Show selected call-flow (Extended) if available"); - mvwprintw(help_win, 17, 2, "F5 Clear call list (can not be undone!)"); + mvwprintw(help_win, 17, 2, "F5/Ctrl-L Clear call list (can not be undone!)"); mvwprintw(help_win, 18, 2, "F6/R Show selected call messages in raw mode"); mvwprintw(help_win, 19, 2, "F7/F Show filter options"); mvwprintw(help_win, 20, 2, "F8/c Turn on/off window colours"); diff --git a/src/curses/ui_call_raw.c b/src/curses/ui_call_raw.c index feb0d44..082213c 100644 --- a/src/curses/ui_call_raw.c +++ b/src/curses/ui_call_raw.c @@ -249,6 +249,9 @@ call_raw_handle_key(ui_t *ui, int key) call_raw_set_msg(info->msg); } break; + case ACTION_CLEAR_CALLS: + // Propagate the key to the previous panel + return KEY_PROPAGATED; default: // Parse next action continue; diff --git a/src/curses/ui_call_raw.h b/src/curses/ui_call_raw.h index 182ed13..f8b1041 100644 --- a/src/curses/ui_call_raw.h +++ b/src/curses/ui_call_raw.h @@ -114,8 +114,9 @@ call_raw_print_msg(ui_t *ui, sip_msg_t *msg); * @brief Handle Call Raw key strokes * * This function will manage the custom keybindings of the panel. If this - * function returns -1, the ui manager will check if the pressed key - * is one of the common ones (like toggle colors and so). + * function returns -1, the ui manager will destroy the current panel and + * pass the key to the previous panel. + * * @param panel Ncurses panel pointer * @param key Pressed keycode diff --git a/src/curses/ui_manager.c b/src/curses/ui_manager.c index db242ea..c39b406 100644 --- a/src/curses/ui_manager.c +++ b/src/curses/ui_manager.c @@ -227,17 +227,29 @@ wait_for_input() if (c == ERR) continue; - // Check if current panel has custom bindings for that key capture_lock(); - if ((c = ui_handle_key(ui, c)) == 0) { - capture_unlock(); - // Key has been handled by panel - continue; + // Handle received key + int key = c; + while (c != KEY_HANDLED) { + // Check if current panel has custom bindings for that key + c = ui_handle_key(ui, c); + + if (c == KEY_HANDLED) { + // Panel handled this key + continue; + } else if (c == KEY_PROPAGATED) { + // restore the key value + c = key; + // Destroy current panel + ui_destroy(ui); + // Try to handle this key with the previus panel + ui = ui_find_by_panel(panel_below(NULL)); + } else { + // Key not handled by UI nor propagated. Use default handler + c = default_handle_key(ui, c); + } } capture_unlock(); - - // Key not handled by UI, try default handler - default_handle_key(ui, c); } return -1; @@ -288,8 +300,8 @@ default_handle_key(ui_t *ui, int key) break; } - // Return this is a valid handled key - return (action == ERR) ? key : 0; + // Consider the key handled at this point + return KEY_HANDLED; } void diff --git a/src/curses/ui_manager.h b/src/curses/ui_manager.h index 831234e..e8dd8ff 100644 --- a/src/curses/ui_manager.h +++ b/src/curses/ui_manager.h @@ -49,6 +49,9 @@ #define DIALOG_MAX_WIDTH 100 #define DIALOG_MIN_WIDTH 40 +//! Possible key handler results +#define KEY_HANDLED 0 +#define KEY_PROPAGATED -1 /** * Define existing panels @@ -121,7 +124,7 @@ wait_for_input(); /** * @brief Default handler for keys * - * If ui doesn't handle the given key (ui_handle_key returns -1) + * If ui doesn't handle the given key (ui_handle_key returns the key value) * then the default handler will be invoked * * @param ui Current displayed UI structure diff --git a/src/keybinding.c b/src/keybinding.c index 9a9fb1d..0e15daa 100644 --- a/src/keybinding.c +++ b/src/keybinding.c @@ -54,7 +54,7 @@ key_binding_t bindings[ACTION_SENTINEL] = { { ACTION_NEXT_FIELD, "nfield", { KEY_DOWN, KEY_TAB }, 2 }, { ACTION_RESIZE_SCREEN, "", { KEY_RESIZE }, 1 }, { ACTION_CLEAR, "clear", { KEY_CTRL('U'), KEY_CTRL('W')}, 2 }, - { ACTION_CLEAR_CALLS, "clearcalls", { KEY_F(5) }, 1 }, + { ACTION_CLEAR_CALLS, "clearcalls", { KEY_F(5), KEY_CTRL('L')}, 2 }, { ACTION_SEARCH_XCALL, "searchxcall", { 'X' }, 1 }, { ACTION_TOGGLE_SYNTAX, "togglesyntax", { KEY_F(8), 'C' }, 2 }, { ACTION_CYCLE_COLOR, "colormode", { 'c' }, 1 },