From 98e0de0c3af158010be84d245378f9703f01111c Mon Sep 17 00:00:00 2001
From: Andrew Borodin <aborodin@vmail.ru>
Date: Fri, 22 Jul 2011 13:59:28 +0400
Subject: [PATCH] Handle CK_Help, CK_Quit and CK_About actions in dialog level
 instead of widget one.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
---
 misc/mc.keymap.default  |  2 +-
 misc/mc.keymap.emacs    |  2 +-
 src/editor/edit-impl.h  |  1 -
 src/editor/edit.c       | 65 +++++-----------------------------
 src/editor/editcmd.c    | 11 ------
 src/editor/editwidget.c | 78 +++++++++++++++++++++++++++++++++++++++--
 6 files changed, 85 insertions(+), 74 deletions(-)

diff --git a/misc/mc.keymap.default b/misc/mc.keymap.default
index 9bda27eae..afc70161e 100644
--- a/misc/mc.keymap.default
+++ b/misc/mc.keymap.default
@@ -300,7 +300,7 @@ Replace = f4
 ReplaceContinue = f14
 Complete = alt-tab
 InsertFile = f15
-Quit = f10
+Quit = f10, esc
 InsertOverwrite = insert
 Help = f1
 Date =
diff --git a/misc/mc.keymap.emacs b/misc/mc.keymap.emacs
index 3a2d2176d..635e1981b 100644
--- a/misc/mc.keymap.emacs
+++ b/misc/mc.keymap.emacs
@@ -300,7 +300,7 @@ Replace = f4
 ReplaceContinue = f14
 Complete = alt-tab
 InsertFile = f15
-Quit = f10
+Quit = f10, esc
 InsertOverwrite = insert
 Help = f1
 Date =
diff --git a/src/editor/edit-impl.h b/src/editor/edit-impl.h
index 4bdcda18e..f014f696b 100644
--- a/src/editor/edit-impl.h
+++ b/src/editor/edit-impl.h
@@ -269,7 +269,6 @@ void edit_move_display (WEdit * e, long line);
 void edit_word_wrap (WEdit * edit);
 int edit_sort_cmd (WEdit * edit);
 int edit_ext_cmd (WEdit * edit);
-void edit_help_cmd (WEdit * edit);
 
 int edit_store_macro_cmd (WEdit * edit);
 gboolean edit_load_macro_cmd (WEdit * edit);
diff --git a/src/editor/edit.c b/src/editor/edit.c
index 885bfbe7b..7a1c00912 100644
--- a/src/editor/edit.c
+++ b/src/editor/edit.c
@@ -171,56 +171,6 @@ static long last_bracket = -1;
 
 static int left_of_four_spaces (WEdit * edit);
 
-/* --------------------------------------------------------------------------------------------- */
-
-static void
-edit_about (void)
-{
-    const char *header = N_("About");
-    const char *button_name = N_("&OK");
-    const char *const version = "MCEdit " VERSION;
-    char text[BUF_LARGE];
-
-    int win_len, version_len, button_len;
-    int cols, lines;
-
-    Dlg_head *about_dlg;
-
-#ifdef ENABLE_NLS
-    header = _(header);
-    button_name = _(button_name);
-#endif
-
-    button_len = str_term_width1 (button_name) + 5;
-    version_len = str_term_width1 (version);
-
-    g_snprintf (text, sizeof (text),
-                _("Copyright (C) 1996-2010 the Free Software Foundation\n\n"
-                  "            A user friendly text editor\n"
-                  "         written for the Midnight Commander"));
-
-    win_len = str_term_width1 (header);
-    win_len = max (win_len, version_len);
-    win_len = max (win_len, button_len);
-
-    /* count width and height of text */
-    str_msg_term_size (text, &lines, &cols);
-    lines += 9;
-    cols = max (win_len, cols) + 6;
-
-    /* dialog */
-    about_dlg = create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL,
-                            "[Internal File Editor]", header, DLG_CENTER | DLG_TRYUP);
-
-    add_widget (about_dlg, label_new (3, (cols - version_len) / 2, version));
-    add_widget (about_dlg, label_new (5, 3, text));
-    add_widget (about_dlg, button_new (lines - 3, (cols - button_len) / 2,
-                                       B_ENTER, NORMAL_BUTTON, button_name, NULL));
-
-    run_dlg (about_dlg);
-    destroy_dlg (about_dlg);
-}
-
 /* --------------------------------------------------------------------------------------------- */
 /**
  * Initialize the buffers for an empty files.
@@ -3514,7 +3464,14 @@ edit_execute_key_command (WEdit * edit, unsigned long command, int char_for_inse
 void
 edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
 {
-    /* at first, handle window state */
+    /* at first, handle CK_Quit command */
+    if (command == CK_Quit)
+    {
+        dlg_stop (((Widget *) edit)->owner);
+        return;
+    }
+
+    /* handle window state */
     if (edit_handle_move_resize (edit, command))
         return;
 
@@ -4168,18 +4125,12 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
     case CK_EditNew:
         edit_new_cmd (edit);
         break;
-    case CK_Help:
-        edit_help_cmd (edit);
-        break;
     case CK_Refresh:
         edit_refresh_cmd (edit);
         break;
     case CK_SaveSetup:
         save_setup_cmd ();
         break;
