Browse Source

Implemented keybindings engine for ButtonBar (F1-F10 keys).

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Andrew Borodin 15 years ago
parent
commit
c2693b7212
10 changed files with 181 additions and 344 deletions
  1. 20 64
      edit/editwidget.c
  2. 4 0
      src/boxes.c
  3. 18 27
      src/help.c
  4. 18 11
      src/main.c
  5. 32 48
      src/tree.c
  6. 4 0
      src/tree.h
  7. 35 105
      src/viewer/actions_cmd.c
  8. 26 36
      src/viewer/display.c
  9. 0 10
      src/viewer/internal.h
  10. 24 43
      src/widget.c

+ 20 - 64
edit/editwidget.c

@@ -191,6 +191,7 @@ edit_dialog_callback (Dlg_head *h, Widget *sender,
 {
 {
     WEdit *edit;
     WEdit *edit;
     WMenuBar *menubar;
     WMenuBar *menubar;
+    WButtonBar *buttonbar;
 
 
     edit = (WEdit *) find_widget_type (h, edit_callback);
     edit = (WEdit *) find_widget_type (h, edit_callback);
 
 
@@ -206,8 +207,11 @@ edit_dialog_callback (Dlg_head *h, Widget *sender,
 
 
     case DLG_ACTION:
     case DLG_ACTION:
 	menubar = find_menubar (h);
 	menubar = find_menubar (h);
-	if (sender == &menubar->widget)
-	    return edit_command_execute (edit, parm);
+	if (sender == (Widget *) menubar)
+	    return send_message (wedit, WIDGET_COMMAND, parm);
+	buttonbar = find_buttonbar (h);
+	if (sender == (Widget *) buttonbar)
+	    return send_message (wedit, WIDGET_COMMAND, parm);
 	return MSG_HANDLED;
 	return MSG_HANDLED;
 
 
     default:
     default:
@@ -263,73 +267,21 @@ edit_get_file_name (const WEdit *edit)
     return edit->filename;
     return edit->filename;
 }
 }
 
 
-static void cmd_F1 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (1));
-}
-
-static void cmd_F2 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (2));
-}
-
-static void cmd_F3 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (3));
-}
-
-static void cmd_F4 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (4));
-}
-
-static void cmd_F5 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (5));
-}
-
-static void cmd_F6 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (6));
-}
-
-static void cmd_F7 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (7));
-}
-
-static void cmd_F8 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (8));
-}
-
-#if 0
-static void cmd_F9 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (9));
-}
-#endif
-
-static void cmd_F10 (WEdit * edit)
-{
-    send_message ((Widget *) edit, WIDGET_KEY, KEY_F (10));
-}
-
 static void
 static void
 edit_set_buttonbar (WEdit *edit)
 edit_set_buttonbar (WEdit *edit)
 {
 {
     WButtonBar *bb = find_buttonbar (edit->widget.parent);
     WButtonBar *bb = find_buttonbar (edit->widget.parent);
 
 
-    buttonbar_set_label_data (bb, 1, Q_("ButtonBar|Help"), (buttonbarfn) cmd_F1, edit);
-    buttonbar_set_label_data (bb, 2, Q_("ButtonBar|Save"), (buttonbarfn) cmd_F2, edit);
-    buttonbar_set_label_data (bb, 3, Q_("ButtonBar|Mark"), (buttonbarfn) cmd_F3, edit);
-    buttonbar_set_label_data (bb, 4, Q_("ButtonBar|Replac"), (buttonbarfn) cmd_F4, edit);
-    buttonbar_set_label_data (bb, 5, Q_("ButtonBar|Copy"), (buttonbarfn) cmd_F5, edit);
-    buttonbar_set_label_data (bb, 6, Q_("ButtonBar|Move"), (buttonbarfn) cmd_F6, edit);
-    buttonbar_set_label_data (bb, 7, Q_("ButtonBar|Search"), (buttonbarfn) cmd_F7, edit);
-    buttonbar_set_label_data (bb, 8, Q_("ButtonBar|Delete"), (buttonbarfn) cmd_F8, edit);
-    buttonbar_set_label_data (bb, 9, Q_("ButtonBar|PullDn"), (buttonbarfn) edit_menu_cmd, edit);
-    buttonbar_set_label_data (bb, 10, Q_("ButtonBar|Quit"), (buttonbarfn) cmd_F10, edit);
+    buttonbar_set_label (bb,  1, Q_("ButtonBar|Help"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  2, Q_("ButtonBar|Save"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  3, Q_("ButtonBar|Mark"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  4, Q_("ButtonBar|Replac"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  5, Q_("ButtonBar|Copy"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  6, Q_("ButtonBar|Move"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  7, Q_("ButtonBar|Search"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  8, Q_("ButtonBar|Delete"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb,  9, Q_("ButtonBar|PullDn"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb, 10, Q_("ButtonBar|Quit"), editor_map, (Widget *) edit);
 }
 }
 
 
 void
 void
@@ -387,6 +339,10 @@ edit_callback (Widget *w, widget_msg_t msg, int parm)
 	    }
 	    }
 	}
 	}
 
 
+    case WIDGET_COMMAND:
+	/* command from menubar or buttonbar */
+	return edit_command_execute (wedit, parm);
+
     case WIDGET_CURSOR:
     case WIDGET_CURSOR:
 	widget_move (&e->widget, e->curs_row + EDIT_TEXT_VERTICAL_OFFSET,
 	widget_move (&e->widget, e->curs_row + EDIT_TEXT_VERTICAL_OFFSET,
 		     e->curs_col + e->start_col + e->over_col +
 		     e->curs_col + e->start_col + e->over_col +

+ 4 - 0
src/boxes.c

@@ -649,6 +649,10 @@ tree_callback (Dlg_head *h, Widget *sender,
 	}
 	}
 	return MSG_HANDLED;
 	return MSG_HANDLED;
 
 
+    case DLG_ACTION:
+	/* command from buttonbar */
+	return send_message ((Widget *) find_tree (h), WIDGET_COMMAND, parm);
+
     default:
     default:
 	return default_dlg_callback (h, sender, msg, parm, data);
 	return default_dlg_callback (h, sender, msg, parm, data);
     }
     }

+ 18 - 27
src/help.c

@@ -549,9 +549,8 @@ help_event (Gpm_Event *event, void *vp)
 
 
 /* show help */
 /* show help */
 static void
 static void
-help_help (void *vp)
+help_help (Dlg_head *h)
 {
 {
-    Dlg_head *h = vp;
     const char *p;
     const char *p;
 
 
     history_ptr = (history_ptr + 1) % HISTORY_SIZE;
     history_ptr = (history_ptr + 1) % HISTORY_SIZE;
@@ -567,9 +566,8 @@ help_help (void *vp)
 }
 }
 
 
 static void
 static void
-help_index (void *vp)
+help_index (Dlg_head *h)
 {
 {
-    Dlg_head *h = vp;
     const char *new_item;
     const char *new_item;
 
 
     new_item = search_string (fdata, "[Contents]");
     new_item = search_string (fdata, "[Contents]");
@@ -589,16 +587,8 @@ help_index (void *vp)
 }
 }
 
 
 static void
 static void
-help_quit (void *vp)
+help_back (Dlg_head *h)
 {
 {
-    dlg_stop ((Dlg_head *) vp);
-}
-
-static void
-help_back (void *vp)
-{
-    Dlg_head *h = vp;
-
     currentpoint = history [history_ptr].page;
     currentpoint = history [history_ptr].page;
     selected_item = history [history_ptr].link;
     selected_item = history [history_ptr].link;
     history_ptr--;
     history_ptr--;
@@ -740,23 +730,19 @@ help_select_link (void)
 }
 }
 
 
 static cb_ret_t
 static cb_ret_t
-help_execute_cmd (Widget *sender, Widget *receiver,
-		    unsigned long command, const void *data)
+help_execute_cmd (unsigned long command)
 {
 {
     cb_ret_t ret = MSG_HANDLED;
     cb_ret_t ret = MSG_HANDLED;
 
 
-    (void) sender;
-    (void) receiver;
-
     switch (command) {
     switch (command) {
     case CK_HelpHelp:
     case CK_HelpHelp:
-	help_help ((void *) data);
+	help_help (whelp);
 	break;
 	break;
     case CK_HelpIndex:
     case CK_HelpIndex:
-	help_index ((void *) data);
+	help_index (whelp);
 	break;
 	break;
     case CK_HelpBack:
     case CK_HelpBack:
-	help_back ((void *) data);
+	help_back (whelp);
 	break;
 	break;
     case CK_HelpMoveUp:
     case CK_HelpMoveUp:
 	help_prev_link (TRUE);
 	help_prev_link (TRUE);
@@ -804,7 +790,7 @@ help_handle_key (Dlg_head *h, int c)
 
 
 	command = lookup_keymap_command (help_map, c);
 	command = lookup_keymap_command (help_map, c);
 	if ((command == CK_Ignore_Key)
 	if ((command == CK_Ignore_Key)
-	    || (help_execute_cmd (NULL, NULL, command, h) == MSG_NOT_HANDLED))
+	    || (help_execute_cmd (command) == MSG_NOT_HANDLED))
 		return MSG_NOT_HANDLED;
 		return MSG_NOT_HANDLED;
     }
     }
 
 
@@ -813,7 +799,8 @@ help_handle_key (Dlg_head *h, int c)
 }
 }
 
 
 static cb_ret_t
 static cb_ret_t
-help_callback (Dlg_head *h, Widget *sender, dlg_msg_t msg, int parm, void *data)
+help_callback (Dlg_head *h, Widget *sender,
+		dlg_msg_t msg, int parm, void *data)
 {
 {
     WButtonBar *bb;
     WButtonBar *bb;
 
 
@@ -833,6 +820,10 @@ help_callback (Dlg_head *h, Widget *sender, dlg_msg_t msg, int parm, void *data)
     case DLG_KEY:
     case DLG_KEY:
 	return help_handle_key (h, parm);
 	return help_handle_key (h, parm);
 
 
+    case DLG_ACTION:
+	/* command from buttonbar */
+	return help_execute_cmd (parm);
+
     default:
     default:
 	return default_dlg_callback (h, sender, msg, parm, data);
 	return default_dlg_callback (h, sender, msg, parm, data);
     }
     }
@@ -963,16 +954,16 @@ interactive_display (const char *filename, const char *node)
     add_widget (whelp, md);
     add_widget (whelp, md);
     add_widget (whelp, help_bar);
     add_widget (whelp, help_bar);
 
 
-    buttonbar_set_label_data (help_bar, 1, Q_("ButtonBar|Help"), help_help, whelp);
-    buttonbar_set_label_data (help_bar, 2, Q_("ButtonBar|Index"), help_index, whelp);
-    buttonbar_set_label_data (help_bar, 3, Q_("ButtonBar|Prev"), help_back, whelp);
+    buttonbar_set_label (help_bar, 1, Q_("ButtonBar|Help"), help_map, NULL);
+    buttonbar_set_label (help_bar, 2, Q_("ButtonBar|Index"), help_map, NULL);
+    buttonbar_set_label (help_bar, 3, Q_("ButtonBar|Prev"), help_map, NULL);
     buttonbar_clear_label (help_bar, 4);
     buttonbar_clear_label (help_bar, 4);
     buttonbar_clear_label (help_bar, 5);
     buttonbar_clear_label (help_bar, 5);
     buttonbar_clear_label (help_bar, 6);
     buttonbar_clear_label (help_bar, 6);
     buttonbar_clear_label (help_bar, 7);
     buttonbar_clear_label (help_bar, 7);
     buttonbar_clear_label (help_bar, 8);
     buttonbar_clear_label (help_bar, 8);
     buttonbar_clear_label (help_bar, 9);
     buttonbar_clear_label (help_bar, 9);
-    buttonbar_set_label_data (help_bar, 10, Q_("ButtonBar|Quit"), help_quit, whelp);
+    buttonbar_set_label (help_bar, 10, Q_("ButtonBar|Quit"), help_map, NULL);
 
 
     run_dlg (whelp);
     run_dlg (whelp);
     interactive_display_finish ();
     interactive_display_finish ();

+ 18 - 11
src/main.c

@@ -1114,16 +1114,16 @@ copy_other_tagged (void)
 void
 void
 midnight_set_buttonbar (WButtonBar *b)
 midnight_set_buttonbar (WButtonBar *b)
 {
 {
-    buttonbar_set_label (b,  1, Q_("ButtonBar|Help"), help_cmd);
-    buttonbar_set_label (b,  2, Q_("ButtonBar|Menu"), user_file_menu_cmd);
-    buttonbar_set_label (b,  3, Q_("ButtonBar|View"), view_cmd);
-    buttonbar_set_label (b,  4, Q_("ButtonBar|Edit"), edit_cmd);
-    buttonbar_set_label (b,  5, Q_("ButtonBar|Copy"), copy_cmd);
-    buttonbar_set_label (b,  6, Q_("ButtonBar|RenMov"), rename_cmd);
-    buttonbar_set_label (b,  7, Q_("ButtonBar|Mkdir"), mkdir_cmd);
-    buttonbar_set_label (b,  8, Q_("ButtonBar|Delete"), delete_cmd);
-    buttonbar_set_label (b,  9, Q_("ButtonBar|PullDn"), menu_cmd);
-    buttonbar_set_label (b, 10, Q_("ButtonBar|Quit"), quit_cmd);
+    buttonbar_set_label (b,  1, Q_("ButtonBar|Help"), main_map, NULL);
+    buttonbar_set_label (b,  2, Q_("ButtonBar|Menu"), main_map, NULL);
+    buttonbar_set_label (b,  3, Q_("ButtonBar|View"), main_map, NULL);
+    buttonbar_set_label (b,  4, Q_("ButtonBar|Edit"), main_map, NULL);
+    buttonbar_set_label (b,  5, Q_("ButtonBar|Copy"), main_map, NULL);
+    buttonbar_set_label (b,  6, Q_("ButtonBar|RenMov"), main_map, NULL);
+    buttonbar_set_label (b,  7, Q_("ButtonBar|Mkdir"), main_map, NULL);
+    buttonbar_set_label (b,  8, Q_("ButtonBar|Delete"), main_map, NULL);
+    buttonbar_set_label (b,  9, Q_("ButtonBar|PullDn"), main_map, NULL);
+    buttonbar_set_label (b, 10, Q_("ButtonBar|Quit"), main_map, NULL);
 }
 }
 
 
 static gboolean ctl_x_map_enabled = FALSE;
 static gboolean ctl_x_map_enabled = FALSE;
@@ -1726,8 +1726,15 @@ midnight_callback (Dlg_head *h, Widget *sender,
 	if (sender == NULL)
 	if (sender == NULL)
 	    midnight_execute_cmd (NULL, parm);
 	    midnight_execute_cmd (NULL, parm);
 	/* message from menu */
 	/* message from menu */
-	else if (sender == &the_menubar->widget)
+	else if (sender == (Widget *) the_menubar)
 	    midnight_execute_cmd (sender, parm);
 	    midnight_execute_cmd (sender, parm);
+	/* message from buttonbar */
+	else if (sender == (Widget *) the_bar) {
+	    if (data == NULL)
+		midnight_execute_cmd (sender, parm);
+	    else
+		return send_message ((Widget *) data, WIDGET_COMMAND, parm);
+	}
 	return MSG_HANDLED;
 	return MSG_HANDLED;
 
 
     default:
     default:

+ 32 - 48
src/tree.c

@@ -91,7 +91,6 @@ struct WTree {
 
 
 /* Forwards */
 /* Forwards */
 static void tree_rescan (void *data);
 static void tree_rescan (void *data);
-static void tree_toggle_f4 (void *data);
 
 
 static tree_entry *
 static tree_entry *
 back_ptr (tree_entry *ptr, int *count)
 back_ptr (tree_entry *ptr, int *count)
@@ -753,16 +752,6 @@ tree_rmdir (void *data)
     file_op_context_destroy (ctx);
     file_op_context_destroy (ctx);
 }
 }
 
 
-static void
-tree_toggle_navig (WTree *tree)
-{
-    tree_navigation_flag = !tree_navigation_flag;
-    buttonbar_set_label_data (find_buttonbar (tree->widget.parent), 4,
-			tree_navigation_flag ? Q_("ButtonBar|Static")
-						: Q_("ButtonBar|Dynamc"),
-			tree_toggle_f4, tree);
-}
-
 static inline void
 static inline void
 tree_move_up (WTree *tree)
 tree_move_up (WTree *tree)
 {
 {
@@ -866,6 +855,16 @@ tree_start_search (WTree *tree)
     }
     }
 }
 }
 
 
+static void
+tree_toggle_navig (WTree *tree)
+{
+    tree_navigation_flag = !tree_navigation_flag;
+    buttonbar_set_label (find_buttonbar (tree->widget.parent), 4,
+			tree_navigation_flag ? Q_("ButtonBar|Static")
+						: Q_("ButtonBar|Dynamc"),
+			tree_map, (Widget *) tree);
+}
+
 static cb_ret_t
 static cb_ret_t
 tree_execute_cmd (WTree *tree, unsigned long command)
 tree_execute_cmd (WTree *tree, unsigned long command)
 {
 {
@@ -929,31 +928,6 @@ tree_execute_cmd (WTree *tree, unsigned long command)
     return res;
     return res;
 }
 }
 
 
-/* temporary wrappers */
-static void
-tree_help (void *data)
-{
-    tree_execute_cmd ((WTree *) data, CK_TreeHelp);
-}
-
-static void
-tree_toggle_f4 (void *data)
-{
-    tree_execute_cmd ((WTree *) data, CK_TreeToggleNav);
-}
-
-static void
-tree_copy_cmd (void *data)
-{
-    tree_execute_cmd ((WTree *) data, CK_TreeCopy);
-}
-
-static void
-tree_move_cmd (void *data)
-{
-    tree_execute_cmd ((WTree *) data, CK_TreeMove);
-}
-
 static cb_ret_t
 static cb_ret_t
 tree_key (WTree *tree, int key)
 tree_key (WTree *tree, int key)
 {
 {
@@ -1030,26 +1004,23 @@ tree_callback (Widget *w, widget_msg_t msg, int parm)
 	show_tree (tree);
 	show_tree (tree);
 	return MSG_HANDLED;
 	return MSG_HANDLED;
 
 
-    case WIDGET_KEY:
-	return tree_key (tree, parm);
-
     case WIDGET_FOCUS:
     case WIDGET_FOCUS:
 	tree->active = 1;
 	tree->active = 1;
-	buttonbar_set_label_data (b, 1, Q_("ButtonBar|Help"), tree_help, tree);
-	buttonbar_set_label_data (b, 2, Q_("ButtonBar|Rescan"), tree_rescan, tree);
-	buttonbar_set_label_data (b, 3, Q_("ButtonBar|Forget"), tree_forget, tree);
-	buttonbar_set_label_data (b, 4, tree_navigation_flag ? Q_("ButtonBar|Static")
+	buttonbar_set_label (b, 1, Q_("ButtonBar|Help"), tree_map, (Widget *) tree);
+	buttonbar_set_label (b, 2, Q_("ButtonBar|Rescan"), tree_map, (Widget *) tree);
+	buttonbar_set_label (b, 3, Q_("ButtonBar|Forget"), tree_map, (Widget *) tree);
+	buttonbar_set_label (b, 4, tree_navigation_flag ? Q_("ButtonBar|Static")
 								: Q_("ButtonBar|Dynamc"),
 								: Q_("ButtonBar|Dynamc"),
-			    tree_toggle_f4, tree);
-	buttonbar_set_label_data (b, 5, Q_("ButtonBar|Copy"), tree_copy_cmd, tree);
-	buttonbar_set_label_data (b, 6, Q_("ButtonBar|RenMov"), tree_move_cmd, tree);
+			    tree_map, (Widget *) tree);
+	buttonbar_set_label (b, 5, Q_("ButtonBar|Copy"), tree_map, (Widget *) tree);
+	buttonbar_set_label (b, 6, Q_("ButtonBar|RenMov"), tree_map, (Widget *) tree);
 #if 0
 #if 0
 	/* FIXME: mkdir is currently defunct */
 	/* FIXME: mkdir is currently defunct */
-	buttonbar_set_label_data (b, 7, Q_("ButtonBar|Mkdir"), tree_mkdir, tree);
+	buttonbar_set_label (b, 7, Q_("ButtonBar|Mkdir"), tree_map, (Widget *) tree);
 #else
 #else
 	buttonbar_clear_label (b, 7);
 	buttonbar_clear_label (b, 7);
 #endif
 #endif
-	buttonbar_set_label_data (b, 8, Q_("ButtonBar|Rmdir"), tree_rmdir, tree);
+	buttonbar_set_label (b, 8, Q_("ButtonBar|Rmdir"), tree_map, (Widget *) tree);
 	buttonbar_redraw (b);
 	buttonbar_redraw (b);
 
 
 	/* FIXME: Should find a better way of only displaying the
 	/* FIXME: Should find a better way of only displaying the
@@ -1065,6 +1036,13 @@ tree_callback (Widget *w, widget_msg_t msg, int parm)
 	show_tree (tree);
 	show_tree (tree);
 	return MSG_HANDLED;
 	return MSG_HANDLED;
 
 
+    case WIDGET_KEY:
+	return tree_key (tree, parm);
+
+    case WIDGET_COMMAND:
+	/* command from buttonbar */
+	return tree_execute_cmd (tree, parm);
+
     case WIDGET_DESTROY:
     case WIDGET_DESTROY:
 	tree_destroy (tree);
 	tree_destroy (tree);
 	return MSG_HANDLED;
 	return MSG_HANDLED;
@@ -1123,3 +1101,9 @@ sync_tree (const char *path)
 {
 {
     tree_chdir (the_tree, path);
     tree_chdir (the_tree, path);
 }
 }
+
+WTree *
+find_tree (struct Dlg_head *h)
+{
+    return (WTree *) find_widget_type (h, tree_callback);
+}

+ 4 - 0
src/tree.h

@@ -18,4 +18,8 @@ char *tree_selected_name (const WTree *tree);
 
 
 void sync_tree (const char *pathname);
 void sync_tree (const char *pathname);
 
 
+struct Dlg_head;
+
+WTree *find_tree (struct Dlg_head *h);
+
 #endif					/* MC_TREE_H */
 #endif					/* MC_TREE_H */

+ 35 - 105
src/viewer/actions_cmd.c

@@ -79,6 +79,14 @@
 
 
 /*** file scope functions ************************************************************************/
 /*** file scope functions ************************************************************************/
 
 
+/* Both views */
+static void
+mcview_search (mcview_t *view)
+{
+    if (mcview_dialog_search (view))
+        mcview_do_search (view);
+}
+
 /* --------------------------------------------------------------------------------------------- */
 /* --------------------------------------------------------------------------------------------- */
 
 
 static void
 static void
@@ -102,7 +110,7 @@ mcview_continue_search_cmd (mcview_t * view)
             if (!view->search) {
             if (!view->search) {
                 /* if not... then ask for an expression */
                 /* if not... then ask for an expression */
                 g_free(view->last_search_string);
                 g_free(view->last_search_string);
-                mcview_search_cmd (view);
+                mcview_search (view);
             } else {
             } else {
                 view->search->search_type = view->search_type;
                 view->search->search_type = view->search_type;
                 view->search->is_all_charsets = view->search_all_codepages;
                 view->search->is_all_charsets = view->search_all_codepages;
@@ -116,7 +124,7 @@ mcview_continue_search_cmd (mcview_t * view)
         } else {
         } else {
             /* if not... then ask for an expression */
             /* if not... then ask for an expression */
             g_free(view->last_search_string);
             g_free(view->last_search_string);
-            mcview_search_cmd (view);
+            mcview_search (view);
         }
         }
     }
     }
 }
 }
