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 cb_ret_t tree_execute_cmd (WTree * tree, long command) { cb_ret_t res = MSG_HANDLED; if (command != CK_Search) tree->searching = 0; switch (command) { case CK_Help: { ev_help_t event_data = { NULL, "[Directory Tree]" }; mc_event_raise (MCEVENT_GROUP_CORE, "help", &event_data); } break; case CK_Forget: tree_forget (tree); break; case CK_ToggleNavigation: tree_toggle_navig (tree); break; case CK_Copy: tree_copy (tree, ""); break; case CK_Move: tree_move (tree, ""); break; case CK_Up: tree_move_up (tree); break; case CK_Down: tree_move_down (tree); break; case CK_Top: tree_move_home (tree); break; case CK_Bottom: tree_move_end (tree); break; case CK_PageUp: tree_move_pgup (tree); break; case CK_PageDown: tree_move_pgdn (tree); break; case CK_Enter: tree_chdir_sel (tree); break; case CK_Reread: tree_rescan (tree); break; case CK_Search: tree_start_search (tree); break; case CK_Delete: tree_rmdir (tree); break; case CK_Quit: if (!tree->is_panel) dlg_stop (WIDGET (tree)->owner); return res; default: res = MSG_NOT_HANDLED; } show_tree (tree); return res; }