summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
Diffstat (limited to 'riscos')
-rw-r--r--riscos/gui.c35
-rw-r--r--riscos/menus.c126
-rw-r--r--riscos/theme.c366
-rw-r--r--riscos/theme.h21
-rw-r--r--riscos/treeview.c7
-rw-r--r--riscos/window.c25
6 files changed, 414 insertions, 166 deletions
diff --git a/riscos/gui.c b/riscos/gui.c
index 45fb322a8..68b84e696 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -5,7 +5,7 @@
* Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
* Copyright 2004 James Bursa <bursa@users.sourceforge.net>
* Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk>
- * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ * Copyright 2005 Richard Wilson <info@tinct.net>
* Copyright 2004 Andrew Timmins <atimmins@blueyonder.co.uk>
*/
@@ -157,7 +157,6 @@ static void ro_gui_handle_event(wimp_event_no event, wimp_block *block);
static void ro_gui_poll_queue(wimp_event_no event, wimp_block *block);
static void ro_gui_null_reason_code(void);
static void ro_gui_redraw_window_request(wimp_draw *redraw);
-static void ro_gui_open_window_request(wimp_open *open);
static void ro_gui_close_window_request(wimp_close *close);
static void ro_gui_pointer_leaving_window(wimp_leaving *leaving);
static void ro_gui_pointer_entering_window(wimp_entering *entering);
@@ -790,21 +789,33 @@ void ro_gui_redraw_window_request(wimp_draw *redraw)
ro_gui_url_complete_redraw(redraw);
else if ((hotlist_tree) && (redraw->w == (wimp_w)hotlist_tree->handle))
ro_gui_tree_redraw(redraw, hotlist_tree);
+ else if ((global_history_tree) && (redraw->w == (wimp_w)global_history_tree->handle))
+ ro_gui_tree_redraw(redraw, global_history_tree);
else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
(hotlist_tree->toolbar->toolbar_handle == redraw->w))
ro_gui_theme_redraw(hotlist_tree->toolbar, redraw);
- else if ((global_history_tree) && (redraw->w == (wimp_w)global_history_tree->handle))
- ro_gui_tree_redraw(redraw, global_history_tree);
+ else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
+ (hotlist_tree->toolbar->editor) &&
+ (hotlist_tree->toolbar->editor->toolbar_handle == redraw->w))
+ ro_gui_theme_redraw(hotlist_tree->toolbar->editor, redraw);
else if ((global_history_tree) && (global_history_tree->toolbar) &&
(global_history_tree->toolbar->toolbar_handle == redraw->w))
ro_gui_theme_redraw(global_history_tree->toolbar, redraw);
+ else if ((global_history_tree) && (global_history_tree->toolbar) &&
+ (global_history_tree->toolbar->editor) &&
+ (global_history_tree->toolbar->editor->toolbar_handle == redraw->w))
+ ro_gui_theme_redraw(global_history_tree->toolbar->editor, redraw);
else if (redraw->w == dialog_debug)
ro_gui_debugwin_redraw(redraw);
else if ((g = ro_gui_window_lookup(redraw->w)) != NULL)
ro_gui_window_redraw(g, redraw);
- else if ((g = ro_gui_toolbar_lookup(redraw->w)) != NULL)
- ro_gui_theme_redraw(g->toolbar, redraw);
- else {
+ else if ((g = ro_gui_toolbar_lookup(redraw->w)) != NULL) {
+ if (g->toolbar->toolbar_handle == redraw->w)
+ ro_gui_theme_redraw(g->toolbar, redraw);
+ else if ((g->toolbar->editor) &&
+ (g->toolbar->editor->toolbar_handle == redraw->w))
+ ro_gui_theme_redraw(g->toolbar->editor, redraw);
+ } else {
ro_gui_dialog_redraw(redraw);
}
}
@@ -927,8 +938,16 @@ void ro_gui_mouse_click(wimp_pointer *pointer)
else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
(hotlist_tree->toolbar->toolbar_handle == pointer->w))
ro_gui_tree_toolbar_click(pointer, hotlist_tree);
+ else if ((hotlist_tree) && (hotlist_tree->toolbar) &&
+ (hotlist_tree->toolbar->editor) &&
+ (hotlist_tree->toolbar->editor->toolbar_handle == pointer->w))
+ ro_gui_tree_toolbar_click(pointer, hotlist_tree);
+ else if ((global_history_tree) && (global_history_tree->toolbar) &&
+ (global_history_tree->toolbar->toolbar_handle == pointer->w))
+ ro_gui_tree_toolbar_click(pointer, global_history_tree);
else if ((global_history_tree) && (global_history_tree->toolbar) &&
- (global_history_tree->toolbar->toolbar_handle == pointer->w))
+ (global_history_tree->toolbar->editor) &&
+ (global_history_tree->toolbar->editor->toolbar_handle == pointer->w))
ro_gui_tree_toolbar_click(pointer, global_history_tree);
else if ((g = ro_gui_window_lookup(pointer->w)) != NULL)
ro_gui_window_click(g, pointer);
diff --git a/riscos/menus.c b/riscos/menus.c
index ab0bf79d6..e354ee8cc 100644
--- a/riscos/menus.c
+++ b/riscos/menus.c
@@ -53,7 +53,6 @@ static void build_languages_menu(void);
static void ro_gui_menu_toolbar_submenu_selection(int index);
static void ro_gui_menu_prepare_images(void);
static void ro_gui_menu_prepare_window(void);
-static void ro_gui_menu_prepare_theme(void);
static void ro_gui_menu_prepare_toolbars(struct toolbar *toolbar);
static void ro_gui_menu_prepare_render(void);
static void ro_gui_menu_prepare_help(int forced);
@@ -746,7 +745,10 @@ void ro_gui_create_menu(wimp_menu *menu, int x, int y, struct gui_window *g)
current_toolbar = g->toolbar;
} else if (menu == toolbar_menu) {
- ro_gui_menu_prepare_theme();
+ ro_gui_menu_prepare_toolbars(current_toolbar);
+ toolbar_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
+ if (current_toolbar->editor)
+ toolbar_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
} else if (menu == hotlist_menu) {
ro_gui_menu_prepare_hotlist();
current_toolbar = hotlist_tree->toolbar;
@@ -861,8 +863,8 @@ void ro_gui_menu_selection(wimp_selection *selection)
ro_gui_menu_toolbar_submenu_selection(selection->items[1]);
break;
case 1: /* Edit toolbar */
- current_toolbar->locked = !current_toolbar->locked;
- ro_gui_menu_prepare_theme();
+ ro_gui_theme_toggle_edit(current_toolbar);
+ ro_gui_menu_prepare_toolbars(current_toolbar);
break;
}
} else if (current_menu == hotlist_menu) {
@@ -1241,7 +1243,7 @@ void ro_gui_menu_toolbar_submenu_selection(int index) {
current_toolbar->display_status = !current_toolbar->display_status;
break;
}
- ro_gui_menu_prepare_theme();
+ ro_gui_menu_prepare_toolbars(current_toolbar);
current_toolbar->reformat_buttons = true;
height = current_toolbar->height;
ro_gui_theme_process_toolbar(current_toolbar, -1);
@@ -1657,20 +1659,19 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
}
}
if (t) {
- if (h) {
+ if ((h) && (!t->editor)) {
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK,
!history_back_available(h));
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD,
!history_forward_available(h));
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY,
!(c || history_back_available(h) || history_forward_available(h)));
-
} else {
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK, true);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD, true);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY, true);
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BACK, !t->editor);
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_FORWARD, !t->editor);
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_HISTORY, !t->editor);
}
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BOOKMARK, !hotlist_tree);
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_BOOKMARK, (!hotlist_tree && !t->editor));
global_history_get_recent(&suggestions);
ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SUGGEST, (suggestions <= 0));
}
@@ -1682,7 +1683,7 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, false);
} else {
if (update_menu) browser_navigate_menu->entries[3].icon_flags |= wimp_ICON_SHADED;
- if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, true);
+ if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_RELOAD, !t->editor);
}
if (bw->loading_content || (bw->current_content &&
bw->current_content->status != CONTENT_STATUS_DONE)) {
@@ -1690,27 +1691,22 @@ void ro_gui_prepare_navigate(struct gui_window *gui) {
if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, false);
} else {
if (update_menu) browser_navigate_menu->entries[4].icon_flags |= wimp_ICON_SHADED;
- if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, true);
+ if (t) ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_STOP, !t->editor);
}
/* Set the scale view icon
*/
- if (c) {
- if (update_menu) menu.entries[0].icon_flags &= ~wimp_ICON_SHADED;
- if (t) {
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SEARCH, false);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SCALE, false);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SAVE, false);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_PRINT, false);
- }
- } else {
- if (update_menu) menu.entries[0].icon_flags |= wimp_ICON_SHADED;
- if (t) {
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SEARCH, true);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SCALE, true);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SAVE, true);
- ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_PRINT, true);
- }
+ if (update_menu) {
+ if (c)
+ menu.entries[0].icon_flags &= ~wimp_ICON_SHADED;
+ else
+ menu.entries[0].icon_flags |= wimp_ICON_SHADED;
+ }
+ if (t) {
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SEARCH, (!c && !t->editor));
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SCALE, (!c && !t->editor));
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_SAVE, (!c && !t->editor));
+ ro_gui_set_icon_shaded_state(t->toolbar_handle, ICON_TOOLBAR_PRINT, (!c && !t->editor));
}
/* Check if we've changed our menu state
@@ -1822,20 +1818,6 @@ static void ro_gui_menu_prepare_window(void) {
/**
* Update toolbar menu status
*/
-static void ro_gui_menu_prepare_theme(void) {
- if (!current_toolbar) return;
-
- ro_gui_menu_prepare_toolbars(current_toolbar);
- if (current_toolbar->locked) {
- toolbar_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
- } else {
- toolbar_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
- }
-}
-
-/**
- * Update toolbar menu status
- */
static void ro_gui_menu_prepare_toolbars(struct toolbar *toolbar) {
int index;
@@ -1846,6 +1828,10 @@ static void ro_gui_menu_prepare_toolbars(struct toolbar *toolbar) {
browser_toolbar_menu->entries[index].icon_flags &= ~wimp_ICON_SHADED;
browser_toolbar_menu->entries[index].menu_flags &= ~wimp_MENU_TICKED;
}
+ if (toolbar->editor) {
+ browser_toolbar_menu->entries[0].icon_flags |= wimp_ICON_SHADED;
+ browser_toolbar_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
+ }
if ((toolbar->descriptor) && (toolbar->descriptor->theme)) {
if (toolbar->display_buttons) browser_toolbar_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
if (toolbar->display_throbber) browser_toolbar_menu->entries[2].menu_flags |= wimp_MENU_TICKED;
@@ -1911,14 +1897,25 @@ void ro_gui_menu_prepare_hotlist(void) {
}
if (hotlist_toolbar) {
- ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
- ICON_TOOLBAR_OPEN, !hotlist_tree->root->child);
- ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
- ICON_TOOLBAR_EXPAND, !hotlist_tree->root->child);
- ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
- ICON_TOOLBAR_DELETE, !selection);
- ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
- ICON_TOOLBAR_LAUNCH, !selection);
+ if (hotlist_toolbar->editor) {
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_OPEN, false);
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_EXPAND, false);
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_DELETE, false);
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_LAUNCH, false);
+ } else {
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_OPEN, !hotlist_tree->root->child);
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_EXPAND, !hotlist_tree->root->child);
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_DELETE, !selection);
+ ro_gui_set_icon_shaded_state(hotlist_toolbar->toolbar_handle,
+ ICON_TOOLBAR_LAUNCH, !selection);
+ }
}
if (selection) {
@@ -1975,14 +1972,25 @@ void ro_gui_menu_prepare_global_history(void) {
}
if (global_history_toolbar) {
- ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
- ICON_TOOLBAR_OPEN, !global_history_tree->root->child);
- ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
- ICON_TOOLBAR_EXPAND, !global_history_tree->root->child);
- ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
- ICON_TOOLBAR_DELETE, !selection);
- ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
- ICON_TOOLBAR_LAUNCH, !selection);
+ if (global_history_toolbar->editor) {
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_OPEN, false);
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_EXPAND, false);
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_DELETE, false);
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_LAUNCH, false);
+ } else {
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_OPEN, !global_history_tree->root->child);
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_EXPAND, !global_history_tree->root->child);
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_DELETE, !selection);
+ ro_gui_set_icon_shaded_state(global_history_toolbar->toolbar_handle,
+ ICON_TOOLBAR_LAUNCH, !selection);
+ }
}
if (selection) {
diff --git a/riscos/theme.c b/riscos/theme.c
index 1916aa4de..2fecf98cd 100644
--- a/riscos/theme.c
+++ b/riscos/theme.c
@@ -570,6 +570,7 @@ void ro_gui_theme_redraw(struct toolbar *toolbar, wimp_draw *redraw) {
struct toolbar_icon *icon;
osbool more = wimp_redraw_window(redraw);
wimp_icon separator_icon;
+ os_error *error;
bool perform_redraw = false;
/* Set up the icon
@@ -586,7 +587,7 @@ void ro_gui_theme_redraw(struct toolbar *toolbar, wimp_draw *redraw) {
separator_icon.extent.y1 = toolbar->height;
perform_redraw = true;
}
- perform_redraw &= toolbar->display_buttons;
+ perform_redraw &= toolbar->display_buttons || toolbar->editor;
while (more) {
if (perform_redraw) {
@@ -597,8 +598,14 @@ void ro_gui_theme_redraw(struct toolbar *toolbar, wimp_draw *redraw) {
wimp_plot_icon(&separator_icon);
}
}
- }
- more = wimp_get_rectangle(redraw);
+ }
+ error = xwimp_get_rectangle(redraw, &more);
+ if (error) {
+ LOG(("xwimp_get_rectangle: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return;
+ }
}
}
@@ -714,6 +721,29 @@ struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor,
ro_gui_theme_add_toolbar_icon(toolbar, "open", ICON_TOOLBAR_OPEN);
ro_gui_theme_add_toolbar_icon(toolbar, "expand", ICON_TOOLBAR_EXPAND);
break;
+ case THEME_BROWSER_EDIT_TOOLBAR:
+ ro_gui_theme_add_toolbar_icon(toolbar, "back", ICON_TOOLBAR_BACK);
+ ro_gui_theme_add_toolbar_icon(toolbar, "forward", ICON_TOOLBAR_FORWARD);
+ ro_gui_theme_add_toolbar_icon(toolbar, "stop", ICON_TOOLBAR_STOP);
+ ro_gui_theme_add_toolbar_icon(toolbar, "reload", ICON_TOOLBAR_RELOAD);
+ ro_gui_theme_add_toolbar_icon(toolbar, "home", ICON_TOOLBAR_HOME);
+ ro_gui_theme_add_toolbar_icon(toolbar, "search", ICON_TOOLBAR_SEARCH);
+ ro_gui_theme_add_toolbar_icon(toolbar, "history", ICON_TOOLBAR_HISTORY);
+ ro_gui_theme_add_toolbar_icon(toolbar, "scale", ICON_TOOLBAR_SCALE);
+ ro_gui_theme_add_toolbar_icon(toolbar, "hotlist", ICON_TOOLBAR_BOOKMARK);
+ ro_gui_theme_add_toolbar_icon(toolbar, "save", ICON_TOOLBAR_SAVE);
+ ro_gui_theme_add_toolbar_icon(toolbar, "print", ICON_TOOLBAR_PRINT);
+ ro_gui_theme_add_toolbar_icon(toolbar, NULL, -1);
+ break;
+ case THEME_HOTLIST_EDIT_TOOLBAR:
+ ro_gui_theme_add_toolbar_icon(toolbar, "create", ICON_TOOLBAR_CREATE);
+ case THEME_HISTORY_EDIT_TOOLBAR:
+ ro_gui_theme_add_toolbar_icon(toolbar, "delete", ICON_TOOLBAR_DELETE);
+ ro_gui_theme_add_toolbar_icon(toolbar, "launch", ICON_TOOLBAR_LAUNCH);
+ ro_gui_theme_add_toolbar_icon(toolbar, "open", ICON_TOOLBAR_OPEN);
+ ro_gui_theme_add_toolbar_icon(toolbar, "expand", ICON_TOOLBAR_EXPAND);
+ ro_gui_theme_add_toolbar_icon(toolbar, NULL, -1);
+ break;
}
/* Claim the memory for our Wimp indirection
@@ -756,6 +786,7 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
struct toolbar_icon *toolbar_icon;
int width, max_icon;
wimp_icon_flags icon_flags;
+ struct gui_window *g;
if (!toolbar) return false;
/* Set the theme and window sprite area
@@ -785,6 +816,12 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
} else {
theme_toolbar_window.work_bg = wimp_COLOUR_VERY_LIGHT_GREY;
}
+
+ theme_toolbar_window.work_flags &= ~wimp_ICON_BUTTON_TYPE;
+ if ((toolbar->editor) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) ||
+ (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) ||
+ (toolbar->type == THEME_BROWSER_EDIT_TOOLBAR))
+ theme_toolbar_window.work_flags |= (wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT);
theme_toolbar_window.flags &= ~wimp_WINDOW_AUTO_REDRAW;
theme_toolbar_window.flags |= wimp_WINDOW_NO_BOUNDS;
theme_toolbar_window.xmin = 1;
@@ -809,9 +846,9 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
/* Create the basic icons
*/
- if (toolbar->type == THEME_HOTLIST_TOOLBAR)
+ if ((toolbar->type == THEME_HOTLIST_TOOLBAR) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR))
max_icon = ICON_TOOLBAR_HOTLIST_LAST;
- else if (toolbar->type == THEME_HISTORY_TOOLBAR)
+ else if ((toolbar->type == THEME_HISTORY_TOOLBAR) || (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR))
max_icon = ICON_TOOLBAR_HISTORY_LAST;
else
max_icon = ICON_TOOLBAR_URL;
@@ -819,8 +856,13 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
new_icon.icon.data.indirected_text.size = 1;
new_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_SPRITE |
wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED |
- wimp_ICON_VCENTRED |
- (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT);
+ wimp_ICON_VCENTRED;
+ if ((toolbar->editor) || (toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) ||
+ (toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) ||
+ (toolbar->type == THEME_BROWSER_EDIT_TOOLBAR))
+ new_icon.icon.flags |= (wimp_BUTTON_NEVER << wimp_ICON_BUTTON_TYPE_SHIFT);
+ else
+ new_icon.icon.flags |= (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT);
if (toolbar->descriptor)
new_icon.icon.flags |= (toolbar->descriptor->browser_background
<< wimp_ICON_BG_COLOUR_SHIFT);
@@ -884,11 +926,11 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
return false;
}
- /* Now the URL suggestion icon
+ /* Now the URL suggestion icon
*/
new_icon.icon.data.indirected_text.text = theme_null_text_string;
new_icon.icon.data.indirected_text.size = 1;
- new_icon.icon.flags = icon_flags;
+ new_icon.icon.flags = icon_flags | (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT);
if (toolbar->suggest)
new_icon.icon.data.indirected_text.validation = toolbar->suggest->validation;
else
@@ -980,6 +1022,24 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct too
toolbar->toolbar_current = -1;
toolbar->status_current = -1;
ro_gui_theme_process_toolbar(toolbar, width);
+
+ /* Keep menus up to date etc
+ */
+ switch (toolbar->type) {
+ case THEME_BROWSER_TOOLBAR:
+ g = ro_gui_window_lookup(toolbar->parent_handle);
+ if (g)
+ ro_gui_prepare_navigate(g);
+ break;
+ case THEME_HOTLIST_TOOLBAR:
+ ro_gui_menu_prepare_hotlist();
+ break;
+ case THEME_HISTORY_TOOLBAR:
+ ro_gui_menu_prepare_global_history();
+ break;
+ default:
+ break;
+ }
return true;
}
@@ -995,12 +1055,16 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
wimp_outline outline;
wimp_window_state state;
int height;
+ int full_height;
+ os_error *error;
+
if (!toolbar) return false;
- /* Attach/close the window
+ /* Attach/close the windows
*/
toolbar->parent_handle = parent;
height = ro_gui_theme_toolbar_height(toolbar);
+ full_height = ro_gui_theme_toolbar_full_height(toolbar);
if (height > 0) {
outline.w = parent;
xwimp_get_window_outline(&outline);
@@ -1010,8 +1074,8 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
state.visible.x1 = outline.outline.x1 - 2;
state.visible.y0 = state.visible.y1 - height + 2;
state.xscroll = 0;
- state.yscroll = toolbar->height; /* clipped by WIMP to extent */
- xwimp_open_window_nested((wimp_open *)&state, parent,
+ state.yscroll = toolbar->height - 2; /* clipped by the WIMP */
+ error = xwimp_open_window_nested((wimp_open *)&state, parent,
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_XORIGIN_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
@@ -1024,6 +1088,36 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
<< wimp_CHILD_RS_EDGE_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
<< wimp_CHILD_TS_EDGE_SHIFT);
+ if (error) {
+ LOG(("xwimp_open_window_nested: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return false;
+ }
+ if (toolbar->editor) {
+ state.w = toolbar->editor->toolbar_handle;
+ state.visible.y1 -= toolbar->height;
+ state.yscroll = toolbar->editor->height - 2;
+ error = xwimp_open_window_nested((wimp_open *)&state, toolbar->toolbar_handle,
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_XORIGIN_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
+ << wimp_CHILD_YORIGIN_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_LS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
+ << wimp_CHILD_BS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
+ << wimp_CHILD_RS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
+ << wimp_CHILD_TS_EDGE_SHIFT);
+ if (error) {
+ LOG(("xwimp_open_window_nested: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return false;
+ }
+ }
} else {
xwimp_close_window(toolbar->toolbar_handle);
}
@@ -1089,7 +1183,6 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
wimp_caret caret;
os_box extent = { 0, 0, 0, 0 };
os_error *error;
- wimp_w parent = NULL;
wimp_outline outline;
wimp_window_state state;
int height = -1;
@@ -1102,50 +1195,24 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
int old_height = toolbar->height;
int old_width = toolbar->toolbar_current;
struct toolbar_icon *toolbar_icon;
- struct toolbar_icon *last_icon = NULL;
bool visible_icon = false;
-
- /* Disable lone separators
- */
- if (toolbar->reformat_buttons) {
- visible_icon = false;
- toolbar_icon = toolbar->icon;
- while (toolbar_icon) {
- if (toolbar_icon->icon_number < 0) {
- toolbar_icon->display = visible_icon;
- visible_icon = false;
- } else if (toolbar_icon->width > 0) {
- visible_icon |= toolbar_icon->display;
- }
- if (toolbar_icon->display) last_icon = toolbar_icon;
- toolbar_icon = toolbar_icon->next;
- }
- if ((last_icon) && (last_icon->icon_number < 0)) {
- last_icon->display = false;
- }
- visible_icon = false;
- }
+ int collapse_height;
/* Find the parent window handle if we need to process the status window,
or the caller has requested we calculate the width ourself.
*/
- if ((width == -1) || ((toolbar->status_handle) && (toolbar->display_status))) {
- parent = toolbar->parent_handle;
-
- /* Get the window outline width
- */
- if (width == -1) {
- if (!parent) return false;
- outline.w = toolbar->parent_handle;
- error = xwimp_get_window_outline(&outline);
- if (error) {
- LOG(("xwimp_get_window_outline: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return false;
- }
- width = outline.outline.x1 - outline.outline.x0 - 2;
+ if ((toolbar->parent_handle) && ((width == -1) ||
+ ((toolbar->status_handle) && (toolbar->display_status)))) {
+ outline.w = toolbar->parent_handle;
+ error = xwimp_get_window_outline(&outline);
+ if (error) {
+ LOG(("xwimp_get_window_outline: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return false;
}
+ if (width == -1)
+ width = outline.outline.x1 - outline.outline.x0 - 2;
}
/* Find the parent visible height to clip our toolbar height to
@@ -1179,10 +1246,12 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
xwimp_force_redraw(toolbar->parent_handle,
0, -16384, 16384, 16384);
toolbar->max_height = height;
+ collapse_height = toolbar->height +
+ (toolbar->editor ? toolbar->editor->height : 0);
ro_gui_theme_attach_toolbar(toolbar, toolbar->parent_handle);
if ((state.flags & wimp_WINDOW_SIZE_ICON) &&
!(state.flags & wimp_WINDOW_HSCROLL) &&
- (toolbar->height > toolbar->max_height))
+ (collapse_height > toolbar->max_height))
xwimp_force_redraw(toolbar->parent_handle,
0, -16384, 16384, 16384);
}
@@ -1213,7 +1282,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
/* Get the minimum height of the icons
*/
bottom_edge = left_edge;
- if ((toolbar->display_buttons) && (toolbar->descriptor) &&
+ if ((toolbar->display_buttons || toolbar->editor) && (toolbar->descriptor) &&
(toolbar->descriptor->theme)) {
toolbar_icon = toolbar->icon;
while (toolbar_icon) {
@@ -1251,10 +1320,12 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
}
}
+ if (toolbar->height != 0)
+ toolbar->height += 2;
if (toolbar->reformat_buttons) {
/* Hide the URL bar if we should
*/
- if (!toolbar->display_url) {
+ if ((!toolbar->display_url) && (toolbar->type == THEME_BROWSER_TOOLBAR)) {
if (!xwimp_get_caret_position(&caret)) {
if ((caret.w == toolbar->toolbar_handle) &&
(caret.i == ICON_TOOLBAR_URL)) {
@@ -1271,9 +1342,10 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
0, -16384, 0, -16384);
xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_SUGGEST,
0, -16384, 0, -16384);
+ } else if (toolbar->type == THEME_BROWSER_TOOLBAR) {
+ ro_gui_set_icon_shaded_state(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
+ !toolbar->display_url);
}
- ro_gui_set_icon_shaded_state(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
- !toolbar->display_url);
xwimp_force_redraw(toolbar->toolbar_handle,
0, 0, 16384, 16384);
@@ -1281,8 +1353,9 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
*/
toolbar_icon = toolbar->icon;
while (toolbar_icon) {
- if ((toolbar->display_buttons) && (toolbar_icon->display)
- && (toolbar_icon->width > 0)) {
+ if ((toolbar->display_buttons || toolbar->editor) &&
+ (toolbar_icon->display)
+ && (toolbar_icon->width > 0)) {
visible_icon = true;
bottom_edge = (toolbar->height -
toolbar_icon->height) / 2;
@@ -1305,12 +1378,11 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
}
- if (toolbar->height != 0) toolbar->height += 2;
if (toolbar->type == THEME_BROWSER_TOOLBAR) {
/* Move the URL bar
*/
if (toolbar->display_url) {
- if (toolbar->suggest) {
+ if (toolbar->suggest) {
xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
left_edge, (toolbar->height / 2) - 26,
right_edge - toolbar->suggest->width - 8,
@@ -1323,7 +1395,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
xwimp_force_redraw(toolbar->toolbar_handle,
right_edge - toolbar->suggest->width - 8, 0,
16384, 16384);
- } else {
+ } else {
xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
left_edge, (toolbar->height / 2) - 26,
right_edge, (toolbar->height / 2) + 26);
@@ -1368,19 +1440,18 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
toolbar->toolbar_current = width;
if (toolbar->reformat_buttons) {
extent.x1 = 16384;
- extent.y0 = 0;
+ extent.y0 = (toolbar->editor ? -toolbar->editor->height : 0);
extent.y1 = toolbar->height - 2;
xwimp_set_extent(toolbar->toolbar_handle, &extent);
- if ((parent) && (old_height != toolbar->height)) {
- ro_gui_theme_attach_toolbar(toolbar, parent);
- }
+ if ((toolbar->parent_handle) && (old_height != toolbar->height))
+ ro_gui_theme_attach_toolbar(toolbar, toolbar->parent_handle);
}
toolbar->reformat_buttons = false;
}
/* Reformat the status bar
*/
- if ((toolbar->status_handle) && (parent)) {
+ if ((toolbar->status_handle) && (toolbar->parent_handle)) {
/* Get the current state
*/
state.w = toolbar->status_handle;
@@ -1400,13 +1471,15 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
} else {
/* Get the status bar height/width
*/
- status_max = width - ro_get_vscroll_width(parent);
+ status_max = width - ro_get_vscroll_width(toolbar->parent_handle);
status_size = (status_max * toolbar->status_width) / 10000;
if (status_size < 12) status_size = 12;
- status_height = ro_get_hscroll_height(parent) - 2;
+ status_height = ro_get_hscroll_height(toolbar->parent_handle) - 2;
/* Update the extent
*/
+ extent.x0 = 0;
+ extent.y0 = 0;
extent.x1 = status_max;
extent.y1 = status_height - 2;
xwimp_set_extent(toolbar->status_handle, &extent);
@@ -1421,7 +1494,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
state.visible.x1 = outline.outline.x0 + status_size;
state.visible.y0 = outline.outline.y0 - status_height;
state.visible.y1 = outline.outline.y0 - 2;
- xwimp_open_window_nested((wimp_open *)&state, parent,
+ xwimp_open_window_nested((wimp_open *)&state, toolbar->parent_handle,
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
<< wimp_CHILD_XORIGIN_SHIFT |
wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
@@ -1469,6 +1542,13 @@ void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar) {
struct toolbar_icon *next_icon;
if (!toolbar) return;
+ /* Destroy our editor
+ */
+ if (toolbar->editor) {
+ toolbar->editor = NULL;
+ ro_gui_theme_destroy_toolbar(toolbar->editor);
+ }
+
/* Delete our windows
*/
if (toolbar->toolbar_handle)
@@ -1493,6 +1573,130 @@ void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar) {
/**
+ * Toggles the toolbar editing mode
+ *
+ * \param toolbar the toolbar to toggle editing for
+ */
+void ro_gui_theme_toggle_edit(struct toolbar *toolbar) {
+ int height;
+ struct gui_window *g = NULL;
+ wimp_window_state state;
+ os_error *error;
+
+ if (!toolbar)
+ return;
+
+ if ((toolbar->type == THEME_BROWSER_TOOLBAR) && (toolbar->parent_handle))
+ g = ro_gui_window_lookup(toolbar->parent_handle);
+
+ if (toolbar->editor) {
+ /* todo: save options */
+ height = toolbar->editor->height;
+ ro_gui_theme_destroy_toolbar(toolbar->editor);
+ toolbar->editor = NULL;
+ ro_gui_theme_update_toolbar(toolbar->descriptor, toolbar);
+ switch (toolbar->type) {
+ case THEME_BROWSER_TOOLBAR:
+ if (g)
+ ro_gui_window_update_dimensions(g, height);
+ break;
+ default:
+ if (toolbar->parent_handle)
+ xwimp_force_redraw(toolbar->parent_handle,
+ 0, -16384, 16384, 16384);
+ break;
+ }
+ } else {
+ /* create/initialise the toolbar editor */
+ switch (toolbar->type) {
+ case THEME_BROWSER_TOOLBAR:
+ toolbar->editor = ro_gui_theme_create_toolbar(toolbar->descriptor,
+ THEME_BROWSER_EDIT_TOOLBAR);
+ break;
+ case THEME_HOTLIST_TOOLBAR:
+ toolbar->editor = ro_gui_theme_create_toolbar(toolbar->descriptor,
+ THEME_HOTLIST_EDIT_TOOLBAR);
+ break;
+ case THEME_HISTORY_TOOLBAR:
+ toolbar->editor = ro_gui_theme_create_toolbar(toolbar->descriptor,
+ THEME_HISTORY_EDIT_TOOLBAR);
+ break;
+ default:
+ return;
+ }
+ if (!toolbar->editor) {
+ LOG(("Unable to create toolbar editor"));
+ return;
+ }
+ ro_gui_theme_update_toolbar(toolbar->descriptor, toolbar);
+ switch (toolbar->type) {
+ case THEME_BROWSER_TOOLBAR:
+ if (g)
+ ro_gui_window_update_dimensions(g, -toolbar->editor->height);
+ break;
+ default:
+ if (toolbar->parent_handle) {
+ state.w = toolbar->parent_handle;
+ error = xwimp_get_window_state(&state);
+ if (error) {
+ LOG(("xwimp_get_window_state: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return;
+ }
+ ro_gui_open_window_request((wimp_open *)&state);
+ xwimp_force_redraw(toolbar->parent_handle,
+ 0, -16384, 16384, 16384);
+ }
+ break;
+ }
+ ro_gui_theme_process_toolbar(toolbar, -1);
+ ro_gui_theme_toolbar_editor_sync(toolbar);
+ }
+}
+
+
+/**
+ * Synchronise a toolbar window with the associated editor.
+ *
+ * \param toolbar the toolbar to synchronise
+ */
+void ro_gui_theme_toolbar_editor_sync(struct toolbar *toolbar) {
+ struct toolbar_icon *icon;
+ struct toolbar_icon *icon_edit;
+
+ if ((!toolbar) || (!toolbar->editor))
+ return;
+
+ for (icon = toolbar->icon; icon; icon = icon->next)
+ if ((icon->icon_number >= 0) && (icon->width > 0))
+ for (icon_edit = toolbar->editor->icon; icon_edit; icon_edit = icon_edit->next)
+ if (icon_edit->icon_number == icon->icon_number)
+ ro_gui_set_icon_shaded_state(toolbar->editor->toolbar_handle,
+ icon_edit->icon_number, icon->display);
+}
+
+
+/**
+ * Handle a toolbar click during an editor session
+ *
+ * \param toolbar the base toolbar (ie not editor) to respond to a click for
+ * \param pointer the WIMP pointer details
+ */
+void ro_gui_theme_toolbar_editor_click(struct toolbar *toolbar, wimp_pointer *pointer) {
+
+}
+
+
+/**
+ * Handle the end of a drag
+ *
+ * \param drag the details for the drag end
+ */
+void ro_gui_theme_toolbar_editor_drag_end(wimp_dragged *drag) {
+}
+
+/**
* Adds a toolbar icon to the end of a toolbar
*
* \param toolbar the toolbar to add the icon to the end of
@@ -1570,7 +1774,7 @@ void ro_gui_theme_update_toolbar_icon(struct toolbar *toolbar, struct toolbar_ic
toolbar->descriptor->theme->sprite_area, (osspriteop_id)icon->name,
&dimensions.x, &dimensions.y, 0, &mode);
- /* fallback to user area just for 'gright' */
+ /* fallback to user area just for 'gright' */
if ((error) && (!strcmp(icon->name, "gright")))
error = xwimpspriteop_read_sprite_info(icon->name,
&dimensions.x, &dimensions.y, 0, &mode);
@@ -1614,21 +1818,11 @@ void ro_gui_theme_destroy_toolbar_icon(struct toolbar_icon *icon) {
*/
struct toolbar_icon *ro_gui_theme_toolbar_get_icon(struct toolbar *toolbar, int x, int y) {
struct toolbar_icon *icon;
- icon = toolbar->icon;
-/* FINISH ME */
+
+ for (icon = toolbar->icon; icon; icon = icon->next)
+ if ((icon->display) && (icon->x <= x) && (icon->y <= y) &&
+ (icon->x + icon->width > x) &&
+ (icon->y + icon->height > y))
+ return icon;
return NULL;
}
-
-/**
- * Returns whether a separator can follow the specified icon
- *
- * \param icon the icon to check
- * \return whether a separator can follow
- */
-bool ro_gui_theme_toolbar_separator_following(struct toolbar_icon *icon) {
- while (icon) {
- if (icon->display) return (icon->width > 0);
- icon = icon->next;
- }
- return false;
-}
diff --git a/riscos/theme.h b/riscos/theme.h
index 38a8c2343..d0a9f0428 100644
--- a/riscos/theme.h
+++ b/riscos/theme.h
@@ -17,7 +17,10 @@
typedef enum {
THEME_BROWSER_TOOLBAR,
THEME_HOTLIST_TOOLBAR,
- THEME_HISTORY_TOOLBAR
+ THEME_HISTORY_TOOLBAR,
+ THEME_BROWSER_EDIT_TOOLBAR,
+ THEME_HOTLIST_EDIT_TOOLBAR,
+ THEME_HISTORY_EDIT_TOOLBAR
} toolbar_type;
struct theme_file_header {
@@ -78,7 +81,7 @@ struct toolbar {
struct toolbar_icon *suggest; /**< suggestion toolbar icon (read only) */
struct theme_descriptor *descriptor; /**< theme descriptor (read only) */
toolbar_type type; /**< toolbar type (read only) */
- bool locked; /**< toolbar is locked from editing */
+ struct toolbar *editor; /**< toolbar editor */
};
struct theme_descriptor {
@@ -118,9 +121,17 @@ void ro_gui_theme_resize_toolbar_status(struct toolbar *toolbar);
bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width);
void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar);
+void ro_gui_theme_toggle_edit(struct toolbar *toolbar);
+void ro_gui_theme_toolbar_editor_sync(struct toolbar *toolbar);
+void ro_gui_theme_toolbar_editor_click(struct toolbar *toolbar, wimp_pointer *pointer);
+void ro_gui_theme_toolbar_editor_drag_end(wimp_dragged *drag);
+
struct toolbar_icon *ro_gui_theme_toolbar_get_icon(struct toolbar *toolbar, int x, int y);
-bool ro_gui_theme_toolbar_separator_following(struct toolbar_icon *icon);
-#define ro_gui_theme_toolbar_height(toolbar) toolbar->height > toolbar->max_height ? \
- toolbar->max_height : toolbar->height
+#define ro_gui_theme_toolbar_height(toolbar) toolbar->height + \
+ (toolbar->editor ? toolbar->editor->height : 0) > toolbar->max_height ? \
+ toolbar->max_height : toolbar->height + \
+ (toolbar->editor ? toolbar->editor->height : 0)
+#define ro_gui_theme_toolbar_full_height(toolbar) toolbar->height + \
+ (toolbar->editor ? toolbar->editor->height : 0)
#endif
diff --git a/riscos/treeview.c b/riscos/treeview.c
index a0d493dcc..0104b390f 100644
--- a/riscos/treeview.c
+++ b/riscos/treeview.c
@@ -830,6 +830,11 @@ void ro_gui_tree_toolbar_click(wimp_pointer* pointer, struct tree *tree) {
return;
}
+ if ((pointer->i < 0) && (current_toolbar)) {
+ ro_gui_theme_toolbar_editor_click(tree->toolbar, pointer);
+ return;
+ }
+
switch (pointer->i) {
case ICON_TOOLBAR_CREATE:
node = tree_create_folder_node(tree->root,
@@ -1037,6 +1042,8 @@ void ro_gui_tree_show(struct tree *tree) {
/* Cancel any editing
*/
+ if ((tree->toolbar) && (tree->toolbar->editor))
+ ro_gui_theme_toggle_edit(tree->toolbar);
ro_gui_tree_stop_edit(tree);
/* Set the default state
diff --git a/riscos/window.c b/riscos/window.c
index 60a65572c..5bcf8aadf 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -726,7 +726,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
state.xscroll = sx * 2;
state.yscroll = -sy * 2;
if (g->toolbar)
- state.yscroll += g->toolbar->height;
+ state.yscroll += ro_gui_theme_toolbar_full_height(g->toolbar);
ro_gui_window_open(g, (wimp_open *) &state);
}
@@ -784,7 +784,7 @@ void gui_window_set_extent(struct gui_window *g, int width, int height)
/* account for toolbar height, if present */
if (g->toolbar)
- toolbar_height = g->toolbar->height;
+ toolbar_height = ro_gui_theme_toolbar_full_height(g->toolbar);
if (width < state.visible.x1 - state.visible.x0)
width = state.visible.x1 - state.visible.x0;
@@ -893,7 +893,6 @@ void ro_gui_window_update_theme(void) {
ro_gui_window_update_dimensions(g, height -
ro_gui_theme_toolbar_height(g->toolbar));
}
- ro_gui_prepare_navigate(g);
}
}
if ((hotlist_tree) && (hotlist_tree->toolbar)) {
@@ -985,7 +984,7 @@ void ro_gui_window_open(struct gui_window *g, wimp_open *open)
/* account for toolbar height, if present */
if (g->toolbar)
- toolbar_height = g->toolbar->height;
+ toolbar_height = ro_gui_theme_toolbar_full_height(g->toolbar);
height -= toolbar_height;
/* The height should be no less than the content height
@@ -1113,9 +1112,12 @@ struct gui_window *ro_gui_window_lookup(wimp_w window)
struct gui_window *ro_gui_toolbar_lookup(wimp_w window)
{
struct gui_window *g;
- for (g = window_list; g; g = g->next)
- if (g->toolbar && g->toolbar->toolbar_handle == window)
+ for (g = window_list; g; g = g->next) {
+ if ((g->toolbar) && ((g->toolbar->toolbar_handle == window) ||
+ ((g->toolbar->editor) &&
+ (g->toolbar->editor->toolbar_handle == window))))
return g;
+ }
return 0;
}
@@ -1194,6 +1196,13 @@ void ro_gui_toolbar_click(struct gui_window *g, wimp_pointer *pointer)
pointer->pos.y, g);
return;
}
+
+ /* Handle toolbar edits
+ */
+ if (pointer->i < 0) {
+ ro_gui_theme_toolbar_editor_click(g->toolbar, pointer);
+ return;
+ }
/* Handle the buttons appropriately
*/
@@ -1723,7 +1732,7 @@ bool ro_gui_window_keypress(struct gui_window *g, int key, bool toolbar)
wimp_get_window_state(&state);
y = state.visible.y1 - state.visible.y0 - 32;
if (g->toolbar)
- y -= g->toolbar->height;
+ y -= ro_gui_theme_toolbar_full_height(g->toolbar);
switch (key) {
case wimp_KEY_UP:
@@ -1765,7 +1774,7 @@ void ro_gui_scroll_request(wimp_scroll *scroll)
x = scroll->visible.x1 - scroll->visible.x0 - 32;
y = scroll->visible.y1 - scroll->visible.y0 - 32;
if (g->toolbar)
- y -= g->toolbar->height;
+ y -= ro_gui_theme_toolbar_full_height(g->toolbar);
switch (scroll->xmin) {
case wimp_SCROLL_PAGE_LEFT: