diff --git a/edit/ChangeLog b/edit/ChangeLog index a3a6d8a06..6a8df2299 100644 --- a/edit/ChangeLog +++ b/edit/ChangeLog @@ -1,5 +1,14 @@ 2005-05-20 Pavel Roskin + * editwidget.c (edit_file): Move menu initialization ... + * editmenu.c (edit_init_menu): ... here. Allocate menu + dynamically. + (edit_done_menu): Take Wmenu argument rather than Menu. Free + menu. + (edit_reload_menu): New function, reload the menu. + (edit_options_dialog): Reload the menu if key emulation has + changed. + * edit.h: Eliminate global EditMenuBar. Fix all dependencies. * edit.h: Eliminate edit_message_dialog macro - it's used diff --git a/edit/edit.h b/edit/edit.h index 2a9b7df5b..f1eab7c4c 100644 --- a/edit/edit.h +++ b/edit/edit.h @@ -111,9 +111,9 @@ struct Menu; int edit_drop_hotkey_menu (WEdit *e, int key); void edit_menu_cmd (WEdit *e); -void edit_init_menu_emacs (struct Menu *EditMenuBar[]); -void edit_init_menu_normal (struct Menu *EditMenuBar[]); -void edit_done_menu (struct Menu *EditMenuBar[]); +struct WMenu *edit_init_menu (void); +void edit_done_menu (struct WMenu *wmenu); +void edit_reload_menu (void); void menu_save_mode_cmd (void); int edit_raw_key_query (const char *heading, const char *query, int cancel); int edit_file (const char *_file, int line); diff --git a/edit/editmenu.c b/edit/editmenu.c index eab07f211..f880e2e2f 100644 --- a/edit/editmenu.c +++ b/edit/editmenu.c @@ -437,11 +437,42 @@ void edit_init_menu_emacs (struct Menu *EditMenuBar[]) "[Internal File Editor]"); } -void edit_done_menu (struct Menu *EditMenuBar[]) +struct WMenu * +edit_init_menu (void) +{ + struct Menu **EditMenuBar = g_new(struct Menu *, N_menus); + + switch (edit_key_emulation) { + case EDIT_KEY_EMULATION_NORMAL: + edit_init_menu_normal (EditMenuBar); + break; + case EDIT_KEY_EMULATION_EMACS: + edit_init_menu_emacs (EditMenuBar); + break; + } + return menubar_new (0, 0, COLS, EditMenuBar, N_menus); +} + +void +edit_done_menu (struct WMenu *wmenu) { int i; for (i = 0; i < N_menus; i++) - destroy_menu (EditMenuBar[i]); + destroy_menu (wmenu->menu[i]); + + g_free(wmenu->menu); +} + + +void +edit_reload_menu (void) +{ + struct WMenu *new_edit_menubar; + + new_edit_menubar = edit_init_menu (); + dlg_replace_widget (&edit_menubar->widget, &new_edit_menubar->widget); + edit_done_menu (edit_menubar); + edit_menubar = new_edit_menubar; } diff --git a/edit/editoptions.c b/edit/editoptions.c index 7011786d3..35fa7412c 100644 --- a/edit/editoptions.c +++ b/edit/editoptions.c @@ -212,7 +212,11 @@ edit_options_dialog (void) option_typewriter_wrap = 0; } - edit_key_emulation = tedit_key_emulation; + /* Reload menu if key emulation has changed */ + if (edit_key_emulation != tedit_key_emulation) { + edit_key_emulation = tedit_key_emulation; + edit_reload_menu (); + } /* Load or unload syntax rules if the option has changed */ if (option_syntax_highlighting != old_syntax_hl) diff --git a/edit/editwidget.c b/edit/editwidget.c index 0b31ab4a9..13f25cb0d 100644 --- a/edit/editwidget.c +++ b/edit/editwidget.c @@ -47,7 +47,6 @@ WEdit *wedit; struct WMenu *edit_menubar; -struct Menu *EditMenuBar[N_menus]; int column_highlighting = 0; @@ -215,15 +214,7 @@ edit_file (const char *_file, int line) edit_bar = buttonbar_new (1); - switch (edit_key_emulation) { - case EDIT_KEY_EMULATION_NORMAL: - edit_init_menu_normal (EditMenuBar); /* editmenu.c */ - break; - case EDIT_KEY_EMULATION_EMACS: - edit_init_menu_emacs (EditMenuBar); /* editmenu.c */ - break; - } - edit_menubar = menubar_new (0, 0, COLS, EditMenuBar, N_menus); + edit_menubar = edit_init_menu (); add_widget (edit_dlg, edit_bar); add_widget (edit_dlg, wedit); @@ -231,7 +222,7 @@ edit_file (const char *_file, int line) run_dlg (edit_dlg); - edit_done_menu (EditMenuBar); /* editmenu.c */ + edit_done_menu (edit_menubar); /* editmenu.c */ destroy_dlg (edit_dlg);