@@ -327,15 +335,10 @@ mcview_handle_editkey (mcview_t * view, int key)
 /* --------------------------------------------------------------------------------------------- */
 /* --------------------------------------------------------------------------------------------- */
 
 
 static cb_ret_t
 static cb_ret_t
-mcview_execute_cmd (Widget *sender, Widget *receiver,
-		    unsigned long command, const void *data)
+mcview_execute_cmd (mcview_t *view, unsigned long command)
 {
 {
-    mcview_t *view = (mcview_t *) receiver;
     int res = MSG_HANDLED;
     int res = MSG_HANDLED;
 
 
-    (void) sender;
-    (void) data;
-
     switch (command) {
     switch (command) {
     case CK_ViewHelp:
     case CK_ViewHelp:
         interactive_display (NULL, "[Internal File Viewer]");
         interactive_display (NULL, "[Internal File Viewer]");
@@ -356,13 +359,18 @@ mcview_execute_cmd (Widget *sender, Widget *receiver,
         mcview_update (view); /* FIXME: view->dirty++ ? */
         mcview_update (view); /* FIXME: view->dirty++ ? */
         break;
         break;
     case CK_ViewGoto:
     case CK_ViewGoto:
-        mcview_goto (view);
+        if (view->hex_mode)
+            mcview_moveto_addr_cmd (view);
+        else
+            mcview_moveto_line_cmd (view);
+        view->dirty++;
+        mcview_update (view); /* FIXME: unneeded? */
         break;
         break;
     case CK_ViewHexEditSave:
     case CK_ViewHexEditSave:
         mcview_hexedit_save_changes (view);
         mcview_hexedit_save_changes (view);
         break;
         break;
     case CK_ViewSearch:
     case CK_ViewSearch:
-        mcview_search_cmd (view);
+        mcview_search (view);
         break;
         break;
     case CK_ViewToggleMagicMode:
     case CK_ViewToggleMagicMode:
         mcview_toggle_magic_mode (view);
         mcview_toggle_magic_mode (view);
@@ -467,13 +475,13 @@ mcview_handle_key (mcview_t * view, int key)
 
 
         command = lookup_keymap_command (view->hex_map, key);
         command = lookup_keymap_command (view->hex_map, key);
         if ((command != CK_Ignore_Key)
         if ((command != CK_Ignore_Key)
-            && (mcview_execute_cmd (NULL, &view->widget, command, NULL) == MSG_HANDLED))
+            && (mcview_execute_cmd (view, command) == MSG_HANDLED))
                 return MSG_HANDLED;
                 return MSG_HANDLED;
     }
     }
 
 
     command = lookup_keymap_command (view->plain_map, key);
     command = lookup_keymap_command (view->plain_map, key);
     if ((command != CK_Ignore_Key)
     if ((command != CK_Ignore_Key)
-        && (mcview_execute_cmd (NULL, &view->widget, command, NULL) == MSG_HANDLED))
+        && (mcview_execute_cmd (view, command) == MSG_HANDLED))
             return MSG_HANDLED;
             return MSG_HANDLED;
 
 
     if (mcview_check_left_right_keys (view, key))
     if (mcview_check_left_right_keys (view, key))
@@ -531,7 +539,15 @@ mcview_callback (Widget * w, widget_msg_t msg, int parm)
         return MSG_HANDLED;
         return MSG_HANDLED;
 
 
     case WIDGET_KEY:
     case WIDGET_KEY:
-        i = mcview_handle_key ((mcview_t *) view, parm);
+        i = mcview_handle_key (view, parm);
+        if (view->want_to_quit && !mcview_is_in_panel (view))
+            dlg_stop (h);
+        else
+            mcview_update (view);
+        return i;
+
+    case WIDGET_COMMAND:
+        i = mcview_execute_cmd (view, parm);
         if (view->want_to_quit && !mcview_is_in_panel (view))
         if (view->want_to_quit && !mcview_is_in_panel (view))
             dlg_stop (h);
             dlg_stop (h);
         else
         else
@@ -560,106 +576,20 @@ cb_ret_t
 mcview_dialog_callback (Dlg_head *h, Widget *sender,
 mcview_dialog_callback (Dlg_head *h, Widget *sender,
 			dlg_msg_t msg, int parm, void *data)
 			dlg_msg_t msg, int parm, void *data)
 {
 {
+    mcview_t *view = data;
+
     switch (msg) {
     switch (msg) {
     case DLG_RESIZE:
     case DLG_RESIZE:
         mcview_adjust_size (h);
         mcview_adjust_size (h);
         return MSG_HANDLED;
         return MSG_HANDLED;
 
 
+    case DLG_ACTION:
+        /* command from buttonbar */
+        return send_message (view, WIDGET_COMMAND, parm);
+
     default:
     default:
         return default_dlg_callback (h, sender, msg, parm, data);
         return default_dlg_callback (h, sender, msg, parm, data);
     }
     }
 }
 }
 
 
 /* --------------------------------------------------------------------------------------------- */
 /* --------------------------------------------------------------------------------------------- */
-
-void
-mcview_help_cmd (void)
-{
-    mcview_execute_cmd (NULL, NULL, CK_ViewHelp, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-mcview_goto (mcview_t *view)
-{
-    if (view->hex_mode)
-        mcview_moveto_addr_cmd (view);
-    else
-        mcview_moveto_line_cmd (view);
-
-    view->dirty++;
-    mcview_update (view); /* FIXME: unneeded? */
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-mcview_quit_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewQuit, NULL);
-    if (view->want_to_quit)
-	dlg_stop (view->widget.parent);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-/* Toggle between hex view and text view */
-void
-mcview_toggle_hex_mode_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewToggleHexMode, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-/* Toggle between hexview and hexedit mode */
-void
-mcview_toggle_hexedit_mode_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewToggleHexEditMode, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-mcview_hexedit_save_changes_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewHexEditSave, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-/* Toggle between wrapped and unwrapped view */
-void
-mcview_toggle_wrap_mode_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewToggleWrapMode, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-/* Both views */
-void
-mcview_search_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewToggleMagicMode, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-mcview_toggle_magic_mode_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewToggleMagicMode, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
-void
-mcview_toggle_nroff_mode_cmd (mcview_t * view)
-{
-    mcview_execute_cmd (NULL, &view->widget, CK_ViewToggleNroffMode, NULL);
-}
-
-/* --------------------------------------------------------------------------------------------- */

+ 26 - 36
src/viewer/display.c

@@ -75,55 +75,45 @@ mcview_set_buttonbar (mcview_t *view)
     const char *text;
     const char *text;
     Dlg_head *h = view->widget.parent;
     Dlg_head *h = view->widget.parent;
     WButtonBar *b = find_buttonbar (h);
     WButtonBar *b = find_buttonbar (h);
+    const global_keymap_t *keymap = view->hex_mode ? view->hex_map : view->plain_map;
 
 
-    buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), mcview_help_cmd);
+    buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), keymap, (Widget *) view);
 
 
     if (view->hex_mode) {
     if (view->hex_mode) {
-        if (view->hexedit_mode)
-            buttonbar_set_label_data (b, 2, Q_ ("ButtonBar|View"),
-                                        (buttonbarfn) mcview_toggle_hexedit_mode_cmd, view);
-        else if (view->datasource == DS_FILE)
-            buttonbar_set_label_data (b, 2, Q_ ("ButtonBar|Edit"),
-                                        (buttonbarfn) mcview_toggle_hexedit_mode_cmd, view);
-        else
+         if (view->hexedit_mode)
+            buttonbar_set_label (b, 2, Q_ ("ButtonBar|View"), keymap, (Widget *) view);
+         else if (view->datasource == DS_FILE)
+            buttonbar_set_label (b, 2, Q_ ("ButtonBar|Edit"), keymap, (Widget *) view);
+         else
             buttonbar_clear_label (b, 2);
             buttonbar_clear_label (b, 2);
 
 
-        buttonbar_set_label_data (b, 4, Q_ ("ButtonBar|Ascii"),
-                                    (buttonbarfn) mcview_toggle_hex_mode_cmd, view);
-        buttonbar_set_label_data (b, 6, Q_ ("ButtonBar|Save"),
-                                    (buttonbarfn) mcview_hexedit_save_changes_cmd, view);
-        buttonbar_set_label_data (b, 7, Q_ ("ButtonBar|HxSrch"),
-                                    (buttonbarfn) mcview_search_cmd, view);
+        buttonbar_set_label (b, 4, Q_ ("ButtonBar|Ascii"), keymap, (Widget *) view);
+        buttonbar_set_label (b, 5, Q_ ("ButtonBar|Goto"), keymap, (Widget *) view);
+        buttonbar_set_label (b, 6, Q_ ("ButtonBar|Save"), keymap, (Widget *) view);
+        buttonbar_set_label (b, 7, Q_ ("ButtonBar|HxSrch"), keymap, (Widget *) view);
+
     } else {
     } else {
-        text = view->text_wrap_mode ? Q_ ("ButtonBar|UnWrap") : Q_ ("ButtonBar|Wrap");
-        buttonbar_set_label_data (b, 2, text,
-                                    (buttonbarfn) mcview_toggle_wrap_mode_cmd, view);
-        buttonbar_set_label_data (b, 4, Q_ ("ButtonBar|Hex"),
-                                    (buttonbarfn) mcview_toggle_hex_mode_cmd, view);
+        buttonbar_set_label (b, 2, view->text_wrap_mode ? Q_ ("ButtonBar|UnWrap")
+                                                        : Q_ ("ButtonBar|Wrap"),
+                                keymap, (Widget *) view);
+        buttonbar_set_label (b, 4, Q_ ("ButtonBar|Hex"), keymap, (Widget *) view);
+        buttonbar_set_label (b, 5, Q_ ("ButtonBar|Line"), keymap, (Widget *) view);
         buttonbar_clear_label (b, 6);
         buttonbar_clear_label (b, 6);
-        buttonbar_set_label_data (b, 7, Q_ ("ButtonBar|Search"),
-                                    (buttonbarfn) mcview_search_cmd, view);
+        buttonbar_set_label (b, 7, Q_ ("ButtonBar|Search"), keymap, (Widget *) view);
     }
     }
 
 
-    buttonbar_set_label_data (b, 5, Q_ ("ButtonBar|Goto"),
-                                    (buttonbarfn) mcview_goto, view);
-
     /* don't override the key to access the main menu */
     /* don't override the key to access the main menu */
     if (!mcview_is_in_panel (view)) {
     if (!mcview_is_in_panel (view)) {
-        buttonbar_set_label_data (b, 3, Q_ ("ButtonBar|Quit"),
-                                    (buttonbarfn) mcview_quit_cmd, view);
-
-        text = view->text_nroff_mode ? Q_ ("ButtonBar|Unform") : Q_ ("ButtonBar|Format");
-        buttonbar_set_label_data (b, 9, text,
-                                    (buttonbarfn) mcview_toggle_nroff_mode_cmd, view);
+        buttonbar_set_label (b, 3, Q_ ("ButtonBar|Quit"), keymap, (Widget *) view);
+        buttonbar_set_label (b, 9, view->text_nroff_mode ? Q_ ("ButtonBar|Unform")
+                                                        : Q_ ("ButtonBar|Format"),
+                                keymap, (Widget *) view);
     }
     }
 
 
-    text = view->magic_mode ? Q_ ("ButtonBar|Raw") : Q_ ("ButtonBar|Parse");
-    buttonbar_set_label_data (b, 8, text,
-                                (buttonbarfn) mcview_toggle_magic_mode_cmd, view);
-
-    buttonbar_set_label_data (b, 10, Q_ ("ButtonBar|Quit"),
-                                (buttonbarfn) mcview_quit_cmd, view);
+    buttonbar_set_label (b, 8, view->magic_mode ? Q_ ("ButtonBar|Raw")
+                                                : Q_ ("ButtonBar|Parse"),
+                                keymap, (Widget *) view);
+    buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), keymap, (Widget *) view);
 }
 }
 
 
 /* --------------------------------------------------------------------------------------------- */
 /* --------------------------------------------------------------------------------------------- */

