]> git.neil.brown.name Git - edlib.git/commitdiff
menubar: allow ancestor pane to add menus
authorNeilBrown <neil@brown.name>
Sun, 1 Oct 2023 23:39:25 +0000 (10:39 +1100)
committerNeilBrown <neil@brown.name>
Sun, 1 Oct 2023 23:41:39 +0000 (10:41 +1100)
THe current ordering requirement for emacs and menubar are odd.
emacs handling must be below menubar so that menus can understand basic
mouse and keystrokes.  But emacs must be initialised after menubar so it
can register.

Break this requirement by having menubar tell any ancestor that they can
configure now.

Signed-off-by: NeilBrown <neil@brown.name>
data/edlib.ini
lib-menubar.c
mode-emacs.c

index fcbddd828e44823516a122f97be57a74c570a057..0b23e0938c7af08091bfb3acd60a2c5e89b354e6 100644 (file)
@@ -6,8 +6,8 @@ include = modules.ini
 editor-initial-panes = input DISPLAY
        " x11selection messageline"
        " global-keymap"
-       " menubar"
        " mode-emacs"
+       " menubar"
        " tile"
 
 TESTING menubar-visible = no
index 69c6b508f84eb75e8198bbffd89065f105ed6f9d..38465f899a33ac2001ed500c54c2b2ba847becf4 100644 (file)
@@ -431,7 +431,10 @@ DEF_CMD(menubar_attach)
        mbi->bar = mbp;
        pane_add_notify(ret, mbp, "Notify:Close");
        pane_damaged(ret, DAMAGED_VIEW);
-       return comm_call(ci->comm2, "callback:attach", ret);
+       comm_call(ci->comm2, "callback:attach", ret);
+       /* Allow pane close to root to register */
+       call("menubar:ready", ret);
+       return 1;
 }
 
 void edlib_init(struct pane *ed safe)
index 8e570cc6bc7c69734d9a15900cb599cf00881e67..9061bc02f2e0bef9928baa1857db3dc18792bf92 100644 (file)
@@ -3381,6 +3381,28 @@ DEF_CMD(emacs_menu_refresh)
        return 1;
 }
 
+static char *menus[][3] = {
+       { "Help/Recent", ":F1 l", "R" },
+       { "Documents/List all", ":C-X :C-B", "R"},
+       { "File/Open", ":C-X :C-F", "L"},
+       { "File/Save", ":C-X :C-S", "L"},
+       { "File/Exit", ":C-X :C-C", "L"},
+       { "Edit/Copy", ":A-w", "L"},
+};
+
+DEF_CMD(emacs_menubar_configure)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(menus); i++)
+               call("menubar-add", ci->focus,
+                    menus[i][2][0] == 'R' ? 2 : 0,
+                    NULL, menus[i][0],
+                    0, NULL, menus[i][1]);
+       /* Allow other ancestor to configure */
+       return Efallthrough;
+}
+
 DEF_PFX_CMD(cx_cmd, ":CX");
 DEF_PFX_CMD(cx4_cmd, ":CX4");
 DEF_PFX_CMD(cx5_cmd, ":CX5");
@@ -3574,29 +3596,16 @@ static void emacs_init(void)
        key_add(m, "menu:refresh", &emacs_menu_refresh);
        key_add_prefix(m, "emacs:doc-menu:", &emacs_doc_menu);
 
+       key_add(m, "menubar:ready", &emacs_menubar_configure);
+
        emacs_map = m;
 }
 
 DEF_LOOKUP_CMD(mode_emacs, emacs_map);
 
-static char *menus[][3] = {
-       { "Help/Recent", ":F1 l", "R" },
-       { "Documents/List all", ":C-X :C-B", "R"},
-       { "File/Open", ":C-X :C-F", "L"},
-       { "File/Save", ":C-X :C-S", "L"},
-       { "File/Exit", ":C-X :C-C", "L"},
-       { "Edit/Copy", ":A-w", "L"},
-};
-
 DEF_CMD(attach_mode_emacs)
 {
-       unsigned int i;
        call_comm("global-set-keymap", ci->focus, &mode_emacs.c);
-       for (i = 0; i < ARRAY_SIZE(menus); i++)
-               call("menubar-add", ci->focus,
-                    menus[i][2][0] == 'R' ? 2 : 0,
-                    NULL, menus[i][0],
-                    0, NULL, menus[i][1]);
        return 1;
 }