From 0114cc825d8a23ff99ce3a667aebc0ed21b0339f Mon Sep 17 00:00:00 2001 From: Steve Fryatt Date: Wed, 29 Jan 2014 16:54:34 +0000 Subject: Provide a dedicated interface for destroying open menus. Add ro_gui_menu_destroy(), so that this specific task does not share the same code as the more general task of tidying up after menus have been closed by other means. The original ro_gui_menu_closed() now simply cleans up from a known (or assumed) closure, without forcing a closure itself. --- riscos/menus.c | 55 ++++++++++++++++++++++++++++++----------------------- riscos/menus.h | 2 +- riscos/print.c | 2 +- riscos/wimp_event.c | 10 +++++----- riscos/window.c | 14 +++++++------- 5 files changed, 45 insertions(+), 38 deletions(-) diff --git a/riscos/menus.c b/riscos/menus.c index 91232a160..d8e2f2c16 100644 --- a/riscos/menus.c +++ b/riscos/menus.c @@ -77,7 +77,7 @@ struct menu_definition { struct menu_definition *next; /**< next menu */ }; - +static void ro_gui_menu_closed(void); static void ro_gui_menu_define_menu_add(struct menu_definition *definition, const struct ns_menu *menu, int depth, wimp_menu_entry *parent_entry, @@ -213,6 +213,7 @@ void ro_gui_menu_init(void) * \param y The y position. * \param w The window that the menu belongs to. */ + void ro_gui_menu_create(wimp_menu *menu, int x, int y, wimp_w w) { os_error *error; @@ -252,6 +253,7 @@ void ro_gui_menu_create(wimp_menu *menu, int x, int y, wimp_w w) * \param w window handle * \param i icon handle */ + void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i) { wimp_window_state state; @@ -286,29 +288,24 @@ void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i) /** - * Clean up after a menu has been closed, or forcible close an open menu. - */ -void ro_gui_menu_closed(void) + * Forcibly close any menu or transient dialogue box that is currently open. + */ + +void ro_gui_menu_destroy(void) { os_error *error; - if (current_menu) { - error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); - if (error) { - LOG(("xwimp_create_menu: 0x%x: %s", - error->errnum, error->errmess)); - warn_user("MenuError", error->errmess); - } - - ro_gui_wimp_event_menus_closed(current_menu_window, - current_menu_icon, current_menu); + if (current_menu == NULL) + return; - current_menu = NULL; + error = xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); + if (error) { + LOG(("xwimp_create_menu: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("MenuError", error->errmess); } - current_menu_window = NULL; - current_menu_icon = 0; - current_menu_open = false; + ro_gui_menu_closed(); } @@ -450,15 +447,25 @@ void ro_gui_menu_warning(wimp_message_menu_warning *warning) void ro_gui_menu_message_deleted(wimp_message_menus_deleted *deleted) { - if (deleted != NULL && deleted->menu == current_menu) { + if (deleted != NULL && deleted->menu == current_menu) + ro_gui_menu_closed(); +} + + +/** + * Clean up after a menu has been closed, or forcibly close an open menu. + */ + +static void ro_gui_menu_closed(void) +{ + if (current_menu != NULL) ro_gui_wimp_event_menus_closed(current_menu_window, current_menu_icon, current_menu); - current_menu = NULL; - current_menu_window = NULL; - current_menu_icon = 0; - current_menu_open = false; - } + current_menu = NULL; + current_menu_window = NULL; + current_menu_icon = 0; + current_menu_open = false; } diff --git a/riscos/menus.h b/riscos/menus.h index e2269b77c..f49215f04 100644 --- a/riscos/menus.h +++ b/riscos/menus.h @@ -168,7 +168,7 @@ struct ns_menu { void ro_gui_menu_init(void); void ro_gui_menu_create(wimp_menu* menu, int x, int y, wimp_w w); -void ro_gui_menu_closed(void); +void ro_gui_menu_destroy(void); void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i); void ro_gui_menu_window_changed(wimp_w from, wimp_w to); void ro_gui_menu_selection(wimp_selection* selection); diff --git a/riscos/print.c b/riscos/print.c index 09d4aaefb..c539f011c 100644 --- a/riscos/print.c +++ b/riscos/print.c @@ -525,7 +525,7 @@ void ro_print_cleanup(void) print_text_black = false; print_prev_message = 0; print_max_sheets = -1; - ro_gui_menu_closed(); + ro_gui_menu_destroy(); ro_gui_dialog_close(dialog_print); } diff --git a/riscos/wimp_event.c b/riscos/wimp_event.c index a84c016ad..d048b9a1e 100644 --- a/riscos/wimp_event.c +++ b/riscos/wimp_event.c @@ -719,7 +719,7 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer) } ro_gui_dialog_add_persistent(current_menu_window, pointer->w); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); error = xwimp_open_window(PTR_WIMP_OPEN(&open)); if (error) { LOG(("xwimp_open_window: 0x%x: %s", @@ -768,7 +768,7 @@ bool ro_gui_wimp_event_mouse_click(wimp_pointer *pointer) if (pointer->buttons & wimp_CLICK_SELECT) { ro_gui_dialog_close(pointer->w); ro_gui_wimp_event_close_window(pointer->w); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); } else { ro_gui_wimp_event_restore(pointer->w); } @@ -850,7 +850,7 @@ void ro_gui_wimp_event_ok_click(struct event_window *window, if (state & wimp_CLICK_SELECT) { ro_gui_dialog_close(window->w); ro_gui_wimp_event_close_window(window->w); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); } else { ro_gui_wimp_event_memorise(window->w); } @@ -1045,7 +1045,7 @@ bool ro_gui_wimp_event_keypress(wimp_key *key) return false; ro_gui_dialog_close(key->w); ro_gui_wimp_event_close_window(key->w); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return true; /* Return performs the OK action */ case wimp_KEY_RETURN: @@ -1772,7 +1772,7 @@ bool ro_gui_wimp_event_submenu_warning(wimp_w w, wimp_i i, wimp_menu *menu, } /** - * Handle menus being closed. This is called from ro_gui_menu_closed(), in + * Handle menus being closed. This is called from the menus modules, in * every scenario when one of our own menus is open. * * \param w the window to owning the menu diff --git a/riscos/window.c b/riscos/window.c index 1f70d3d66..b7146eb4a 100644 --- a/riscos/window.c +++ b/riscos/window.c @@ -653,7 +653,7 @@ static void gui_window_destroy(struct gui_window *g) ro_gui_url_complete_close(); ro_gui_dialog_close_persistent(w); if (current_menu_window == w) - ro_gui_menu_closed(); + ro_gui_menu_destroy(); ro_gui_window_remove_update_boxes(g); /* delete window */ @@ -1393,7 +1393,7 @@ void gui_create_form_select_menu(struct browser_window *bw, LOG(("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return; } @@ -4810,7 +4810,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, option = option->next) entries++; if (entries == 0) { - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return false; } @@ -4834,7 +4834,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, gui_form_select_menu = malloc(wimp_SIZEOF_MENU(entries)); if (!gui_form_select_menu) { warn_user("NoMemory", 0); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return false; } err = utf8_to_local_encoding(messages_get("SelectMenu"), 0, @@ -4844,7 +4844,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_local_encoding failed")); warn_user("NoMemory", 0); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return false; } gui_form_select_menu->title_data.indirected_text.text = @@ -4869,7 +4869,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, if (!temp) { LOG(("cnv_space2nbsp failed")); warn_user("NoMemory", 0); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return false; } @@ -4881,7 +4881,7 @@ bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw, assert(err != NSERROR_BAD_ENCODING); LOG(("utf8_to_enc failed")); warn_user("NoMemory", 0); - ro_gui_menu_closed(); + ro_gui_menu_destroy(); return false; } -- cgit v1.2.3