+ 0 - 10
src/viewer/internal.h

@@ -201,16 +201,6 @@ typedef struct mcview_nroff_struct {
 /*** declarations of public functions **********************************/
 /*** declarations of public functions **********************************/
 
 
 /* actions_cmd.c:  */
 /* actions_cmd.c:  */
-void mcview_help_cmd (void);
-void mcview_quit_cmd (mcview_t *view);
-void mcview_goto (mcview_t *view);
-void mcview_toggle_hex_mode_cmd (mcview_t *view);
-void mcview_toggle_hexedit_mode_cmd (mcview_t *view);
-void mcview_hexedit_save_changes_cmd (mcview_t *view);
-void mcview_toggle_wrap_mode_cmd (mcview_t *view);
-void mcview_search_cmd (mcview_t *view);
-void mcview_toggle_magic_mode_cmd (mcview_t *view);
-void mcview_toggle_nroff_mode_cmd (mcview_t *view);
 cb_ret_t mcview_callback (Widget *w, widget_msg_t msg, int parm);
 cb_ret_t mcview_callback (Widget *w, widget_msg_t msg, int parm);
 cb_ret_t mcview_dialog_callback (Dlg_head *h, Widget *sender,
 cb_ret_t mcview_dialog_callback (Dlg_head *h, Widget *sender,
 				    dlg_msg_t msg, int parm, void *data);
 				    dlg_msg_t msg, int parm, void *data);

+ 24 - 43
src/widget.c

@@ -2673,17 +2673,15 @@ listbox_get_current (WListbox *l, char **string, char **extra)
 static gboolean
 static gboolean
 buttonbar_call (WButtonBar *bb, int i)
 buttonbar_call (WButtonBar *bb, int i)
 {
 {
-    switch (bb->labels[i].tag) {
-	case BBFUNC_NONE:
-	    break;
-	case BBFUNC_VOID:
-	    bb->labels[i].u.fn_void ();
-	    return TRUE;
-	case BBFUNC_PTR:
-	    bb->labels[i].u.fn_ptr (bb->labels[i].data);
-	    return TRUE;
-    }
-    return FALSE;
+    cb_ret_t ret = MSG_NOT_HANDLED;
+
+    if ((bb != NULL) && (bb->labels[i].text != NULL)
+	    && (bb->labels[i].command != CK_Ignore_Key))
+	ret = bb->widget.parent->callback (bb->widget.parent,
+					    &bb->widget, DLG_ACTION,
+					    bb->labels[i].command,
+					    bb->labels[i].receiver);
+    return ret;
 }
 }
 
 
 /* calculate width of one button, width is never lesser than 7 */
 /* calculate width of one button, width is never lesser than 7 */
@@ -2694,7 +2692,6 @@ buttonbat_get_button_width (void)
     return (result >= 7) ? result : 7;
     return (result >= 7) ? result : 7;
 }
 }
 
 
-
 static cb_ret_t
 static cb_ret_t
 buttonbar_callback (Widget *w, widget_msg_t msg, int parm)
 buttonbar_callback (Widget *w, widget_msg_t msg, int parm)
 {
 {
@@ -2770,7 +2767,6 @@ WButtonBar *
 buttonbar_new (gboolean visible)
 buttonbar_new (gboolean visible)
 {
 {
     WButtonBar *bb;
     WButtonBar *bb;
-    int i;
 
 
     bb = g_new0 (WButtonBar, 1);
     bb = g_new0 (WButtonBar, 1);
 
 
@@ -2778,10 +2774,6 @@ buttonbar_new (gboolean visible)
 		 buttonbar_callback, buttonbar_event);
 		 buttonbar_callback, buttonbar_event);
     bb->widget.pos_flags = WPOS_KEEP_HORZ | WPOS_KEEP_BOTTOM;
     bb->widget.pos_flags = WPOS_KEEP_HORZ | WPOS_KEEP_BOTTOM;
     bb->visible = visible;
     bb->visible = visible;
-    for (i = 0; i < BUTTONBAR_LABELS_NUM; i++){
-	bb->labels[i].text = NULL;
-	bb->labels[i].tag = BBFUNC_NONE;
-    }
     widget_want_hotkey (bb->widget, 1);
     widget_want_hotkey (bb->widget, 1);
     widget_want_cursor (bb->widget, 0);
     widget_want_cursor (bb->widget, 0);
     bb->btn_width = buttonbat_get_button_width ();
     bb->btn_width = buttonbat_get_button_width ();
@@ -2804,35 +2796,24 @@ find_buttonbar (const Dlg_head *h)
 }
 }
 
 
 void
 void
