int wait_for_input() { ui_t *ui; WINDOW *win; PANEL *panel; // While there are still panels while ((panel = panel_below(NULL))) { // Get panel interface structure ui = ui_find_by_panel(panel); // Redraw this panel if (ui_draw_panel(ui) != 0) return -1; // Update panel stack update_panels(); doupdate(); // Get topmost panel panel = panel_below(NULL); // Enable key input on current panel win = panel_window(panel); keypad(win, TRUE); // Get pressed key int c = wgetch(win); // Timeout, no key pressed if (c == ERR) continue; // Check if current panel has custom bindings for that key if ((c = ui_handle_key(ui, c)) == 0) { // Key has been handled by panel continue; } // Key not handled by UI, try default handler default_handle_key(ui, c); } return -1; }
int call_raw_handle_key(PANEL *panel, int key) { call_raw_info_t *info; ui_t *next_panel; int rnpag_steps = setting_get_intvalue(SETTING_CR_SCROLLSTEP); int action = -1; // Sanity check, this should not happen if (!(info = call_raw_info(panel))) return -1; // Check actions for this key while ((action = key_find_action(key, action)) != ERR) { // Check if we handle this action switch (action) { case ACTION_DOWN: info->scroll++; break; case ACTION_UP: info->scroll--; break; case ACTION_HNPAGE: rnpag_steps = rnpag_steps / 2; /* no break */ case ACTION_NPAGE: // Next page => N key down strokes info->scroll += rnpag_steps; break; case ACTION_HPPAGE: rnpag_steps = rnpag_steps / 2; /* no break */ case ACTION_PPAGE: // Prev page => N key up strokes info->scroll -= rnpag_steps; break; case ACTION_SHOW_HOSTNAMES: // Tooggle Host/Address display setting_toggle(SETTING_DISPLAY_HOST); // Force refresh panel if (info->group) { call_raw_set_group(info->group); } else { call_raw_set_msg(info->msg); } break; case ACTION_SAVE: if (info->group) { // KEY_S, Display save panel next_panel = ui_create_panel(PANEL_SAVE); save_set_group(ui_get_panel(next_panel), info->group); } break; case ACTION_TOGGLE_SYNTAX: case ACTION_CYCLE_COLOR: // Handle colors using default handler default_handle_key(ui_find_by_panel(panel), key); // Create a new pad (forces messages draw) delwin(info->pad); info->pad = newpad(500, COLS); info->last = NULL; // Force refresh panel if (info->group) { call_raw_set_group(info->group); } else { call_raw_set_msg(info->msg); } break; default: // Parse next action continue; } // This panel has handled the key successfully break; } if (info->scroll < 0 || info->padline < LINES) { info->scroll = 0; // Disable scrolling if there's nothing to scroll } else { if (info->scroll + LINES / 2 > info->padline) info->scroll = info->padline - LINES / 2; } // Return if this panel has handled or not the key return (action == ERR) ? key : 0; }