-    case CK_About:
-        edit_about ();
-        break;
     case CK_LearnKeys:
         learn_keys ();
         break;
diff --git a/src/editor/editcmd.c b/src/editor/editcmd.c
index 1d0769eb1..9acac2ccb 100644
--- a/src/editor/editcmd.c
+++ b/src/editor/editcmd.c
@@ -1541,17 +1541,6 @@ edit_delete_macro (WEdit * edit, int hotkey)
 /*** public functions ****************************************************************************/
 /* --------------------------------------------------------------------------------------------- */
 
-void
-edit_help_cmd (WEdit * edit)
-{
-    ev_help_t event_data = { NULL, "[Internal File Editor]" };
-    mc_event_raise (MCEVENT_GROUP_CORE, "help", &event_data);
-
-    edit->force |= REDRAW_COMPLETELY;
-}
-
-/* --------------------------------------------------------------------------------------------- */
-
 void
 edit_refresh_cmd (WEdit * edit)
 {
diff --git a/src/editor/editwidget.c b/src/editor/editwidget.c
index 7c6b85902..e8106a5ad 100644
--- a/src/editor/editwidget.c
+++ b/src/editor/editwidget.c
@@ -52,6 +52,7 @@
 #include "lib/util.h"           /* mc_build_filename() */
 #include "lib/widget.h"
 #include "lib/mcconfig.h"
+#include "lib/event.h"          /* mc_event_raise() */
 
 #include "src/keybind-defaults.h"
 #include "src/main.h"           /* home_dir */
@@ -74,6 +75,71 @@
 
 static cb_ret_t edit_callback (Widget * w, widget_msg_t msg, int parm);
 
+/* --------------------------------------------------------------------------------------------- */
+/**
+ * Show info about editor
+ */
+
+static void
+edit_about (void)
+{
+    const char *header = N_("About");
+    const char *button_name = N_("&OK");
+    const char *const version = "MCEdit " VERSION;
+    char text[BUF_LARGE];
+
+    int win_len, version_len, button_len;
+    int cols, lines;
+
+    Dlg_head *about_dlg;
+
+#ifdef ENABLE_NLS
+    header = _(header);
+    button_name = _(button_name);
+#endif
+
+    button_len = str_term_width1 (button_name) + 5;
+    version_len = str_term_width1 (version);
+
+    g_snprintf (text, sizeof (text),
+                _("Copyright (C) 1996-2012 the Free Software Foundation\n\n"
+                  "            A user friendly text editor\n"
+                  "         written for the Midnight Commander"));
+
+    win_len = str_term_width1 (header);
+    win_len = max (win_len, version_len);
+    win_len = max (win_len, button_len);
+
+    /* count width and height of text */
+    str_msg_term_size (text, &lines, &cols);
+    lines += 9;
+    cols = max (win_len, cols) + 6;
+
+    /* dialog */
+    about_dlg = create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL,
+                            "[Internal File Editor]", header, DLG_CENTER | DLG_TRYUP);
+
+    add_widget (about_dlg, label_new (3, (cols - version_len) / 2, version));
+    add_widget (about_dlg, label_new (5, 3, text));
+    add_widget (about_dlg, button_new (lines - 3, (cols - button_len) / 2,
+                                       B_ENTER, NORMAL_BUTTON, button_name, NULL));
+
+    run_dlg (about_dlg);
+    destroy_dlg (about_dlg);
+}
+
+/* --------------------------------------------------------------------------------------------- */
+/**
+ * Show a help window
+ */
+
+static void
+edit_help (void)
+{
+    ev_help_t event_data = { NULL, "[Internal File Editor]" };
+    mc_event_raise (MCEVENT_GROUP_CORE, "help", &event_data);
+}
+
 /* --------------------------------------------------------------------------------------------- */
 /**
  * Restore saved window size.
@@ -414,6 +480,10 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
 
     switch (command)
     {
+    case CK_Help:
+        edit_help ();
+        /* edit->force |= REDRAW_COMPLETELY; */
+        break;
     case CK_Menu:
         edit_menu_cmd (h);
         break;
@@ -428,12 +498,14 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
                 edit_restore_size ((WEdit *) w);
         }
         break;
+    case CK_About:
+        edit_about ();
+        break;
     case CK_WindowMove:
     case CK_WindowResize:
         if (edit_widget_is_editor ((Widget *) h->current->data))
             edit_handle_move_resize ((WEdit *) h->current->data, command);
         break;
-
     default:
         ret = MSG_NOT_HANDLED;
         break;
@@ -447,7 +519,7 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
 static inline void
 edit_set_buttonbar (WEdit * edit, WButtonBar * bb)
 {
-    buttonbar_set_label (bb, 1, Q_ ("ButtonBar|Help"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb, 1, Q_ ("ButtonBar|Help"), editor_map, NULL);
     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);
@@ -456,7 +528,7 @@ edit_set_buttonbar (WEdit * edit, WButtonBar * bb)
     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, NULL);
-    buttonbar_set_label (bb, 10, Q_ ("ButtonBar|Quit"), editor_map, (Widget *) edit);
+    buttonbar_set_label (bb, 10, Q_ ("ButtonBar|Quit"), editor_map, NULL);
 }
 
 /* --------------------------------------------------------------------------------------------- */