static inline cb_ret_t tree_key (WTree *tree, int key) { int i; for (i = 0; tree_keymap [i].key_code; i++){ if (key == tree_keymap [i].key_code){ if (tree_keymap [i].fn != tree_start_search) tree->searching = 0; (*tree_keymap [i].fn)(tree); show_tree (tree); return MSG_HANDLED; } } /* We do not want to use them if we do not need to */ /* Input line may want to take the motion key event */ if (key == KEY_LEFT) return move_left (tree) ? MSG_HANDLED : MSG_NOT_HANDLED; if (key == KEY_RIGHT) return move_right (tree) ? MSG_HANDLED : MSG_NOT_HANDLED; if (is_abort_char (key)) { if (tree->is_panel) { tree->searching = 0; show_tree (tree); return MSG_HANDLED; /* eat abort char */ } /* modal tree dialog: let upper layer see the abort character and close the dialog */ return MSG_NOT_HANDLED; } /* Do not eat characters not meant for the tree below ' ' (e.g. C-l). */ if ((key >= ' ' && key <= 255) || key == KEY_BACKSPACE) { if (tree->searching){ tree_do_search (tree, key); show_tree (tree); return MSG_HANDLED; } if (!command_prompt) { tree_start_search (tree); tree_do_search (tree, key); return MSG_HANDLED; } return tree->is_panel ? MSG_HANDLED : MSG_NOT_HANDLED; } return MSG_NOT_HANDLED; }
static cb_ret_t tree_key (WTree * tree, int key) { size_t i; if (is_abort_char (key)) { if (tree->is_panel) { tree->searching = 0; show_tree (tree); return MSG_HANDLED; /* eat abort char */ } /* modal tree dialog: let upper layer see the abort character and close the dialog */ return MSG_NOT_HANDLED; } if (tree->searching && ((key >= ' ' && key <= 255) || key == KEY_BACKSPACE)) { tree_do_search (tree, key); show_tree (tree); return MSG_HANDLED; } for (i = 0; tree_map[i].key != 0; i++) if (key == tree_map[i].key) switch (tree_map[i].command) { case CK_Left: return tree_move_left (tree) ? MSG_HANDLED : MSG_NOT_HANDLED; case CK_Right: return tree_move_right (tree) ? MSG_HANDLED : MSG_NOT_HANDLED; default: tree_execute_cmd (tree, tree_map[i].command); return MSG_HANDLED; } /* Do not eat characters not meant for the tree below ' ' (e.g. C-l). */ if (!command_prompt && ((key >= ' ' && key <= 255) || key == KEY_BACKSPACE)) { tree_start_search (tree); tree_do_search (tree, key); return MSG_HANDLED; } return MSG_NOT_HANDLED; }
static int menubar_handle_key (WMenuBar * menubar, int key) { /* Lowercase */ if (isascii (key)) key = g_ascii_tolower (key); if (is_abort_char (key)) { menubar_finish (menubar); return 1; } /* menubar help or menubar navigation */ switch (key) { case KEY_F (1): { ev_help_t event_data = { NULL, NULL }; if (menubar->is_dropped) event_data.node = MENU (g_list_nth_data (menubar->menu, menubar->selected))->help_node; else event_data.node = "[Menu Bar]"; mc_event_raise (MCEVENT_GROUP_CORE, "help", &event_data); menubar_draw (menubar); return 1; } case KEY_LEFT: case XCTRL ('b'): menubar_left (menubar); return 1; case KEY_RIGHT: case XCTRL ('f'): menubar_right (menubar); return 1; default: break; } if (!menubar->is_dropped) { GList *i; /* drop menu by hotkey */ for (i = menubar->menu; i != NULL; i = g_list_next (i)) { menu_t *menu = MENU (i->data); if ((menu->text.hotkey != NULL) && (key == g_ascii_tolower (menu->text.hotkey[0]))) { menubar_drop (menubar, g_list_position (menubar->menu, i)); return 1; } } /* drop menu by Enter or Dowwn key */ if (key == KEY_ENTER || key == XCTRL ('n') || key == KEY_DOWN || key == '\n') menubar_drop (menubar, menubar->selected); return 1; } { menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected)); GList *i; /* execute menu command by hotkey */ for (i = menu->entries; i != NULL; i = g_list_next (i)) { const menu_entry_t *entry = MENUENTRY (i->data); if ((entry != NULL) && (entry->command != CK_IgnoreKey) && (entry->text.hotkey != NULL) && (key == g_ascii_tolower (entry->text.hotkey[0]))) { menu->selected = g_list_position (menu->entries, i); menubar_execute (menubar); return 1; } } /* menu execute by Enter or menu navigation */ switch (key) { case KEY_ENTER: case '\n': menubar_execute (menubar); return 1; case KEY_HOME: case ALT ('<'): menubar_first (menubar); break; case KEY_END: case ALT ('>'): menubar_last (menubar); break; case KEY_DOWN: case XCTRL ('n'): menubar_down (menubar); break; case KEY_UP: case XCTRL ('p'): menubar_up (menubar); break; default: break; } } return 0; }