summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
Diffstat (limited to 'riscos')
-rw-r--r--riscos/menus.c114
1 files changed, 62 insertions, 52 deletions
diff --git a/riscos/menus.c b/riscos/menus.c
index 0ff4618fc..d239d3592 100644
--- a/riscos/menus.c
+++ b/riscos/menus.c
@@ -508,24 +508,23 @@ void ro_gui_menu_closed(void) {
struct tree *tree;
os_error *error;
- if (!current_menu)
- return;
-
- 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);
+ 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_menu_get_window_details(current_menu_window,
+ &g, &bw, &c, &t, &tree);
+ if (tree)
+ ro_gui_tree_menu_closed(tree);
}
- ro_gui_menu_get_window_details(current_menu_window, &g, &bw, &c, &t, &tree);
-
current_menu = NULL;
current_menu_window = NULL;
current_menu_open = false;
-
- if (tree)
- ro_gui_tree_menu_closed(tree);
+ gui_form_select_control = NULL;
}
@@ -894,8 +893,10 @@ void gui_create_form_select_menu(struct browser_window *bw,
struct form_option *option;
wimp_pointer pointer;
os_error *error;
+ bool reopen = true;
+
+ assert(control);
- gui_form_select_control = NULL;
for (option = control->data.select.items; option; option = option->next)
i++;
if (i == 0) {
@@ -903,7 +904,7 @@ void gui_create_form_select_menu(struct browser_window *bw,
return;
}
- if (gui_form_select_menu) {
+ if ((gui_form_select_menu) && (control != gui_form_select_control)) {
for (j = 0; ; j++) {
free(gui_form_select_menu->entries[j].data.
indirected_text.text);
@@ -915,52 +916,61 @@ void gui_create_form_select_menu(struct browser_window *bw,
gui_form_select_menu = 0;
}
- gui_form_select_menu = malloc(wimp_SIZEOF_MENU(i));
if (!gui_form_select_menu) {
- warn_user("NoMemory", 0);
- ro_gui_menu_closed();
- return;
+ reopen = false;
+ gui_form_select_menu = malloc(wimp_SIZEOF_MENU(i));
+ if (!gui_form_select_menu) {
+ warn_user("NoMemory", 0);
+ ro_gui_menu_closed();
+ return;
+ }
+ gui_form_select_menu->title_data.indirected_text.text =
+ messages_get("SelectMenu");
+ gui_form_select_menu->title_fg = wimp_COLOUR_BLACK;
+ gui_form_select_menu->title_bg = wimp_COLOUR_LIGHT_GREY;
+ gui_form_select_menu->work_fg = wimp_COLOUR_BLACK;
+ gui_form_select_menu->work_bg = wimp_COLOUR_WHITE;
+ gui_form_select_menu->width = 200;
+ gui_form_select_menu->height = wimp_MENU_ITEM_HEIGHT;
+ gui_form_select_menu->gap = wimp_MENU_ITEM_GAP;
}
- gui_form_select_menu->title_data.indirected_text.text =
- messages_get("SelectMenu");
- gui_form_select_menu->title_fg = wimp_COLOUR_BLACK;
- gui_form_select_menu->title_bg = wimp_COLOUR_LIGHT_GREY;
- gui_form_select_menu->work_fg = wimp_COLOUR_BLACK;
- gui_form_select_menu->work_bg = wimp_COLOUR_WHITE;
- gui_form_select_menu->width = 200;
- gui_form_select_menu->height = wimp_MENU_ITEM_HEIGHT;
- gui_form_select_menu->gap = wimp_MENU_ITEM_GAP;
-
for (i = 0, option = control->data.select.items; option;
i++, option = option->next) {
gui_form_select_menu->entries[i].menu_flags = 0;
if (option->selected)
gui_form_select_menu->entries[i].menu_flags =
wimp_MENU_TICKED;
- gui_form_select_menu->entries[i].sub_menu = wimp_NO_SUB_MENU;
- gui_form_select_menu->entries[i].icon_flags = wimp_ICON_TEXT |
- wimp_ICON_INDIRECTED | wimp_ICON_FILLED |
- (wimp_COLOUR_BLACK <<
- wimp_ICON_FG_COLOUR_SHIFT) |
- (wimp_COLOUR_WHITE <<
- wimp_ICON_BG_COLOUR_SHIFT);
- /* \todo can cnv_str_local_enc() fail? */
- gui_form_select_menu->entries[i].data.indirected_text.text =
- cnv_str_local_enc(option->text);
- /* convert spaces to hard spaces to stop things like 'Go Home'
- * being treated as if 'Home' is a keyboard shortcut and right
- * aligned in the menu. */
- text_convert = gui_form_select_menu->entries[i].
- data.indirected_text.text - 1;
- while (*++text_convert != '\0')
- if (*text_convert == 0x20)
- *text_convert = 0xa0;
- gui_form_select_menu->entries[i].data.indirected_text.
- validation = (char *)-1;
- gui_form_select_menu->entries[i].data.indirected_text.size =
- strlen(gui_form_select_menu->entries[i].
- data.indirected_text.text) + 1;
+ if (!reopen) {
+ gui_form_select_menu->entries[i].sub_menu = wimp_NO_SUB_MENU;
+ gui_form_select_menu->entries[i].icon_flags = wimp_ICON_TEXT |
+ wimp_ICON_INDIRECTED | wimp_ICON_FILLED |
+ (wimp_COLOUR_BLACK <<
+ wimp_ICON_FG_COLOUR_SHIFT) |
+ (wimp_COLOUR_WHITE <<
+ wimp_ICON_BG_COLOUR_SHIFT);
+ text_convert = cnv_str_local_enc(option->text);
+ if (!text_convert) {
+ LOG(("cnv_str_local_enc failed."));
+ warn_user("NoMemory", 0);
+ ro_gui_menu_closed();
+ return;
+ }
+ gui_form_select_menu->entries[i].data.indirected_text.text =
+ text_convert;
+ /* convert spaces to hard spaces to stop things like 'Go Home'
+ * being treated as if 'Home' is a keyboard shortcut and right
+ * aligned in the menu. */
+ text_convert -= 1;
+ while (*++text_convert != '\0')
+ if (*text_convert == 0x20)
+ *text_convert = 0xa0;
+ gui_form_select_menu->entries[i].data.indirected_text.
+ validation = (char *)-1;
+ gui_form_select_menu->entries[i].data.indirected_text.size =
+ strlen(gui_form_select_menu->entries[i].
+ data.indirected_text.text) + 1;
+ }
}
gui_form_select_menu->entries[0].menu_flags |=