-buttonbar_clear_label (WButtonBar *bb, int idx)
+buttonbar_set_label (WButtonBar *bb, int idx, const char *text,
+			const struct global_keymap_t *keymap, const Widget *receiver)
 {
 {
-    if (bb != NULL) {
-	set_label_text (bb, idx, "");
-	bb->labels[idx - 1].tag = BBFUNC_NONE;
-    }
-}
+    if ((bb != NULL)  && (idx >= 1) && (idx <= BUTTONBAR_LABELS_NUM)) {
+	unsigned long command = CK_Ignore_Key;
 
 
-void
-buttonbar_set_label_data (WButtonBar *bb, int idx, const char *text,
-                          buttonbarfn cback, void *data)
-{
-    if (bb != NULL) {
-	assert (cback != (buttonbarfn) NULL);
-	set_label_text (bb, idx, text);
-	bb->labels[idx - 1].tag = BBFUNC_PTR;
-	bb->labels[idx - 1].u.fn_ptr = cback;
-	bb->labels[idx - 1].data = data;
-    }
-}
+	if (keymap != NULL)
+	    command = lookup_keymap_command (keymap, KEY_F (idx));
 
 
-void
-buttonbar_set_label (WButtonBar *bb, int idx, const char *text, voidfn cback)
-{
-    if (bb != NULL) {
-	assert (cback != (voidfn) NULL);
-	set_label_text (bb, idx, text);
-	bb->labels[idx - 1].tag = BBFUNC_VOID;
-	bb->labels[idx - 1].u.fn_void = cback;
+	if ((text == NULL) || (text[0] == '\0') || (command == CK_Ignore_Key)) {
+	    set_label_text (bb, idx, NULL);
+	    bb->labels[idx - 1].command = CK_Ignore_Key;
+	    bb->labels[idx - 1].receiver = NULL;
+	} else {
+	    set_label_text (bb, idx, text);
+	    bb->labels[idx - 1].command = command;
+	    bb->labels[idx - 1].receiver = receiver;
+	}
     }
     }
 }
 }
 
 

Some files were not shown because too many files changed in this diff