Keystroke propagation: redraw panels only if necessary

- Make panel key handlers return '-1' instead of '-2' if propagation needed
- Define key handlers return types: KEY_HANDLED (0), KEY_PROPAGATED (-1)
- Describe the feature in panel help
This commit is contained in:
José Luis Millán 2016-02-19 06:54:42 +01:00
parent 3ae702f211
commit 5bdd5fc9ef
6 changed files with 49 additions and 49 deletions

View File

@ -1282,7 +1282,7 @@ call_flow_handle_key(PANEL *panel, int key)
break;
case ACTION_CLEAR_CALLS:
// Propagate the key to the previous panel
return -2;
return -1;
default:
// Parse next action
@ -1338,20 +1338,21 @@ call_flow_help(PANEL *panel)
// 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, "F9/l Turn on/off resolved addresses");
mvwprintw(help_win, 20, 2, "9/0 Increase/Decrease raw preview size");
mvwprintw(help_win, 21, 2, "t Toggle raw preview display");
mvwprintw(help_win, 22, 2, "T Restore raw preview size");
mvwprintw(help_win, 23, 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

View File

@ -335,10 +335,8 @@ call_flow_draw_raw_rtcp(PANEL *panel, 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). If this function
* returns -2, the ui manager will destroy the current panel and pass the key
* to the previous panel.
* 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

View File

@ -269,7 +269,7 @@ call_raw_handle_key(PANEL *panel, int key)
break;
case ACTION_CLEAR_CALLS:
// Propagate the key to the previous panel
return -2;
return -1;
default:
// Parse next action
continue;

View File

@ -116,10 +116,8 @@ call_raw_print_msg(PANEL *panel, 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). If this function
* returns -2, the ui manager will destroy the current panel and pass the key
* to the previous panel.
* function returns -1, the ui manager will destroy the current panel and
* pass the key to the previous panel.
*
* @param panel Ncurses panel pointer

View File

@ -302,9 +302,6 @@ wait_for_input()
WINDOW *win;
PANEL *panel;
int c = ERR;
int rekey = 0;
// While there are still panels
while ((panel = panel_below(NULL))) {
@ -325,31 +322,33 @@ wait_for_input()
win = panel_window(panel);
keypad(win, TRUE);
if (rekey == 0) {
// Get pressed key
c = wgetch(win);
// Get pressed key
int c = wgetch(win);
// Timeout, no key pressed
if (c == ERR)
continue;
} else {
rekey = 0;
}
// Check if current panel has custom bindings for that key
int ret = ui_handle_key(ui, c);
if (ret == 0) {
// Key has been handled by panel
// Timeout, no key pressed
if (c == ERR)
continue;
} else if (ret == -2) {
// Propagate the key to the previous panel
ui_destroy(ui);
rekey = 1;
continue;
}
// Key not handled by UI, try default handler
default_handle_key(ui, c);
// Handle received key
int hdl = -1;
while (hdl != KEY_HANDLED) {
// Check if current panel has custom bindings for that key
hdl = ui_handle_key(ui, c);
if (hdl == KEY_HANDLED) {
// Panel handled this key
continue;
} else if (hdl == KEY_PROPAGATED) {
// 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
default_handle_key(ui, c);
break;
}
}
}
return -1;

View File

@ -55,6 +55,10 @@
#define DIALOG_MAX_WIDTH 100
#define DIALOG_MIN_WIDTH 40
//! Possible key handler results
#define KEY_HANDLED 0
#define KEY_PROPAGATED -1
//! Shorter declaration of ui structure
typedef struct ui ui_t;