summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
Diffstat (limited to 'riscos')
-rw-r--r--riscos/dialog.c113
-rw-r--r--riscos/gui.c132
-rw-r--r--riscos/gui.h53
-rw-r--r--riscos/menus.c349
-rw-r--r--riscos/options.h25
-rw-r--r--riscos/plugin.c2
-rw-r--r--riscos/theme.c318
-rw-r--r--riscos/theme.h15
-rw-r--r--riscos/toolbar.c696
-rw-r--r--riscos/toolbar.h84
-rw-r--r--riscos/uri.c2
-rw-r--r--riscos/url_protocol.c2
-rw-r--r--riscos/wimp.c193
-rw-r--r--riscos/wimp.h42
-rw-r--r--riscos/window.c483
15 files changed, 1936 insertions, 573 deletions
diff --git a/riscos/dialog.c b/riscos/dialog.c
index 4c03656e8..645f66772 100644
--- a/riscos/dialog.c
+++ b/riscos/dialog.c
@@ -21,6 +21,7 @@
#include "netsurf/riscos/constdata.h"
#include "netsurf/riscos/gui.h"
#include "netsurf/riscos/options.h"
+#include "netsurf/riscos/wimp.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/utils.h"
@@ -54,9 +55,6 @@ static void load_theme_preview(char* thname);
/*static void ro_gui_destroy_theme_menu(void);*/
static void ro_gui_build_theme_menu(void);
static int file_exists(const char* base, const char* dir, const char* leaf, bits ftype);
-static void set_icon_state(wimp_w w, wimp_i i, int state);
-static int get_icon_state(wimp_w w, wimp_i i);
-static void set_icon_string_i(wimp_w w, wimp_i i, int num);
static const char *language_name(const char *code);
@@ -339,7 +337,7 @@ void ro_gui_dialog_click_config_th(wimp_pointer *pointer)
os_cli("Filer_OpenDir " THEMES_DIR);
break;
case ICON_CONFIG_TH_GET:
- browser_window_create(THEMES_URL);
+ browser_window_create(THEMES_URL, NULL);
break;
}
}
@@ -372,7 +370,7 @@ void ro_gui_dialog_click_zoom(wimp_pointer *pointer)
scale = 10;
else if (500 < scale)
scale = 500;
- set_icon_string_i(dialog_zoom, ICON_ZOOM_VALUE, scale);
+ ro_gui_set_icon_integer(dialog_zoom, ICON_ZOOM_VALUE, scale);
if (pointer->i == ICON_ZOOM_OK) {
current_gui->scale = scale * 0.01;
@@ -415,8 +413,7 @@ void ro_gui_dialog_close(wimp_w close)
* Update the browser choices dialog with the current options.
*/
-void set_browser_choices(void)
-{
+void set_browser_choices(void) {
font_size = option_font_size;
font_min_size = option_font_min_size;
ro_gui_dialog_update_config_br();
@@ -433,8 +430,7 @@ void set_browser_choices(void)
* Set the current options to the settings in the browser choices dialog.
*/
-void get_browser_choices(void)
-{
+void get_browser_choices(void) {
option_font_size = font_size;
option_font_min_size = font_min_size;
}
@@ -446,11 +442,11 @@ void get_browser_choices(void)
void set_proxy_choices(void)
{
- set_icon_state(dialog_config_prox, ICON_CONFIG_PROX_HTTP,
+ ro_gui_set_icon_selected_state(dialog_config_prox, ICON_CONFIG_PROX_HTTP,
option_http_proxy);
ro_gui_set_icon_string(dialog_config_prox, ICON_CONFIG_PROX_HTTPHOST,
option_http_proxy_host ? option_http_proxy_host : "");
- set_icon_string_i(dialog_config_prox, ICON_CONFIG_PROX_HTTPPORT,
+ ro_gui_set_icon_integer(dialog_config_prox, ICON_CONFIG_PROX_HTTPPORT,
option_http_proxy_port);
}
@@ -461,7 +457,7 @@ void set_proxy_choices(void)
void get_proxy_choices(void)
{
- option_http_proxy = get_icon_state(dialog_config_prox,
+ option_http_proxy = ro_gui_get_icon_selected_state(dialog_config_prox,
ICON_CONFIG_PROX_HTTP);
free(option_http_proxy_host);
option_http_proxy_host = strdup(ro_gui_get_icon_string(dialog_config_prox,
@@ -693,99 +689,6 @@ int file_exists(const char* base, const char* dir, const char* leaf, bits ftype)
return 0;
}
-void set_icon_state(wimp_w w, wimp_i i, int state)
-{
- if (state)
- wimp_set_icon_state(w,i, wimp_ICON_SELECTED, wimp_ICON_SELECTED);
- else
- wimp_set_icon_state(w,i, 0, wimp_ICON_SELECTED);
-}
-
-int get_icon_state(wimp_w w, wimp_i i)
-{
- wimp_icon_state ic;
- ic.w = w;
- ic.i = i;
- wimp_get_icon_state(&ic);
- return (ic.icon.flags & wimp_ICON_SELECTED) != 0;
-}
-
-
-/**
- * Set the contents of an icon to a string.
- *
- * \param w window handle
- * \param i icon handle
- * \param text string (copied)
- */
-
-void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text) {
- wimp_caret caret;
- wimp_icon_state ic;
- unsigned int old_len, len;
-
- /* Get the icon data
- */
- ic.w = w;
- ic.i = i;
- wimp_get_icon_state(&ic);
-
- /* Check that the existing text is not the same as the updated text
- to stop flicker
- */
- if (!strcmp(ic.icon.data.indirected_text.text, text))
- return;
-
- /* Copy the text across
- */
- old_len = strlen(ic.icon.data.indirected_text.text);
- if (ic.icon.data.indirected_text.size > 0) {
- strncpy(ic.icon.data.indirected_text.text, text,
- (unsigned int)ic.icon.data.indirected_text.size);
- ic.icon.data.indirected_text.text[ic.icon.data.indirected_text.size - 1] = '\0';
- }
-
- /* Handle the caret being in the icon
- */
- if (!xwimp_get_caret_position(&caret)) {
- if ((caret.w == w) && (caret.i == i)) {
- len = strlen(text);
- if ((caret.index > len) || (caret.index == old_len)) caret.index = len;
- xwimp_set_caret_position(w, i, caret.pos.x, caret.pos.y, -1, caret.index);
- }
- }
-
- /* Redraw the icon
- */
- wimp_set_icon_state(w, i, 0, 0);
-}
-
-
-/**
- * Read the contents of an icon.
- *
- * \param w window handle
- * \param i icon handle
- * \return string in icon
- */
-
-char *ro_gui_get_icon_string(wimp_w w, wimp_i i)
-{
- wimp_icon_state ic;
- ic.w = w;
- ic.i = i;
- wimp_get_icon_state(&ic);
- return ic.icon.data.indirected_text.text;
-}
-
-void set_icon_string_i(wimp_w w, wimp_i i, int num)
-{
- char buffer[255];
- sprintf(buffer, "%d", num);
- ro_gui_set_icon_string(w, i, buffer);
-}
-
-
/**
* Convert a 2-letter ISO language code to the language name.
*
diff --git a/riscos/gui.c b/riscos/gui.c
index 6888e234c..dd7254bfa 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -207,6 +207,100 @@ void gui_init(int argc, char** argv)
/**
+ * Clones a browser window's options.
+ *
+ * \param new_bw the new browser window
+ * \param old_bw the browser window to clone from, or NULL for default
+ */
+void gui_window_clone_options(struct browser_window *new_bw, struct browser_window *old_bw) {
+ gui_window *old_gui = NULL;
+ gui_window *new_gui;
+
+ /* Abort on bad input
+ */
+ if (new_bw == NULL) return;
+
+ /* Get our GUIs
+ */
+ new_gui = new_bw->window;
+
+ /* Abort on bad input
+ */
+ if (!new_gui) return;
+ if (old_bw) old_gui = old_bw->window;
+
+ /* Clone the basic options
+ */
+ if (!old_gui) {
+ new_gui->scale = ((float)option_scale) / 100;
+ new_gui->option_dither_sprites = option_dither_sprites;
+ new_gui->option_filter_sprites = option_filter_sprites;
+ new_gui->option_animate_images = option_animate_images;
+ } else {
+ new_gui->scale = old_gui->scale;
+ new_gui->option_dither_sprites = old_gui->option_dither_sprites;
+ new_gui->option_filter_sprites = old_gui->option_filter_sprites;
+ new_gui->option_animate_images = old_gui->option_animate_images;
+ }
+
+ /* Set up the toolbar
+ */
+ if (new_gui->data.browser.toolbar) {
+ if ((old_gui) && (old_gui->data.browser.toolbar)) {
+ new_gui->data.browser.toolbar->status_width = old_gui->data.browser.toolbar->status_width;
+ new_gui->data.browser.toolbar->status_window = old_gui->data.browser.toolbar->status_window;
+ new_gui->data.browser.toolbar->standard_buttons = old_gui->data.browser.toolbar->standard_buttons;
+ new_gui->data.browser.toolbar->url_bar = old_gui->data.browser.toolbar->url_bar;
+ new_gui->data.browser.toolbar->throbber = old_gui->data.browser.toolbar->throbber;
+ } else {
+ new_gui->data.browser.toolbar->status_width = option_toolbar_status_width;
+ new_gui->data.browser.toolbar->status_window = option_toolbar_show_status;
+ new_gui->data.browser.toolbar->standard_buttons = option_toolbar_show_buttons;
+ new_gui->data.browser.toolbar->url_bar = option_toolbar_show_address;
+ new_gui->data.browser.toolbar->throbber = option_toolbar_show_throbber;
+ }
+ ro_theme_update_toolbar(new_gui);
+ }
+}
+
+
+/**
+ * Makes a browser window's options the default.
+ *
+ * \param bw the browser window to read options from
+ */
+void gui_window_default_options(struct browser_window *bw) {
+ gui_window *gui;
+
+ /* Abort on bad input
+ */
+ if (bw == NULL) return;
+
+ /* Get our GUI
+ */
+ gui = bw->window;
+ if (!gui) return;
+
+ /* Save the basic options
+ */
+ option_scale = gui->scale * 100;
+ option_dither_sprites = gui->option_dither_sprites;
+ option_filter_sprites = gui->option_filter_sprites;
+ option_animate_images = gui->option_animate_images;
+
+ /* Set up the toolbar
+ */
+ if (gui->data.browser.toolbar) {
+ option_toolbar_status_width = gui->data.browser.toolbar->status_width;
+ option_toolbar_show_status = gui->data.browser.toolbar->status_window;
+ option_toolbar_show_buttons = gui->data.browser.toolbar->standard_buttons;
+ option_toolbar_show_address = gui->data.browser.toolbar->url_bar;
+ option_toolbar_show_throbber = gui->data.browser.toolbar->throbber;
+ }
+}
+
+
+/**
* Determine the language to use.
*
* RISC OS has no standard way of determining which language the user prefers.
@@ -588,7 +682,7 @@ void gui_window_set_pointer(gui_pointer_shape shape)
break;
case GUI_POINTER_CARET:
xosspriteop_set_pointer_shape(0x100, pointers,
- (osspriteop_id)"ptr_caret", 1, 5, 10, 0, 0);
+ (osspriteop_id)"ptr_caret", 1, 5, 0, 0, 0);
break;
case GUI_POINTER_MENU:
xosspriteop_set_pointer_shape(0x100, pointers,
@@ -662,15 +756,24 @@ void ro_gui_redraw_window_request(wimp_draw *redraw)
* Handle Open_Window_Request events.
*/
-void ro_gui_open_window_request(wimp_open *open)
-{
+void ro_gui_open_window_request(wimp_open *open) {
+ struct toolbar *toolbar;
gui_window *g;
g = ro_lookup_gui_from_w(open->w);
- if (g)
+ if (g) {
ro_gui_window_open(g, open);
- else
+ } else {
wimp_open_window(open);
+ g = ro_lookup_gui_status_from_w(open->w);
+ if (g) {
+ toolbar = g->data.browser.toolbar;
+ if (toolbar) {
+ toolbar->resize_status = 1;
+ ro_theme_resize_toolbar(g);
+ }
+ }
+ }
}
@@ -710,8 +813,11 @@ void ro_gui_mouse_click(wimp_pointer *pointer)
else if (g && g->type == GUI_BROWSER_WINDOW && g->window == pointer->w)
ro_gui_window_click(g, pointer);
else if (g && g->type == GUI_BROWSER_WINDOW &&
- g->data.browser.toolbar == pointer->w)
+ g->data.browser.toolbar->toolbar_handle == pointer->w)
ro_gui_toolbar_click(g, pointer);
+ else if (g && g->type == GUI_BROWSER_WINDOW &&
+ g->data.browser.toolbar->status_handle == pointer->w)
+ ro_gui_status_click(g, pointer);
else if (g && g->type == GUI_DOWNLOAD_WINDOW)
ro_download_window_click(g, pointer);
else if (pointer->w == dialog_saveas)
@@ -734,7 +840,7 @@ void ro_gui_icon_bar_click(wimp_pointer *pointer)
char url[80];
sprintf(url, "file:///%%3CNetSurf$Dir%%3E/Docs/intro_%s",
option_language);
- browser_window_create(url);
+ browser_window_create(url, NULL);
}
}
@@ -757,6 +863,10 @@ void ro_gui_drag_end(wimp_dragged *drag)
case GUI_DRAG_SAVE:
ro_gui_save_drag_end(drag);
break;
+
+ case GUI_DRAG_STATUS_RESIZE:
+// ro_gui_save_drag_end(drag);
+ break;
}
}
@@ -780,7 +890,7 @@ void ro_gui_keypress(wimp_key *key)
switch (g->type) {
case GUI_BROWSER_WINDOW:
handled = ro_gui_window_keypress(g, key->c,
- (bool) (g->data.browser.toolbar == key->w));
+ (bool) (g->data.browser.toolbar->toolbar_handle == key->w));
break;
case GUI_DOWNLOAD_WINDOW:
@@ -1092,7 +1202,7 @@ void ro_msg_dataload(wimp_message *message)
browser_window_go(gui->data.browser.bw, url);
}
else {
- browser_window_create(url);
+ browser_window_create(url, NULL);
}
free(url);
@@ -1214,7 +1324,7 @@ void ro_msg_dataopen(wimp_message *message)
url = ro_path_to_url(message->data.data_xfer.file_name);
}
if (url) {
- browser_window_create(url);
+ browser_window_create(url, NULL);
free(url);
}
}
@@ -1293,7 +1403,7 @@ void ro_gui_open_help_page(void)
char url[80];
sprintf(url, "file:///%%3CNetSurf$Dir%%3E/Docs/docs_%s",
option_language);
- browser_window_create(url);
+ browser_window_create(url, NULL);
}
diff --git a/riscos/gui.h b/riscos/gui.h
index 678057d9f..7f6c7cd01 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -16,6 +16,7 @@
#include "netsurf/desktop/netsurf.h"
#include "netsurf/desktop/gui.h"
#include "netsurf/desktop/options.h"
+#include "netsurf/riscos/toolbar.h"
#define THEMES_DIR "<NetSurf$Dir>.Themes"
@@ -36,7 +37,7 @@ typedef enum { GUI_SAVE_SOURCE, GUI_SAVE_DRAW, GUI_SAVE_TEXT,
GUI_SAVE_COMPLETE } gui_save_type;
extern gui_save_type gui_current_save_type;
typedef enum { GUI_DRAG_SELECTION, GUI_DRAG_DOWNLOAD_SAVE,
- GUI_DRAG_SAVE } gui_drag_type;
+ GUI_DRAG_SAVE, GUI_DRAG_STATUS_RESIZE } gui_drag_type;
extern gui_drag_type gui_current_drag_type;
struct gui_window
@@ -47,7 +48,7 @@ struct gui_window
union {
struct {
- wimp_w toolbar;
+ struct toolbar *toolbar;
int toolbar_width;
struct browser_window* bw;
bool reformat_pending;
@@ -78,7 +79,17 @@ struct gui_window
enum { drag_NONE, drag_UNKNOWN, drag_BROWSER_TEXT_SELECTION } drag_status;
- float scale;
+ /* Options
+ */
+ float scale;
+ bool option_dither_sprites;
+ bool option_filter_sprites;
+ int option_toolbar_status_width;
+ bool option_toolbar_show_status;
+ bool option_toolbar_show_buttons;
+ bool option_toolbar_show_address;
+ bool option_toolbar_show_throbber;
+ bool option_animate_images;
};
@@ -96,6 +107,7 @@ void ro_gui_popup_menu(wimp_menu *menu, wimp_w w, wimp_i i);
void ro_gui_menu_selection(wimp_selection* selection);
void ro_gui_menu_warning(wimp_message_menu_warning *warning);
void ro_gui_menu_prepare_save(struct content *c);
+void ro_gui_menu_prepare_scale(void);
/* in dialog.c */
void ro_gui_dialog_init(void);
@@ -106,8 +118,6 @@ bool ro_gui_dialog_keypress(wimp_key *key);
void ro_gui_dialog_close(wimp_w close);
void ro_gui_redraw_config_th(wimp_draw* redraw);
void ro_gui_theme_menu_selection(char *theme);
-void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text);
-char *ro_gui_get_icon_string(wimp_w w, wimp_i i);
/* in download.c */
void ro_gui_download_init(void);
@@ -139,12 +149,16 @@ void ro_gui_window_open(gui_window* g, wimp_open* open);
void ro_gui_window_redraw(gui_window* g, wimp_draw* redraw);
void ro_gui_window_mouse_at(wimp_pointer* pointer);
void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer);
+void ro_gui_status_click(gui_window* g, wimp_pointer* pointer);
void ro_gui_throb(void);
gui_window* ro_lookup_gui_from_w(wimp_w window);
gui_window* ro_lookup_gui_toolbar_from_w(wimp_w window);
+gui_window* ro_lookup_gui_status_from_w(wimp_w window);
gui_window *ro_gui_window_lookup(wimp_w w);
bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar);
void ro_gui_scroll_request(wimp_scroll *scroll);
+//#define window_x_units(x, state) (x - (state->visible.x0 - state->xscroll))
+//#define window_y_units(y, state) (y - (state->visible.y1 - state->yscroll))
int window_x_units(int x, wimp_window_state *state);
int window_y_units(int y, wimp_window_state *state);
bool ro_gui_window_dataload(gui_window *g, wimp_message *message);
@@ -175,18 +189,23 @@ void schedule_remove(void (*callback)(void *p), void *p);
void schedule_run(void);
/* icon numbers */
-#define ICON_TOOLBAR_THROBBER 1
-#define ICON_TOOLBAR_URL 2
-#define ICON_TOOLBAR_STATUS 3
-#define ICON_TOOLBAR_HISTORY 4
-#define ICON_TOOLBAR_RELOAD 5
-#define ICON_TOOLBAR_STOP 6
-#define ICON_TOOLBAR_BACK 7
-#define ICON_TOOLBAR_FORWARD 8
-#define ICON_TOOLBAR_BOOKMARK 9
-#define ICON_TOOLBAR_SAVE 10
-#define ICON_TOOLBAR_PRINT 11
-#define ICON_TOOLBAR_HOME 12
+#define ICON_TOOLBAR_BACK 0
+#define ICON_TOOLBAR_FORWARD 1
+#define ICON_TOOLBAR_STOP 2
+#define ICON_TOOLBAR_RELOAD 3
+#define ICON_TOOLBAR_HOME 4
+#define ICON_TOOLBAR_HISTORY 5
+#define ICON_TOOLBAR_SAVE 6
+#define ICON_TOOLBAR_PRINT 7
+#define ICON_TOOLBAR_BOOKMARK 8
+#define ICON_TOOLBAR_SCALE 9
+#define ICON_TOOLBAR_SEARCH 10
+#define ICON_TOOLBAR_UP 11
+#define ICON_TOOLBAR_URL 12 // Must be after highest toolbar icon
+#define ICON_TOOLBAR_THROBBER 13
+
+#define ICON_STATUS_TEXT 0
+#define ICON_STATUS_RESIZE 1
#define ICON_CONFIG_SAVE 0
#define ICON_CONFIG_CANCEL 1
diff --git a/riscos/menus.c b/riscos/menus.c
index bff407067..a287dadba 100644
--- a/riscos/menus.c
+++ b/riscos/menus.c
@@ -26,8 +26,20 @@
#include "netsurf/utils/utils.h"
+/* Menu index definitions used by menu decoding code so that entries can
+ be quickly commented out. Use -ve numbers below -1 to hide an entry.
+*/
+#define MENU_PAGE 0
+#define MENU_OBJECT -2
+#define MENU_SELECTION -2
+#define MENU_NAVIGATE 1
+#define MENU_VIEW 2
+#define MENU_UTILITIES -2
+#define MENU_HELP 3
+
static void translate_menu(wimp_menu *menu);
static void ro_gui_menu_prepare_images(void);
+static void ro_gui_menu_prepare_toolbars(void);
static void ro_gui_menu_pageinfo(wimp_message_menu_warning *warning);
@@ -36,13 +48,16 @@ static int current_menu_x, current_menu_y;
gui_window *current_gui;
-/* default menu item flags */
+/* Default menu item flags
+*/
#define DEFAULT_FLAGS (wimp_ICON_TEXT | wimp_ICON_FILLED | \
(wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | \
(wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT))
-/* iconbar menu */
-wimp_menu *iconbar_menu = (wimp_menu *) & (wimp_MENU(4)) {
+
+/* Iconbar menu
+*/
+wimp_menu *iconbar_menu = (wimp_menu *)&(wimp_MENU(4)) {
{ "NetSurf" }, 7,2,7,0, 200, 44, 0,
{
{ 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Info" } },
@@ -53,70 +68,149 @@ wimp_menu *iconbar_menu = (wimp_menu *) & (wimp_MENU(4)) {
};
int iconbar_menu_height = 4 * 44;
-/* browser window menu structure - based on Style Guide */
+
+/* Export submenu
+*/
static wimp_MENU(2) export_menu = {
{ "ExportAs" }, 7,2,7,0, 200, 44, 0,
{
- { wimp_MENU_GIVE_WARNING, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Draw" } },
- { wimp_MENU_LAST | wimp_MENU_GIVE_WARNING, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Text" } }
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "Draw" } },
+ { wimp_MENU_LAST | wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "Text" } }
}
};
-static wimp_menu *browser_export_menu = (wimp_menu *) &export_menu;
-static wimp_MENU(5) page_menu = {
+
+/* Page submenu
+*/
+static wimp_MENU(7) page_menu = {
{ "Page" }, 7,2,7,0, 200, 44, 0,
{
- { wimp_MENU_GIVE_WARNING, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "PageInfo" } },
- { wimp_MENU_GIVE_WARNING, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Save" } },
- { wimp_MENU_GIVE_WARNING, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "SaveComp" } },
- { 0, (wimp_menu *) &export_menu, DEFAULT_FLAGS, { "Export" } },
- { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Print" } }
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "PageInfo" } },
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "Save" } },
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "SaveComp" } },
+ { 0, (wimp_menu *)&export_menu, DEFAULT_FLAGS, { "Export" } },
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "SaveURL" } },
+ { wimp_MENU_SEPARATE, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Print" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ViewSrc" } }
+ }
+};
+
+
+/* Object export submenu
+*/
+static wimp_MENU(2) object_export_menu = {
+ { "ExportAs" }, 7,2,7,0, 200, 44, 0,
+ {
+ { wimp_MENU_LAST | wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "Sprite" } }
}
};
-static wimp_menu *browser_page_menu = (wimp_menu *) &page_menu;
+
+/* Object submenu
+*/
+static wimp_MENU(5) object_menu = {
+ { "Object" }, 7,2,7,0, 300, 44, 0,
+ {
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "ObjInfo" } },
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "ObjSave" } },
+ { 0, (wimp_menu *)&object_export_menu, DEFAULT_FLAGS, { "Export" } },
+ { wimp_MENU_GIVE_WARNING | wimp_MENU_SEPARATE, (wimp_menu *)1, DEFAULT_FLAGS, { "SaveURL" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ObjReload" } }
+ }
+};
+
+
+/* Selection submenu
+*/
static wimp_MENU(3) selection_menu = {
{ "Selection" }, 7,2,7,0, 300, 44, 0,
{
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Copy" } },
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "SelectAll" } },
- { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Clear" } }
+ { wimp_MENU_SEPARATE, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Copy" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "SelectAll" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Clear" } }
}
};
-static wimp_menu *browser_selection_menu = (wimp_menu *) &selection_menu;
+
+/* Navigate submenu
+*/
static wimp_MENU(5) navigate_menu = {
{ "Navigate" }, 7,2,7,0, 300, 44, 0,
{
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "OpenURL" } },
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Home" } },
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Back" } },
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Forward" } },
- { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Reload" } }
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Home" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Back" } },
+ { wimp_MENU_SEPARATE, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "Forward" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Reload" } }
}
};
-static wimp_menu *browser_navigate_menu = (wimp_menu *) &navigate_menu;
-static wimp_MENU(2) image_menu = {
+
+/* Image submenu
+*/
+static wimp_MENU(5) image_menu = {
{ "Images" }, 7,2,7,0, 300, 44, 0,
{
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "DitherImg" } },
- { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "FilterImg" } }
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "ForeImg" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "BackImg" } },
+ { wimp_MENU_SEPARATE, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "AnimImg" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "DitherImg" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "FilterImg" } }
}
};
-static wimp_menu *browser_image_menu = (wimp_menu *) &image_menu;
-static wimp_MENU(3) view_menu = {
+
+/* Toolbar submenu
+*/
+static wimp_MENU(4) toolbar_menu = {
+ { "Toolbars" }, 7,2,7,0, 300, 44, 0,
+ {
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ToolButtons" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ToolAddress" } },
+ { wimp_MENU_SEPARATE, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ToolThrob" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ToolStatus" } }
+ }
+};
+
+
+/* View submenu
+*/
+static wimp_MENU(4) view_menu = {
{ "View" }, 7,2,7,0, 300, 44, 0,
{
- { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ScaleView" } },
- { wimp_MENU_SEPARATE | wimp_MENU_GIVE_WARNING, (wimp_menu *) &image_menu, DEFAULT_FLAGS, { "Images" } },
- { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ViewSrc" } }
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)1, DEFAULT_FLAGS, { "ScaleView" } },
+ { wimp_MENU_GIVE_WARNING, (wimp_menu *)&image_menu, DEFAULT_FLAGS, { "Images" } },
+ { wimp_MENU_SEPARATE | wimp_MENU_GIVE_WARNING, (wimp_menu *)&toolbar_menu, DEFAULT_FLAGS, { "Toolbars" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "OptDefault" } }
}
};
-static wimp_menu *browser_view_menu = (wimp_menu *) &view_menu;
+/* Hotlist submenu
+*/
+static wimp_MENU(2) hotlist_menu = {
+ { "Hotlist" }, 7,2,7,0, 300, 44, 0,
+ {
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "HotlistAdd" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "HotlistShow" } }
+ }
+};
+
+
+/* Utilities submenu
+*/
+static wimp_MENU(4) utilities_menu = {
+ { "Utilities" }, 7,2,7,0, 300, 44, 0,
+ {
+ { wimp_MENU_SEPARATE, (wimp_menu *)&hotlist_menu, DEFAULT_FLAGS, { "Hotlist" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "FindText" } },
+ { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "HistLocal" } },
+ { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "HistGlobal" } }
+ }
+};
+
+
+/* Help submenu
+*/
static wimp_MENU(4) help_menu = {
{ "Help" }, 7,2,7,0, 300, 44, 0,
{
@@ -126,22 +220,39 @@ static wimp_MENU(4) help_menu = {
{ wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS | wimp_ICON_SHADED, { "HelpInter" } }
}
};
-static wimp_menu *browser_help_menu = (wimp_menu *) &help_menu;
+/* Main browser menu
+*/
static wimp_MENU(5) menu = {
{ "NetSurf" }, 7,2,7,0, 200, 44, 0,
{
- { 0, (wimp_menu *) &page_menu, DEFAULT_FLAGS, { "Page" } },
- { wimp_MENU_SUB_MENU_WHEN_SHADED, (wimp_menu *) &selection_menu, DEFAULT_FLAGS | wimp_ICON_SHADED, { "Selection" } },
- { 0, (wimp_menu *) &navigate_menu, DEFAULT_FLAGS, { "Navigate" } },
- { 0, (wimp_menu *) &view_menu, DEFAULT_FLAGS, { "View" } },
- { wimp_MENU_LAST, (wimp_menu *) &help_menu, DEFAULT_FLAGS, { "Help" } }
+ { 0, (wimp_menu *)&page_menu, DEFAULT_FLAGS, { "Page" } },
+// { 0, (wimp_menu *)&object_menu, DEFAULT_FLAGS, { "Object" } },
+// { 0, (wimp_menu *)&selection_menu, DEFAULT_FLAGS, { "Selection" } },
+ { 0, (wimp_menu *)&navigate_menu, DEFAULT_FLAGS, { "Navigate" } },
+ { 0, (wimp_menu *)&view_menu, DEFAULT_FLAGS, { "View" } },
+// { 0, (wimp_menu *)&utilities_menu, DEFAULT_FLAGS, { "Utilities" } },
+ { wimp_MENU_LAST, (wimp_menu *)&help_menu, DEFAULT_FLAGS, { "Help" } }
}
};
wimp_menu *browser_menu = (wimp_menu *) &menu;
+static wimp_menu *browser_page_menu = (wimp_menu *)&page_menu;
+static wimp_menu *browser_export_menu = (wimp_menu *)&export_menu;
+static wimp_menu *browser_object_menu = (wimp_menu *)&object_menu;
+static wimp_menu *browser_object_export_menu = (wimp_menu *)&object_export_menu;
+static wimp_menu *browser_selection_menu = (wimp_menu *)&selection_menu;
+static wimp_menu *browser_navigate_menu = (wimp_menu *)&navigate_menu;
+static wimp_menu *browser_view_menu = (wimp_menu *)&view_menu;
+static wimp_menu *browser_image_menu = (wimp_menu *)&image_menu;
+static wimp_menu *browser_toolbar_menu = (wimp_menu *)&toolbar_menu;
+static wimp_menu *browser_utilities_menu = (wimp_menu *)&utilities_menu;
+static wimp_menu *browser_hotlist_menu = (wimp_menu *)&hotlist_menu;
+static wimp_menu *browser_help_menu = (wimp_menu *)&help_menu;
+
+
/**
* Create menu structures.
*/
@@ -152,19 +263,24 @@ void ro_gui_menus_init(void)
translate_menu(browser_menu);
translate_menu(browser_page_menu);
translate_menu(browser_export_menu);
+ translate_menu(browser_object_menu);
+ translate_menu(browser_object_export_menu);
translate_menu(browser_selection_menu);
translate_menu(browser_navigate_menu);
translate_menu(browser_view_menu);
translate_menu(browser_image_menu);
+ translate_menu(browser_toolbar_menu);
+ translate_menu(browser_utilities_menu);
+ translate_menu(browser_hotlist_menu);
translate_menu(browser_help_menu);
iconbar_menu->entries[0].sub_menu = (wimp_menu *) dialog_info;
browser_page_menu->entries[0].sub_menu = (wimp_menu*) dialog_pageinfo;
- browser_page_menu->entries[1].sub_menu = (wimp_menu *) dialog_saveas;
- browser_page_menu->entries[2].sub_menu = (wimp_menu *) dialog_saveas;
- browser_export_menu->entries[0].sub_menu = (wimp_menu *) dialog_saveas;
- browser_export_menu->entries[1].sub_menu = (wimp_menu *) dialog_saveas;
- browser_view_menu->entries[0].sub_menu = (wimp_menu *) dialog_zoom;
+// browser_page_menu->entries[1].sub_menu = (wimp_menu *) dialog_saveas;
+// browser_page_menu->entries[2].sub_menu = (wimp_menu *) dialog_saveas;
+// browser_export_menu->entries[0].sub_menu = (wimp_menu *) dialog_saveas;
+// browser_export_menu->entries[1].sub_menu = (wimp_menu *) dialog_saveas;
+// browser_view_menu->entries[0].sub_menu = (wimp_menu *) dialog_zoom;
}
@@ -272,21 +388,26 @@ void ro_gui_menu_selection(wimp_selection *selection)
} else if (current_menu == browser_menu) {
struct content *c = current_gui->data.browser.bw->current_content;
switch (selection->items[0]) {
- case 0: /* Page -> */
+ case MENU_PAGE:
switch (selection->items[1]) {
case 0: /* Info */
break;
case 1: /* Save */
break;
- case 2: /* Save complete */
+ case 2: /* Full save */
break;
case 3: /* Export */
break;
- case 4: /* Print */
+ case 4: /* Save location */
+ break;
+ case 5: /* Print */
+ break;
+ case 6: /* Page source */
+ ro_gui_view_source(c);
break;
}
break;
- case 1: /* Selection -> */
+ case MENU_SELECTION:
switch (selection->items[1]) {
case 0: /* Copy to clipboard */
ro_gui_copy_selection(current_gui);
@@ -299,43 +420,72 @@ void ro_gui_menu_selection(wimp_selection *selection)
break;
}
break;
- case 2: /* Navigate -> */
+ case MENU_NAVIGATE:
switch (selection->items[1]) {
- case 0: /* Open URL... */
- break;
- case 1: /* Home */
+ case 0: /* Home */
break;
- case 2: /* Back */
+ case 1: /* Back */
history_back(current_gui->data.browser.bw,
current_gui->data.browser.bw->history);
break;
- case 3: /* Forward */
+ case 2: /* Forward */
history_forward(current_gui->data.browser.bw,
current_gui->data.browser.bw->history);
break;
- case 4: /* Reload */
+ case 3: /* Reload */
break;
}
break;
- case 3: /* View -> */
+ case MENU_VIEW:
switch (selection->items[1]) {
case 0: /* Scale view */
break;
case 1: /* Images -> */
- if (selection->items[2] == 0) option_dither_sprites = !option_dither_sprites;
- if (selection->items[2] == 1) option_filter_sprites = !option_filter_sprites;
- if (selection->items[2] >= 0) {
+ if (selection->items[2] == 2) current_gui->option_animate_images =
+ !current_gui->option_animate_images;
+ if (selection->items[2] == 3) current_gui->option_dither_sprites =
+ !current_gui->option_dither_sprites;
+ if (selection->items[2] == 4) current_gui->option_filter_sprites =
+ !current_gui->option_filter_sprites;
+ if (selection->items[2] >= 2) {
ro_gui_menu_prepare_images();
-/* content_broadcast(c, CONTENT_MSG_REDRAW, 0); */
-
+ gui_window_redraw_window(current_gui);
+// content_broadcast(c, CONTENT_MSG_REDRAW, 0);
}
break;
- case 2: /* Page source */
- ro_gui_view_source(c);
+ case 2: /* Toolbars -> */
+ switch (selection->items[2]) {
+ case 0:
+ current_gui->data.browser.toolbar->standard_buttons =
+ !current_gui->data.browser.toolbar->standard_buttons;
+ break;
+ case 1:
+ current_gui->data.browser.toolbar->url_bar =
+ !current_gui->data.browser.toolbar->url_bar;
+ break;
+ case 2:
+ current_gui->data.browser.toolbar->throbber =
+ !current_gui->data.browser.toolbar->throbber;
+ break;
+ case 3:
+ current_gui->data.browser.toolbar->status_window =
+ !current_gui->data.browser.toolbar->status_window;
+ }
+ if (ro_theme_update_toolbar(current_gui) || true) {
+ wimp_window_state state;
+ state.w = current_gui->window;
+ wimp_get_window_state(&state);
+ current_gui->data.browser.old_height = 0xffffffff;
+ ro_gui_window_open(current_gui, (wimp_open *)&state);
+ }
+ ro_gui_menu_prepare_toolbars();
+ break;
+ case 3: /* Make default */
+ gui_window_default_options(current_gui->data.browser.bw);
break;
}
break;
- case 4: /* Help -> */
+ case MENU_HELP:
switch (selection->items[1]) {
case -1: /* No sub-item */
case 0: /* Contents */
@@ -373,11 +523,8 @@ void ro_gui_menu_warning(wimp_message_menu_warning *warning)
struct content *c = current_gui->data.browser.bw->current_content;
os_error *error = NULL; // No warnings
-// if ((warning->selection.items[0] != 0) && (warning->selection.items[0] != 3))
-// return;
-
switch (warning->selection.items[0]) {
- case 0: /* Page -> */
+ case MENU_PAGE: /* Page -> */
switch (warning->selection.items[1]) {
case 3: /* Export as -> */
switch (warning->selection.items[2]) {
@@ -409,13 +556,23 @@ void ro_gui_menu_warning(wimp_message_menu_warning *warning)
error = xwimp_create_sub_menu((wimp_menu *) dialog_saveas,
warning->pos.x, warning->pos.y);
break;
- case 3: /* View -> */
+ case MENU_VIEW: /* View -> */
switch (warning->selection.items[1]) {
+ case 0: /* Scale view -> */
+ ro_gui_menu_prepare_scale();
+ error = xwimp_create_sub_menu((wimp_menu *) dialog_zoom,
+ warning->pos.x, warning->pos.y);
+ break;
case 1: /* Images -> */
ro_gui_menu_prepare_images();
error = xwimp_create_sub_menu(browser_image_menu,
warning->pos.x, warning->pos.y);
break;
+ case 2: /* Toolbars -> */
+ ro_gui_menu_prepare_toolbars();
+ error = xwimp_create_sub_menu(browser_toolbar_menu,
+ warning->pos.x, warning->pos.y);
+ break;
}
break;
}
@@ -473,22 +630,64 @@ void ro_gui_menu_prepare_save(struct content *c)
ro_gui_set_icon_string(dialog_saveas, ICON_SAVE_PATH, name);
}
+
/**
* Update image menu status
*/
-
static void ro_gui_menu_prepare_images(void) {
if (current_menu != browser_menu) return;
/* We don't currently have any local options so we update from the global ones
*/
- browser_image_menu->entries[0].menu_flags &= ~wimp_MENU_TICKED;
- if (option_dither_sprites) browser_image_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
- browser_image_menu->entries[1].menu_flags &= ~wimp_MENU_TICKED;
- if (option_filter_sprites) browser_image_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
+ browser_image_menu->entries[2].menu_flags &= ~wimp_MENU_TICKED;
+ if (current_gui->option_animate_images) browser_image_menu->entries[2].menu_flags |= wimp_MENU_TICKED;
+ browser_image_menu->entries[3].menu_flags &= ~wimp_MENU_TICKED;
+ if (current_gui->option_dither_sprites) browser_image_menu->entries[3].menu_flags |= wimp_MENU_TICKED;
+ browser_image_menu->entries[4].menu_flags &= ~wimp_MENU_TICKED;
+ if (current_gui->option_filter_sprites) browser_image_menu->entries[4].menu_flags |= wimp_MENU_TICKED;
+}
+
+/**
+ * Update toolbar menu status
+ */
+static void ro_gui_menu_prepare_toolbars(void) {
+ int index;
+ struct toolbar *toolbar;
+ if (current_menu != browser_menu) return;
-// content_broadcast(c, CONTENT_MSG_REDRAW, 0);
+ /* Check we have a toolbar
+ */
+ toolbar = current_gui->data.browser.toolbar;
+
+ /* Set our ticks, or shade everything if there's no toolbar
+ */
+ if (toolbar) {
+ for (index = 0; index < 4; index++) {
+ browser_toolbar_menu->entries[index].icon_flags &= ~wimp_ICON_SHADED;
+ browser_toolbar_menu->entries[index].menu_flags &= ~wimp_MENU_TICKED;
+ }
+ if (toolbar->standard_buttons) browser_toolbar_menu->entries[0].menu_flags |= wimp_MENU_TICKED;
+ if (toolbar->url_bar) browser_toolbar_menu->entries[1].menu_flags |= wimp_MENU_TICKED;
+ if (toolbar->throbber) browser_toolbar_menu->entries[2].menu_flags |= wimp_MENU_TICKED;
+ if (toolbar->status_window) browser_toolbar_menu->entries[3].menu_flags |= wimp_MENU_TICKED;
+ } else {
+ for (index = 0; index < 4; index++) {
+ browser_toolbar_menu->entries[index].icon_flags |= wimp_ICON_SHADED;
+ browser_toolbar_menu->entries[index].menu_flags &= ~wimp_MENU_TICKED;
+ }
+ }
+}
+
+
+/**
+ * Update scale to current document value
+ */
+void ro_gui_menu_prepare_scale(void) {
+ char scale_buffer[8];
+ if (current_menu != browser_menu) return;
+ sprintf(scale_buffer, "%.0f", current_gui->scale * 100);
+ ro_gui_set_icon_string(dialog_zoom, ICON_ZOOM_VALUE, scale_buffer);
}
void ro_gui_menu_pageinfo(wimp_message_menu_warning *warning)
diff --git a/riscos/options.h b/riscos/options.h
index 9f9642175..095a799c8 100644
--- a/riscos/options.h
+++ b/riscos/options.h
@@ -25,6 +25,13 @@ extern bool option_filter_sprites;
extern bool option_thumbnail_32bpp;
extern int option_thumbnail_oversampling;
extern bool option_history_tooltip;
+extern int option_scale;
+extern int option_toolbar_status_width;
+extern bool option_toolbar_show_status;
+extern bool option_toolbar_show_buttons;
+extern bool option_toolbar_show_address;
+extern bool option_toolbar_show_throbber;
+extern bool option_animate_images;
#define EXTRA_OPTION_DEFINE \
bool option_use_mouse_gestures = false;\
@@ -36,7 +43,14 @@ bool option_dither_sprites = true;\
bool option_filter_sprites = false;\
bool option_thumbnail_32bpp = true;\
int option_thumbnail_oversampling = 0;\
-bool option_history_tooltip = true;
+bool option_history_tooltip = true; \
+int option_scale = 100; \
+int option_toolbar_status_width = 640; \
+bool option_toolbar_show_status = true; \
+bool option_toolbar_show_buttons = true; \
+bool option_toolbar_show_address = true; \
+bool option_toolbar_show_throbber = true; \
+bool option_animate_images = true;
#define EXTRA_OPTION_TABLE \
{ "use_mouse_gestures", OPTION_BOOL, &option_use_mouse_gestures },\
@@ -48,6 +62,13 @@ bool option_history_tooltip = true;
{ "filter_sprites", OPTION_BOOL, &option_filter_sprites },\
{ "thumbnail_32bpp", OPTION_BOOL, &option_thumbnail_32bpp },\
{ "thumbnail_oversampling", OPTION_INTEGER, &option_thumbnail_oversampling },\
-{ "history_tooltip", OPTION_BOOL, &option_history_tooltip }
+{ "history_tooltip", OPTION_BOOL, &option_history_tooltip }, \
+{ "scale", OPTION_INTEGER, &option_scale }, \
+{ "toolbar_show_status", OPTION_BOOL, &option_toolbar_show_status }, \
+{ "toolbar_status_width", OPTION_INTEGER, &option_toolbar_status_width }, \
+{ "toolbar_show_buttons", OPTION_BOOL, &option_toolbar_show_buttons }, \
+{ "toolbar_show_address", OPTION_BOOL, &option_toolbar_show_address }, \
+{ "toolbar_show_throbber", OPTION_BOOL, &option_toolbar_show_throbber }, \
+{ "animate_images", OPTION_BOOL, &option_animate_images }
#endif
diff --git a/riscos/plugin.c b/riscos/plugin.c
index fe8ba080c..4a63f2900 100644
--- a/riscos/plugin.c
+++ b/riscos/plugin.c
@@ -1290,7 +1290,7 @@ void plugin_url_access(wimp_message *message) {
browser_window_go(npl->bw, url);
}
else if (strcasecmp(window, "_blank") == 0) {
- browser_window_create(url);
+ browser_window_create(url, NULL);
}
}
else { /* POST request */
diff --git a/riscos/theme.c b/riscos/theme.c
index 2febebc0b..20195196c 100644
--- a/riscos/theme.c
+++ b/riscos/theme.c
@@ -4,6 +4,7 @@
* http://www.opensource.org/licenses/gpl-license
* Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
* Copyright 2003 James Bursa <bursa@users.sourceforge.net>
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
*/
/** \file
@@ -14,16 +15,27 @@
#include <assert.h>
#include <stdio.h>
#include <string.h>
+#include "oslib/os.h"
#include "oslib/osfile.h"
#include "oslib/osspriteop.h"
#include "oslib/wimp.h"
+#include "oslib/wimpspriteop.h"
#include "netsurf/riscos/gui.h"
#include "netsurf/riscos/theme.h"
+#include "netsurf/riscos/toolbar.h"
+#include "netsurf/riscos/wimp.h"
#include "netsurf/utils/utils.h"
+#include "netsurf/utils/log.h"
-static wimp_window *theme_toolbar_template = 0;
+/* Current sprite area
+*/
static osspriteop_area *theme_sprite_area = 0;
-unsigned int theme_throbs;
+
+/* Throbber details
+*/
+int theme_throbs;
+static int throbber_width;
+static int throbber_height;
/**
@@ -33,72 +45,74 @@ unsigned int theme_throbs;
* and a Sprites file containing icons.
*/
-void ro_theme_load(char *pathname)
-{
- char name[] = "toolbar";
- int context, window_size, data_size, size, i;
- static char *data = 0;
- char *filename = alloca(strlen(pathname) + 12);
+void ro_theme_load(char *pathname) {
+ osbool mask;
+ os_mode mode;
+ os_coord dimensions;
+ int size, i, n;
+ char filename[strlen(pathname) + 16];
fileswitch_object_type obj_type;
- /* free old theme data */
- free(theme_toolbar_template);
- free(data);
+ /* Release previous sprite are
+ */
free(theme_sprite_area);
+ theme_sprite_area = NULL;
- /* load template */
- sprintf(filename, "%s.Templates", pathname);
- wimp_open_template(filename);
+ /* Reset the throbber variables
+ */
+ theme_throbs = 0;
+ throbber_height = 0;
+ throbber_width = 0;
- /* find required buffer sizes */
- context = wimp_load_template(wimp_GET_SIZE, 0, 0, wimp_NO_FONTS,
- name, 0, &window_size, &data_size);
- assert(context != 0);
+ /* Load the sprites
+ */
+ sprintf(filename, "%s.Sprites", pathname);
+ xosfile_read_no_path(filename, &obj_type, 0, 0, &size, 0);
- theme_toolbar_template = xcalloc((unsigned int) window_size, 1);
- data = xcalloc((unsigned int) data_size, 1);
+ /* Claim memory for a sprite file if we have one
+ */
+ if (obj_type & fileswitch_IS_FILE) theme_sprite_area = malloc(size + 16);
- /* load */
- wimp_load_template(theme_toolbar_template, data, data + data_size,
- wimp_NO_FONTS, name, 0, 0, 0);
+ /* Load the sprite file if we have any memory
+ */
+ if (theme_sprite_area) {
- wimp_close_template();
+ /* Initialise then load
+ */
+ theme_sprite_area->size = size + 16;
+ theme_sprite_area->sprite_count = 0;
+ theme_sprite_area->first = 16;
+ theme_sprite_area->used = 16;
+ xosspriteop_clear_sprites(osspriteop_USER_AREA, theme_sprite_area);
+ xosspriteop_load_sprite_file(osspriteop_USER_AREA, theme_sprite_area,
+ filename);
- assert(ICON_TOOLBAR_RELOAD < theme_toolbar_template->icon_count);
- theme_toolbar_template->flags |= wimp_WINDOW_FURNITURE_WINDOW;
- theme_toolbar_template->icons[ICON_TOOLBAR_URL].data.indirected_text.size = 256;
- theme_toolbar_template->icons[ICON_TOOLBAR_STATUS].data.indirected_text.size = 256;
+ /* Find the highest sprite called 'throbber%i', and get the maximum
+ dimensions for all 'thobber%i' icons. We use the filename buffer
+ as the temporary spritename buffer as it is guaranteed to be at
+ least 12 bytes (max sprite name size).
+ */
+ for (i = 1; i <= theme_sprite_area->sprite_count; i++) {
+ osspriteop_return_name(osspriteop_USER_AREA,
+ theme_sprite_area, filename, 12, i);
+ if (strncmp(filename, "throbber", 8) == 0) {
+ /* Get the max sprite width/height
+ */
+ xosspriteop_read_sprite_info(osspriteop_USER_AREA,
+ theme_sprite_area, (osspriteop_id)filename,
+ &dimensions.x, &dimensions.y, &mask, &mode);
+ ro_convert_pixels_to_os_units(&dimensions, mode);
+ if (dimensions.x > throbber_width) throbber_width = dimensions.x;
+ if (dimensions.y > throbber_height) throbber_height = dimensions.y;
- /* load sprites */
- sprintf(filename, "%s.Sprites", pathname);
- obj_type = osfile_read_no_path(filename, 0, 0, &size, 0);
- assert(obj_type & fileswitch_IS_FILE);
-
- theme_sprite_area = xcalloc((unsigned int)(size + 16), 1);
- theme_sprite_area->size = size + 16;
- theme_sprite_area->sprite_count = 0;
- theme_sprite_area->first = 16;
- theme_sprite_area->used = 16;
- osspriteop_clear_sprites(osspriteop_USER_AREA, theme_sprite_area);
- osspriteop_load_sprite_file(osspriteop_USER_AREA, theme_sprite_area,
- filename);
-
- theme_toolbar_template->sprite_area = theme_sprite_area;
- theme_toolbar_template->icons[ICON_TOOLBAR_THROBBER].data.indirected_sprite.area =
- theme_sprite_area;
-
- /* find the highest sprite called throbber%i */
- theme_throbs = 0;
- for (i = 1; i <= theme_sprite_area->sprite_count; i++) {
- char name[32];
- osspriteop_return_name(osspriteop_USER_AREA,
- theme_sprite_area, name, 32, i);
- if (strncmp(name, "throbber", 8) == 0) {
- unsigned int n = atoi(name + 8);
- if (theme_throbs < n)
- theme_throbs = n;
+ /* Get the throbber number
+ */
+ n = atoi(filename + 8);
+ if (theme_throbs < n) theme_throbs = n;
+ }
}
}
+
}
@@ -109,44 +123,184 @@ void ro_theme_load(char *pathname)
* throbber_buffer at least 12 bytes;
*/
-wimp_w ro_theme_create_toolbar(char *url_buffer, char *status_buffer,
- char *throbber_buffer)
-{
- wimp_w w;
+void ro_theme_create_toolbar(gui_window *g) {
+ struct toolbar *toolbar;
- theme_toolbar_template->icons[ICON_TOOLBAR_URL].data.indirected_text.text = url_buffer;
- theme_toolbar_template->icons[ICON_TOOLBAR_STATUS].data.indirected_text.text = status_buffer;
- theme_toolbar_template->icons[ICON_TOOLBAR_THROBBER].data.indirected_sprite.id =
- (osspriteop_id) throbber_buffer;
+ /* Destroy any previous toolbar (paranoia)
+ */
+ if (g->data.browser.toolbar) {
+ ro_toolbar_destroy(g->data.browser.toolbar);
+ g->data.browser.toolbar = NULL;
+ }
+ /* Create a toolbar
+ */
+ toolbar = ro_toolbar_create(theme_sprite_area, g->url, g->status, g->throb_buf);
+ if (toolbar == NULL) return;
+
+ /* Set up the throbber
+ */
+ toolbar->throbber_width = throbber_width;
+ toolbar->throbber_height = throbber_height;
+ toolbar->status_width = 640;
+
+ /* Store our toolbar
+ */
+ g->data.browser.toolbar = toolbar;
- w = wimp_create_window(theme_toolbar_template);
- return w;
+ /* Update the toolbar
+ */
+ ro_theme_update_toolbar(g);
}
/**
- * Return the height of the current toolbar.
+ * Updates any toolbar flags (eg closes windows, hides icons etc)
+ *
+ * \return non-zero if the toolbar height has changed
*/
+int ro_theme_update_toolbar(gui_window *g) {
+ wimp_outline outline;
+ wimp_window_state state;
+ struct toolbar *toolbar;
+ int return_value = 0;
+
+ /* Set an update as pending
+ */
+ toolbar = g->data.browser.toolbar;
+ toolbar->update_pending = true;
+
+ /* Close the status window if we should, or resize it
+ */
+ if (toolbar->status_window) {
-int ro_theme_toolbar_height(void)
-{
- return abs(theme_toolbar_template->extent.y1 - theme_toolbar_template->extent.y0) + 2;
+ /* Update the status height
+ */
+ ro_toolbar_resize_status(toolbar, ro_get_hscroll_height(g->window) - 2);
+ } else {
+ xwimp_close_window(toolbar->status_handle);
+ }
+
+ /* Update the toolbar height
+ */
+ return_value = ro_theme_resize_toolbar(g);
+
+ /* Open/close the toolbar
+ */
+ if (toolbar->height > 0) {
+ outline.w = g->window;
+ xwimp_get_window_outline(&outline);
+ state.w = g->window;
+ xwimp_get_window_state(&state);
+ state.w = toolbar->toolbar_handle;
+ state.visible.x1 = outline.outline.x1 - 2;
+ state.visible.y0 = state.visible.y1 - toolbar->height;
+ state.xscroll = 0;
+ state.yscroll = 0;
+ state.next = wimp_TOP;
+ xwimp_open_window_nested((wimp_open *)&state, g->window,
+ 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);
+ } else {
+ xwimp_close_window(toolbar->toolbar_handle);
+ }
+
+ /* Return
+ */
+ return return_value;
}
/**
- * Resize the URL icon in a toolbar.
+ * Resize the status and toolbar windows.
+ *
+ * \return non-zero if the toolbar height has changed
*/
+int ro_theme_resize_toolbar(gui_window *g) {
+ os_box extent = { 0, 0, 0, 0 };
+ struct toolbar *toolbar;
+ wimp_outline outline;
+ wimp_outline status_outline;
+ wimp_window_state state;
+ int width, status_width;
+ int return_value = 0;
+
+ /* Paranoia
+ */
+ toolbar = g->data.browser.toolbar;
+ if (toolbar == NULL) return 0;
-void ro_theme_resize_toolbar(wimp_w w, int width, int height)
-{
- wimp_icon_state ic;
- ic.w = w;
- ic.i = ICON_TOOLBAR_URL;
- wimp_get_icon_state(&ic);
-
- wimp_resize_icon(w, ICON_TOOLBAR_URL, ic.icon.extent.x0, ic.icon.extent.y0,
- width - 8, ic.icon.extent.y1);
- wimp_force_redraw(w, ic.icon.extent.x0, ic.icon.extent.y0,
- width, ic.icon.extent.y1);
+ /* Get the toolbar width
+ */
+ outline.w = g->window;
+ if (xwimp_get_window_outline(&outline)) return 0;
+ width = outline.outline.x1 - outline.outline.x0 - 2;
+
+ /* Reformat if we should
+ */
+ if ((toolbar->width != width) || (toolbar->resize_status) || (toolbar->update_pending)) {
+ if (toolbar->resize_status) {
+ status_outline.w = toolbar->status_handle;
+ if (xwimp_get_window_outline(&status_outline)) return 0;
+ toolbar->status_width = width -
+ (status_outline.outline.x1 - status_outline.outline.x0 - 4);
+ toolbar->resize_status = 0;
+ } else {
+ /* Update the extent of the status window
+ */
+ state.w = g->window;
+ if (xwimp_get_window_state(&state)) return 0;
+ extent.x1 = state.visible.x1 - state.visible.x0;
+ extent.y1 = toolbar->status_height - 2;
+ xwimp_set_extent(toolbar->status_handle, &extent);
+
+ /* Re-open the status window as we can't use the nested
+ wimp to manage everything as it would keep extending
+ the size incorrectly.
+ */
+ status_width = width - toolbar->status_width;
+ if (status_width < 12) status_width = 12;
+ if (toolbar->status_window) {
+ state.w = toolbar->status_handle;
+ state.xscroll = 0;
+ state.yscroll = 0;
+ state.next = wimp_TOP;
+ state.visible.x0 = outline.outline.x0;
+ state.visible.x1 = outline.outline.x0 + status_width;
+ state.visible.y0 = outline.outline.y0 - toolbar->status_height;
+ state.visible.y1 = outline.outline.y0 - 2;
+ xwimp_open_window_nested((wimp_open *) &state, g->window,
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_XORIGIN_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_YORIGIN_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_LS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_BS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
+ << wimp_CHILD_RS_EDGE_SHIFT |
+ wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
+ << wimp_CHILD_TS_EDGE_SHIFT);
+ } else {
+ if (toolbar->update_pending) {
+ xwimp_close_window(toolbar->status_handle);
+ }
+ }
+ }
+
+ /* Resize the toolbar
+ */
+ return ro_toolbar_reformat(toolbar, width);
+ }
+ return return_value;
}
diff --git a/riscos/theme.h b/riscos/theme.h
index 249328674..c04c6aa6e 100644
--- a/riscos/theme.h
+++ b/riscos/theme.h
@@ -4,14 +4,14 @@
* http://www.opensource.org/licenses/gpl-license
* Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
* Copyright 2003 James Bursa <bursa@users.sourceforge.net>
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
*/
/** \file
* Toolbar themes (interface).
*
- * A theme consists of a template for the toolbar and icons. There is one
- * current theme, which is changed by ro_theme_load(). A toolbar can then be
- * created and manipulated.
+ * A theme consists of a simple sprite file. There is one current theme, which
+ * is changed by ro_theme_load(). A toolbar can then be created and manipulated.
*/
#ifndef _NETSURF_RISCOS_THEME_H_
@@ -19,12 +19,11 @@
#include "oslib/wimp.h"
-extern unsigned int theme_throbs;
+extern int theme_throbs;
void ro_theme_load(char *pathname);
-wimp_w ro_theme_create_toolbar(char *url_buffer, char *status_buffer,
- char *throbber_buffer);
-int ro_theme_toolbar_height(void);
-void ro_theme_resize_toolbar(wimp_w w, int width, int height);
+void ro_theme_create_toolbar(gui_window *g);
+int ro_theme_update_toolbar(gui_window *g);
+int ro_theme_resize_toolbar(gui_window *g);
#endif
diff --git a/riscos/toolbar.c b/riscos/toolbar.c
new file mode 100644
index 000000000..b908c6c6d
--- /dev/null
+++ b/riscos/toolbar.c
@@ -0,0 +1,696 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ */
+
+/** \file
+ * Customisable toolbars (implementation).
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include "oslib/os.h"
+#include "oslib/osspriteop.h"
+#include "oslib/wimp.h"
+#include "oslib/wimpspriteop.h"
+#include "netsurf/riscos/gui.h"
+#include "netsurf/riscos/toolbar.h"
+#include "netsurf/riscos/wimp.h"
+#include "netsurf/utils/log.h"
+
+/* A basic window for the toolbar and status
+*/
+static wimp_window empty_window = {
+ {0, 0, 16384, 16384},
+ 0,
+ 0,
+ wimp_TOP,
+ wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_MOVEABLE | wimp_WINDOW_AUTO_REDRAW | wimp_WINDOW_FURNITURE_WINDOW,
+ wimp_COLOUR_BLACK,
+ wimp_COLOUR_LIGHT_GREY,
+ wimp_COLOUR_LIGHT_GREY,
+ wimp_COLOUR_VERY_LIGHT_GREY,
+ wimp_COLOUR_DARK_GREY,
+ wimp_COLOUR_MID_LIGHT_GREY,
+ wimp_COLOUR_CREAM,
+ wimp_WINDOW_NEVER3D,
+ {0, 0, 16384, 16384},
+ 0,
+ 0,
+ wimpspriteop_AREA,
+ 12,
+ 1,
+ {""},
+ 0
+};
+
+/* Holder for quick icon creation
+*/
+static wimp_icon_create empty_icon;
+
+/* Shared URL validation
+*/
+static char *url_validation = "Pptr_write\0";
+static char *resize_validation = "R1;Pptr_lr,8,6\0";
+static char *null_text_string = "\0";
+
+
+static struct toolbar *ro_toolbar_create_icons(struct toolbar *toolbar, osspriteop_area *sprite_area,
+ char *url_buffer, char *throbber_buffer);
+static struct toolbar_icon *ro_toolbar_create_icon(osspriteop_area *sprite_area, char *sprite, unsigned int icon);
+static struct toolbar_icon *ro_toolbar_create_separator(void);
+static void ro_toolbar_destroy_icon(struct toolbar_icon *icon);
+static void ro_toolbar_add_icon(struct toolbar *toolbar, struct toolbar_icon *icon);
+
+/**
+ * Creates a toolbar with a complete set of icons
+ *
+ * \param sprite_area the sprite area to read from
+ */
+struct toolbar *ro_toolbar_create(osspriteop_area *sprite_area, char *url_buffer,
+ char *status_buffer, char *throbber_buffer) {
+ struct toolbar *toolbar;
+ wimp_i icon_handle;
+
+ /* Create a new toolbar
+ */
+ toolbar = calloc(1, sizeof(struct toolbar));
+ if (!toolbar) return NULL;
+ toolbar->update_pending = true;
+ toolbar->standard_buttons = true;
+ toolbar->url_bar = true;
+ toolbar->throbber = true;
+ toolbar->status_window = true;
+ toolbar->status_old_width = 0xffffffff;
+
+ /* Load the toolbar icons
+ */
+ if (sprite_area) {
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "back", ICON_TOOLBAR_BACK));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "forward", ICON_TOOLBAR_FORWARD));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "stop", ICON_TOOLBAR_STOP));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "reload", ICON_TOOLBAR_RELOAD));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_separator());
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "home", ICON_TOOLBAR_HOME));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "up", ICON_TOOLBAR_UP));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "search", ICON_TOOLBAR_SEARCH));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "history", ICON_TOOLBAR_HISTORY));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "scale", ICON_TOOLBAR_SCALE));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_separator());
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "mark", ICON_TOOLBAR_BOOKMARK));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "save", ICON_TOOLBAR_SAVE));
+ ro_toolbar_add_icon(toolbar, ro_toolbar_create_icon(sprite_area, "print", ICON_TOOLBAR_PRINT));
+ }
+
+ /* Set the sprite area
+ */
+ if (sprite_area) {
+ empty_window.sprite_area = sprite_area;
+ } else {
+ empty_window.sprite_area = 1;
+ }
+
+ /* Create the basic windows
+ */
+ empty_window.ymin = 36;
+ if (xwimp_create_window(&empty_window, &toolbar->status_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ empty_window.ymin = 1;
+ if (xwimp_create_window(&empty_window, &toolbar->toolbar_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ /* Create the status window icons. First the status text
+ */
+ empty_icon.w = toolbar->status_handle;
+ empty_icon.icon.extent.x0 = 0;
+ empty_icon.icon.extent.y0 = 0;
+ empty_icon.icon.extent.x1 = 16384;
+ empty_icon.icon.extent.y1 = 36;
+ empty_icon.icon.flags = wimp_ICON_TEXT | (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) |
+ wimp_ICON_INDIRECTED | wimp_ICON_VCENTRED;
+ empty_icon.icon.data.indirected_text.text = status_buffer;
+ empty_icon.icon.data.indirected_text.validation = 0;
+ empty_icon.icon.data.indirected_text.size = 256;
+ if (xwimp_create_icon(&empty_icon, &icon_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ /* And finally the status resize icon
+ */
+ empty_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED |
+ wimp_ICON_BORDER | wimp_ICON_FILLED |
+ (wimp_COLOUR_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT) |
+ (wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT);
+ empty_icon.icon.extent.x1 = 0;
+ empty_icon.icon.data.indirected_text.text = null_text_string;
+ empty_icon.icon.data.indirected_text.validation = resize_validation;
+ empty_icon.icon.data.indirected_text.size = 1;
+ if (xwimp_create_icon(&empty_icon, &icon_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ /* Create the icons
+ */
+ toolbar = ro_toolbar_create_icons(toolbar, sprite_area, url_buffer, throbber_buffer);
+
+ /* Return the toolbar
+ */
+ return toolbar;
+}
+
+
+/**
+ * Creates a WIMP icons for the toolbar
+ *
+ * \param toolbar the toolbar to build from
+ * \param sprite_area the sprite area to plot sprites from
+ */
+static struct toolbar *ro_toolbar_create_icons(struct toolbar *toolbar, osspriteop_area *sprite_area,
+ char *url_buffer, char *throbber_buffer) {
+ int index;
+ struct toolbar_icon *cur_icon;
+ wimp_i icon_handle;
+
+ /* Set the basic icon flags
+ */
+ empty_icon.w = toolbar->toolbar_handle;
+ empty_icon.icon.extent.x0 = 0;
+ empty_icon.icon.extent.y0 = 0;
+ empty_icon.icon.extent.x1 = 0;
+ empty_icon.icon.extent.y1 = 0;
+ empty_icon.icon.data.indirected_text.text = null_text_string;
+ empty_icon.icon.data.indirected_text.size = 1;
+ empty_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);
+
+ /* Create all the required icons
+ */
+ for (index = 0; index < ICON_TOOLBAR_URL; index++) {
+
+ /* Find an icon with the correct index and get the validation
+ */
+ empty_icon.icon.data.indirected_text.validation = 0;
+ cur_icon = toolbar->icon;
+ while (cur_icon) {
+ if (cur_icon->icon_number == index) {
+ empty_icon.icon.data.indirected_text.validation = cur_icon->validation;
+ cur_icon = NULL;
+ } else {
+ cur_icon = cur_icon->next_icon;
+ }
+ }
+
+ /* Create the icon and destroy the toolbar on failure
+ */
+ if (xwimp_create_icon(&empty_icon, &icon_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+ }
+
+ /* Now the URL icon
+ */
+ empty_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_VCENTRED |
+ wimp_ICON_BORDER | wimp_ICON_FILLED |
+ (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) |
+ (wimp_BUTTON_WRITE_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT);
+ empty_icon.icon.data.indirected_text.text = url_buffer;
+ empty_icon.icon.data.indirected_text.validation = url_validation;
+ empty_icon.icon.data.indirected_text.size = 256;
+ if (xwimp_create_icon(&empty_icon, &icon_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ /* Now the throbber
+ */
+ empty_icon.icon.flags = wimp_ICON_SPRITE | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED |
+ wimp_ICON_VCENTRED;
+ empty_icon.icon.data.indirected_sprite.id = (osspriteop_id)throbber_buffer;
+ if (sprite_area) {
+ empty_icon.icon.data.indirected_sprite.area = sprite_area;
+ } else {
+ empty_icon.icon.data.indirected_sprite.area = 1;
+ }
+ empty_icon.icon.data.indirected_sprite.size = 12;
+ if (xwimp_create_icon(&empty_icon, &icon_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ /* And finally the status resize icon
+ */
+ empty_icon.w = toolbar->status_handle;
+ empty_icon.icon.flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED |
+ wimp_ICON_BORDER | wimp_ICON_FILLED |
+ (wimp_COLOUR_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT) |
+ (wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT);
+ empty_icon.icon.data.indirected_text.text = null_text_string;
+ empty_icon.icon.data.indirected_text.validation = resize_validation;
+ empty_icon.icon.data.indirected_text.size = 1;
+ if (xwimp_create_icon(&empty_icon, &icon_handle)) {
+ ro_toolbar_destroy(toolbar);
+ return NULL;
+ }
+
+ /* Success - return what we had
+ */
+ return toolbar;
+
+}
+
+
+/**
+ * Releases all icons and associated memory for a toolbar
+ *
+ * \param toolbar the toolbar to destroy
+ */
+void ro_toolbar_destroy(struct toolbar *toolbar) {
+ struct toolbar_icon *cur_icon;
+ struct toolbar_icon *next_icon;
+
+ /* Paranoia
+ */
+ if (toolbar == NULL) return;
+
+ /* Free all our icons
+ */
+ next_icon = toolbar->icon;
+ while((cur_icon = next_icon) != NULL) {
+ next_icon = cur_icon->next_icon;
+ ro_toolbar_destroy_icon(cur_icon);
+ }
+
+ /* Destroy our windows
+ */
+ if (toolbar->status_handle) xwimp_delete_window(toolbar->status_handle);
+ if (toolbar->toolbar_handle) xwimp_delete_window(toolbar->toolbar_handle);
+
+ /* Destroy ourself
+ */
+ free(toolbar);
+}
+
+
+/**
+ * Creates a toolbar icon
+ *
+ * \param sprite_area the sprite area to read from
+ * \param sprite the requested sprite
+ * \param icon the icon number
+ */
+static struct toolbar_icon *ro_toolbar_create_icon(osspriteop_area *sprite_area, char *sprite, unsigned int icon) {
+ struct toolbar_icon *current_icon;
+ int i;
+ int sprite_name_size = 0;
+ os_coord dimensions;
+ char name[16];
+ osbool mask;
+ os_mode mode;
+ unsigned int validation_length;
+
+ /* Check if the sprite exists
+ */
+ for (i = 1; i <= sprite_area->sprite_count; i++) {
+ if (!xosspriteop_return_name(osspriteop_USER_AREA,
+ sprite_area, name, 16, i, &sprite_name_size)) {
+ name[sprite_name_size] = '\0';
+ if (strncmp(name, sprite, sprite_name_size + 1) == 0) {
+
+ /* Yes, a while loop would be better...
+ */
+ goto ro_toolbar_create_icon_found;
+ }
+ }
+ }
+
+ /* No icon found
+ */
+ return NULL;
+ro_toolbar_create_icon_found:
+
+ /* Get the sprite details
+ */
+ xosspriteop_read_sprite_info(osspriteop_USER_AREA,
+ sprite_area, (osspriteop_id)name,
+ &dimensions.x, &dimensions.y, &mask, &mode);
+
+ /* Create an icon
+ */
+ current_icon = (struct toolbar_icon *)calloc(1, sizeof(struct toolbar_icon));
+ if (!current_icon) return NULL;
+
+ /* Get the validation buffer for 'R5;S<name>,p<name>\0'. We always assume
+ there is a pushed variant as RISC OS happily ignores it if it doesn't
+ exist.
+ */
+ validation_length = sprite_name_size * 2 + 8;
+ current_icon->validation = malloc(validation_length);
+ if (!current_icon->validation) {
+ free(current_icon);
+ return NULL;
+ }
+ sprintf(current_icon->validation, "R5;S%s,p%s", name, name);
+
+ /* We want eig factors rather than pixels
+ */
+ ro_convert_pixels_to_os_units(&dimensions, mode);
+ current_icon->width = dimensions.x;
+ current_icon->height = dimensions.y;
+ current_icon->icon_number = icon;
+ current_icon->available = true;
+
+ /* Return our structure
+ */
+ return current_icon;
+}
+
+
+/**
+ * Creates a toolbar separator icon
+ *
+ */
+static struct toolbar_icon *ro_toolbar_create_separator(void) {
+ struct toolbar_icon *current_icon;
+
+ /* Create an icon
+ */
+ current_icon = (struct toolbar_icon *)calloc(1, sizeof(struct toolbar_icon));
+ if (!current_icon) return NULL;
+
+ /* Set it as a 8 OS unit separator
+ */
+ current_icon->icon_number = -1;
+ current_icon->available = true;
+ current_icon->width = 16;
+
+ /* Return our structure
+ */
+ return current_icon;
+}
+
+
+/**
+ * Removes all associated memory with a toolbar icon
+ *
+ * \param icon the icon to destroy
+ */
+static void ro_toolbar_destroy_icon(struct toolbar_icon *icon) {
+ if (!icon->icon_number >= 0) free(icon->validation);
+ free(icon);
+}
+
+
+/**
+ * Adds a toolbar icon to the toolbar
+ *
+ * \param toolbar the toolbar to add to
+ * \param icon the icon to add
+ */
+static void ro_toolbar_add_icon(struct toolbar *toolbar, struct toolbar_icon *icon) {
+ struct toolbar_icon *cur_icon;
+
+ /* If we've been given a NULL due to a failure to create a toolbar
+ icon then we barf.
+ */
+ if (icon == NULL) return;
+
+ /* Traverse to the end of our linked list.
+ */
+ cur_icon = toolbar->icon;
+ if (!cur_icon) {
+
+ /* First icon cannot be a separator. Well, it can, but it's very unlikely
+ that this has arisen from anything other than the previous icons not
+ being present
+ */
+ if (icon->icon_number < 0) return;
+ toolbar->icon = icon;
+ } else {
+ while (cur_icon->next_icon) cur_icon = cur_icon->next_icon;
+
+ /* Two separators should not follow each other.
+ */
+ if ((cur_icon->icon_number < 0) && (icon->icon_number < 0)) return;
+ cur_icon->next_icon = icon;
+ }
+
+ /* Stop potential circular linking
+ */
+ icon->next_icon = NULL;
+}
+
+
+/**
+ * Resizes the status bar height (toolsprites change)
+ *
+ * \param toolbar the toolbar to update
+ * \param height the new status bar height
+ */
+void ro_toolbar_resize_status(struct toolbar *toolbar, int height) {
+ os_box extent = { 0, 0, 0, 0 };
+
+ /* Paranoia
+ */
+ if (toolbar == NULL) return;
+
+ /* Check if we need to update
+ */
+ if (toolbar->status_height != height) {
+ toolbar->status_height = height;
+ xwimp_resize_icon(toolbar->status_handle, ICON_STATUS_TEXT,
+ 0, 0, 16384, height - 2);
+ xwimp_force_redraw(toolbar->status_handle, 0, 0, 16384, height);
+ extent.x1 = 16384;
+ extent.y1 = height - 2;
+ xwimp_set_extent(toolbar->status_handle, &extent);
+ }
+}
+
+
+/**
+ * Reformat the contents of the toolbar/status window
+ *
+ * \param toolbar the toolbar to update
+ * \param width the new toolbar width
+ * \return non-zero if the toolbar height has changed
+ */
+int ro_toolbar_reformat(struct toolbar *toolbar, int width) {
+ wimp_caret caret;
+ unsigned int right_margin = 8;
+ int min_width = 0;
+ int status_width = 0;
+ int old_width;
+
+ /* Paranoia
+ */
+ if (toolbar == NULL) return 0;
+
+ /* Check we aren't too small
+ */
+ toolbar->width = width;
+ if (toolbar->throbber) min_width = toolbar->throbber_width + 8;
+ if (toolbar->standard_buttons) min_width += toolbar->icon_width;
+ if (toolbar->url_bar) min_width += 64;
+ if (width < min_width) width = min_width;
+
+ /* Check if we need to update the icons
+ */
+ if (toolbar->update_pending) {
+ toolbar->update_pending = 0;
+ toolbar->width_internal = 0xffffffff;
+ return ro_toolbar_update(toolbar);
+ }
+
+ /* See if we need to move anything
+ */
+ if (width != toolbar->width_internal) {
+ toolbar->width_internal = width;
+
+ /* Move the throbber
+ */
+ if ((toolbar->throbber) && (toolbar->throbber_width > 0)) {
+ xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_THROBBER,
+ width - toolbar->throbber_width - 8,
+ (toolbar->height - toolbar->throbber_height) / 2,
+ width - 8,
+ (toolbar->height + toolbar->throbber_height) / 2);
+ right_margin += toolbar->throbber_width + 8;
+ }
+
+ /* Resize the URL bar
+ */
+ if (toolbar->url_bar) {
+ xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
+ toolbar->icon_width,
+ (toolbar->height - 52) / 2,
+ width - right_margin,
+ (toolbar->height + 52) / 2);
+
+ /* Handle the caret moving
+ */
+ if (!xwimp_get_caret_position(&caret)) {
+ if ((caret.w == toolbar->toolbar_handle) && (caret.i == ICON_TOOLBAR_URL)) {
+ xwimp_set_caret_position(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
+ caret.pos.x, caret.pos.y, -1, caret.index);
+ }
+ }
+ }
+
+ /* Force a redraw
+ */
+ xwimp_force_redraw(toolbar->toolbar_handle, toolbar->icon_width, 0, width, toolbar->height);
+ }
+
+ /* Move the status resize icon
+ */
+ if (toolbar->status_window) {
+ status_width = toolbar->width - toolbar->status_width;
+ if (status_width < 12) status_width = 12;
+ old_width = toolbar->status_old_width;
+ toolbar->status_old_width = status_width;
+ if (old_width != status_width) {
+ xwimp_resize_icon(toolbar->status_handle, ICON_STATUS_RESIZE,
+ status_width - 12,
+ 0,
+ status_width,
+ toolbar->status_height - 2);
+ xwimp_force_redraw(toolbar->status_handle,
+ status_width - 12, 0, status_width, toolbar->status_height - 2);
+ xwimp_force_redraw(toolbar->status_handle,
+ old_width - 12, 0, old_width, toolbar->status_height - 2);
+ }
+ }
+
+ /* No change in height
+ */
+ return 0;
+}
+
+
+/**
+ * Updates the icon states and positions.
+ *
+ * Any necessary redrawing is performed for the client.
+ * The client is responsible for resizing/opening/closing the window when necessary.
+ *
+ * \param toolbar the toolbar to update
+ * \return non-zero if the toolbar height has changed
+ */
+int ro_toolbar_update(struct toolbar *toolbar) {
+ wimp_caret caret;
+ struct toolbar_icon *cur_icon;
+ unsigned int toolbar_height = 0;
+ unsigned int icon_left = 4;
+ int return_status;
+
+ /* Paranoia
+ */
+ if (toolbar == NULL) return 0;
+
+ /* Calculate the toolbar height (4 os unit border)
+ */
+ if (toolbar->url_bar) toolbar_height = 52;
+ if ((toolbar->throbber) && (toolbar_height < (toolbar->throbber_height + 4))) {
+ toolbar_height = toolbar->throbber_height + 4;
+ }
+
+ /* Calculate the maximum height of the icons
+ */
+ if (toolbar->standard_buttons) {
+ cur_icon = toolbar->icon;
+ while (cur_icon) {
+ if ((cur_icon->available) && (toolbar_height < (cur_icon->height + 4))) {
+ toolbar_height = cur_icon->height + 4;
+ }
+ cur_icon = cur_icon->next_icon;
+ }
+ }
+
+ /* Set our return status
+ */
+ if (toolbar_height != 0) toolbar_height += 8;
+ return_status = (toolbar_height == toolbar->height);
+ toolbar->height = toolbar_height;
+
+ /* Move our icons. Icons that are not avaiable are moved off the visible area.
+ */
+ cur_icon = toolbar->icon;
+ while (cur_icon) {
+ if ((cur_icon->available) && (toolbar->standard_buttons)) {
+ if (cur_icon->icon_number >= 0) {
+ xwimp_resize_icon(toolbar->toolbar_handle, cur_icon->icon_number,
+ icon_left,
+ (toolbar_height - cur_icon->height) / 2,
+ icon_left + cur_icon->width,
+ (toolbar_height + cur_icon->height) / 2);
+ }
+ icon_left += cur_icon->width;
+
+ } else {
+ if (cur_icon->icon_number >= 0) {
+ xwimp_resize_icon(toolbar->toolbar_handle, cur_icon->icon_number,
+ 0,
+ 1024 + toolbar_height,
+ cur_icon->width,
+ 1024 + toolbar_height + cur_icon->height);
+ }
+ }
+ cur_icon = cur_icon->next_icon;
+ }
+
+ /* Make a 8 OS unit spacer between icons and URL bar
+ */
+ if (icon_left != 4) icon_left += 8;
+ toolbar->icon_width = icon_left;
+
+ /* Hide the URL bar if we should (and shade it to stop caret issues)
+ */
+ if (!toolbar->url_bar) {
+ /* Handle losing the caret
+ */
+ if (!xwimp_get_caret_position(&caret)) {
+ if ((caret.w == toolbar->toolbar_handle) && (caret.i == ICON_TOOLBAR_URL)) {
+ xwimp_set_caret_position(-1, 0, 0, 0, 0, 0);
+ }
+ }
+ xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_URL,
+ 0,
+ 1024 + toolbar_height,
+ 64,
+ 1024 + toolbar_height + 52);
+ ro_gui_set_icon_shaded_state(toolbar->toolbar_handle, ICON_TOOLBAR_URL, true);
+ } else {
+ ro_gui_set_icon_shaded_state(toolbar->toolbar_handle, ICON_TOOLBAR_URL, false);
+ }
+
+ /* Hide the throbber if we should
+ */
+ if (!toolbar->throbber) {
+ xwimp_resize_icon(toolbar->toolbar_handle, ICON_TOOLBAR_THROBBER,
+ 0,
+ 1024 + toolbar_height,
+ toolbar->throbber_width,
+ 1024 + toolbar_height + toolbar->throbber_height);
+ }
+
+ /* Redraw the entire window
+ */
+ ro_toolbar_reformat(toolbar, toolbar->width);
+ xwimp_force_redraw(toolbar->toolbar_handle, 0, 0, toolbar->width, toolbar_height);
+
+ /* Update the toolbar height
+ */
+ return return_status;
+}
diff --git a/riscos/toolbar.h b/riscos/toolbar.h
new file mode 100644
index 000000000..f54bde320
--- /dev/null
+++ b/riscos/toolbar.h
@@ -0,0 +1,84 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ */
+
+/** \file
+ * Toolbar creation (interface).
+ */
+
+#ifndef _NETSURF_RISCOS_TOOLBAR_H_
+#define _NETSURF_RISCOS_TOOLBAR_H_
+
+#include "oslib/wimp.h"
+
+
+struct toolbar_icon {
+ /* The desired WIMP icon number (-1 for separator)
+ */
+ int icon_number;
+
+ /* Set to non-zero to display the icon
+ */
+ unsigned int available;
+
+ /* Icon dimensions (OS units)
+ */
+ unsigned int width;
+ unsigned int height;
+
+ /* Icon validation, or NULL if this icon is unavailable
+ */
+ unsigned char* validation;
+
+ /* The next icon (linked list)
+ */
+ struct toolbar_icon *next_icon; // Next toolbar icon
+};
+
+
+struct toolbar {
+
+ /* Internal variables
+ */
+ unsigned int resize_status; // Update status width on next reformat?
+ unsigned int update_pending; // Update icons on next reformat?
+ unsigned int icon_width; // Current width of icons
+ int width_internal; // Width actually used on last reformat
+ int status_height; // Status bar height
+ int status_old_width; // Old status width
+ int width; // Toolbar width on last reformat
+ unsigned int height; // Toolbar height on last reformat
+
+ /* General options
+ */
+ unsigned int throbber_width; // Throbber width (0 = unavaiable)
+ unsigned int throbber_height; // Throbber height (0 = unavaiable)
+ unsigned int status_window; // Show status window?
+ unsigned int standard_buttons; // Show standard buttons?
+ unsigned int url_bar; // Show URL bar?
+ unsigned int throbber; // Show Throbber?
+ unsigned int status_width; // Width of status window
+
+ /* The first toolbar icon
+ */
+ struct toolbar_icon *icon;
+
+ /* Window handles
+ */
+ wimp_w toolbar_handle;
+ wimp_w status_handle;
+};
+
+
+struct toolbar *ro_toolbar_create(osspriteop_area *sprite_area, char *url_buffer,
+ char *status_buffer, char *throbber_buffer);
+void ro_toolbar_destroy(struct toolbar *toolbar);
+void ro_toolbar_resize_status(struct toolbar *toolbar, int height);
+int ro_toolbar_reformat(struct toolbar *toolbar, int width);
+void ro_toolbar_status_reformat(struct toolbar *toolbar, int width);
+int ro_toolbar_update(struct toolbar *toolbar);
+
+#endif
diff --git a/riscos/uri.c b/riscos/uri.c
index a03e40a64..bae0e0ccc 100644
--- a/riscos/uri.c
+++ b/riscos/uri.c
@@ -54,7 +54,7 @@ void ro_uri_message_received(uri_full_message_process* uri_message)
xuri_request_uri(0, uri_requested, uri_length, uri_handle, NULL);
- browser_window_create(uri_requested);
+ browser_window_create(uri_requested, NULL);
xfree(uri_requested);
}
diff --git a/riscos/url_protocol.c b/riscos/url_protocol.c
index 90cd6877a..94ea10648 100644
--- a/riscos/url_protocol.c
+++ b/riscos/url_protocol.c
@@ -99,7 +99,7 @@ void ro_url_message_received(wimp_message* message)
message->sender);
/* create new browser window */
- browser_window_create(uri_requested);
+ browser_window_create(uri_requested, NULL);
#if 0
if (post) {
diff --git a/riscos/wimp.c b/riscos/wimp.c
new file mode 100644
index 000000000..da87cbd8a
--- /dev/null
+++ b/riscos/wimp.c
@@ -0,0 +1,193 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ */
+
+/** \file
+ * General RISC OS WIMP/OS library functions (implementation).
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "oslib/os.h"
+#include "oslib/wimp.h"
+#include "oslib/wimpextend.h"
+#include "netsurf/riscos/wimp.h"
+
+
+/* Wimp_Extend,11 block
+*/
+static wimpextend_furniture_sizes furniture_sizes;
+
+/**
+ * Gets the default horzontal scrollbar height
+ */
+int ro_get_hscroll_height(wimp_w w) {
+ furniture_sizes.w = w;
+ furniture_sizes.border_widths.y0 = 38;
+ xwimpextend_get_furniture_sizes(&furniture_sizes);
+ return furniture_sizes.border_widths.y0;
+}
+
+/**
+ * Reads a modes EIG factors.
+ *
+ * \param mode mode to read EIG factors for, or -1 for current
+ */
+struct eig_factors ro_read_eig_factors(os_mode mode) {
+ bits psr;
+ struct eig_factors factors;
+ xos_read_mode_variable(mode, os_MODEVAR_XEIG_FACTOR, &factors.xeig, &psr);
+ xos_read_mode_variable(mode, os_MODEVAR_YEIG_FACTOR, &factors.yeig, &psr);
+ return factors;
+}
+
+
+/**
+ * Converts the supplied os_coord from OS units to pixels.
+ *
+ * \param os_units values to convert
+ * \param mode mode to use EIG factors for, or -1 for current
+ */
+void ro_convert_os_units_to_pixels(os_coord *os_units, os_mode mode) {
+ struct eig_factors factors = ro_read_eig_factors(mode);
+ os_units->x = (os_units->x >> factors.xeig);
+ os_units->y = (os_units->y >> factors.yeig);
+}
+
+
+/**
+ * Converts the supplied os_coord from pixels to OS units.
+ *
+ * \param pixels values to convert
+ * \param mode mode to use EIG factors for, or -1 for current
+ */
+void ro_convert_pixels_to_os_units(os_coord *pixels, os_mode mode) {
+ struct eig_factors factors = ro_read_eig_factors(mode);
+ pixels->x = (pixels->x << factors.xeig);
+ pixels->y = (pixels->y << factors.yeig);
+}
+
+
+/**
+ * Redraws an icon
+ *
+ * \param w window handle
+ * \param i icon handle
+ */
+#define ro_gui_redraw_icon(w, i) xwimp_set_icon_state(w, i, 0, 0)
+
+
+/**
+ * Read the contents of an icon.
+ *
+ * \param w window handle
+ * \param i icon handle
+ * \return string in icon
+ */
+char *ro_gui_get_icon_string(wimp_w w, wimp_i i) {
+ wimp_icon_state ic;
+ ic.w = w;
+ ic.i = i;
+ if (xwimp_get_icon_state(&ic)) return NULL;
+ return ic.icon.data.indirected_text.text;
+}
+
+
+/**
+ * Set the contents of an icon to a string.
+ *
+ * \param w window handle
+ * \param i icon handle
+ * \param text string (copied)
+ */
+void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text) {
+ wimp_caret caret;
+ wimp_icon_state ic;
+ int old_len, len;
+
+ /* Get the icon data
+ */
+ ic.w = w;
+ ic.i = i;
+ if (xwimp_get_icon_state(&ic)) return;
+
+ /* Check that the existing text is not the same as the updated text
+ to stop flicker
+ */
+ if (!strncmp(ic.icon.data.indirected_text.text, text,
+ (unsigned int)ic.icon.data.indirected_text.size)) return;
+
+ /* Copy the text across
+ */
+ old_len = strlen(ic.icon.data.indirected_text.text);
+ strncpy(ic.icon.data.indirected_text.text, text,
+ (unsigned int)ic.icon.data.indirected_text.size);
+
+ /* Handle the caret being in the icon
+ */
+ if (!xwimp_get_caret_position(&caret)) {
+ if ((caret.w == w) && (caret.i == i)) {
+ len = strlen(text);
+ if ((caret.index > len) || (caret.index == old_len)) caret.index = len;
+ xwimp_set_caret_position(w, i, caret.pos.x, caret.pos.y, -1, caret.index);
+ }
+ }
+
+ /* Redraw the icon
+ */
+ ro_gui_redraw_icon(w, i);
+}
+
+
+/**
+ * Set the contents of an icon to a number.
+ *
+ * \param w window handle
+ * \param i icon handle
+ * \param value value
+ */
+void ro_gui_set_icon_integer(wimp_w w, wimp_i i, int value) {
+ char buffer[20]; // Big enough for 64-bit int
+ sprintf(buffer, "%d", value);
+ ro_gui_set_icon_string(w, i, buffer);
+}
+
+
+/**
+ * Set the selected state of an icon.
+ *
+ * \param w window handle
+ * \param i icon handle
+ * \param state selected state
+ */
+#define ro_gui_set_icon_selected_state(w, i, state) xwimp_set_icon_state(w, i, (state ? wimp_ICON_SELECTED : 0), wimp_ICON_SELECTED)
+
+
+/**
+ * Gets the selected state of an icon.
+ *
+ * \param w window handle
+ * \param i icon handle
+ */
+int ro_gui_get_icon_selected_state(wimp_w w, wimp_i i) {
+ wimp_icon_state ic;
+ ic.w = w;
+ ic.i = i;
+ xwimp_get_icon_state(&ic);
+ return (ic.icon.flags & wimp_ICON_SELECTED) != 0;
+}
+
+
+/**
+ * Set the selected state of an icon.
+ *
+ * \param w window handle
+ * \param i icon handle
+ * \param state selected state
+ */
+#define ro_gui_set_icon_shaded_state(w, i, state) xwimp_set_icon_state(w, i, (state ? wimp_ICON_SHADED : 0), wimp_ICON_SHADED)
diff --git a/riscos/wimp.h b/riscos/wimp.h
new file mode 100644
index 000000000..e80a4f7d1
--- /dev/null
+++ b/riscos/wimp.h
@@ -0,0 +1,42 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2004 Richard Wilson <not_ginger_matt@users.sourceforge.net>
+ */
+
+/** \file
+ * General RISC OS WIMP/OS library functions (interface).
+ */
+
+
+#ifndef _NETSURF_RISCOS_WIMP_H_
+#define _NETSURF_RISCOS_WIMP_H_
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "oslib/os.h"
+#include "oslib/wimp.h"
+
+struct eig_factors {
+ int xeig;
+ int yeig;
+};
+
+
+int ro_get_hscroll_height(wimp_w w);
+struct eig_factors ro_read_eig_factors(os_mode mode);
+void ro_convert_os_units_to_pixels(os_coord *os_units, os_mode mode);
+void ro_convert_pixels_to_os_units(os_coord *pixels, os_mode mode);
+
+#define ro_gui_redraw_icon(w, i) xwimp_set_icon_state(w, i, 0, 0)
+char *ro_gui_get_icon_string(wimp_w w, wimp_i i);
+void ro_gui_set_icon_string(wimp_w w, wimp_i i, const char *text);
+void ro_gui_set_icon_integer(wimp_w w, wimp_i i, int value);
+#define ro_gui_set_icon_selected_state(w, i, state) xwimp_set_icon_state(w, i, (state ? wimp_ICON_SELECTED : 0), wimp_ICON_SELECTED)
+int ro_gui_get_icon_selected_state(wimp_w w, wimp_i i);
+#define ro_gui_set_icon_shaded_state(w, i, state) xwimp_set_icon_state(w, i, (state ? wimp_ICON_SHADED : 0), wimp_ICON_SHADED)
+
+#endif
diff --git a/riscos/window.c b/riscos/window.c
index cbe37e166..30deef0dd 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -1,7 +1,7 @@
/*
* This file is part of NetSurf, http://netsurf.sourceforge.net/
* Licensed under the GNU General Public License,
- * http://www.opensource.org/licenses/gpl-license
+ * http://www.opensource.org/licenses/gpl-license
* 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>
@@ -27,6 +27,7 @@
#include "netsurf/riscos/save_draw.h"
#include "netsurf/riscos/theme.h"
#include "netsurf/riscos/thumbnail.h"
+#include "netsurf/riscos/wimp.h"
#include "netsurf/render/form.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/url.h"
@@ -53,16 +54,15 @@ bool gui_window_in_list(gui_window *g) {
/**
* Create and open a new browser window.
+ *
+ * \param clone the browser window to clone options from, or NULL for default
*/
-gui_window *gui_create_browser_window(struct browser_window *bw)
+gui_window *gui_create_browser_window(struct browser_window *bw, struct browser_window *clone)
{
int screen_width, screen_height, win_width, win_height;
- int toolbar_height = 0;
wimp_window window;
wimp_window_state state;
- wimp_outline outline;
- os_error *error;
gui_window* g = (gui_window*) xcalloc(1, sizeof(gui_window));
g->type = GUI_BROWSER_WINDOW;
@@ -70,9 +70,6 @@ gui_window *gui_create_browser_window(struct browser_window *bw)
ro_gui_screen_size(&screen_width, &screen_height);
- if (option_show_toolbar)
- toolbar_height = ro_theme_toolbar_height();
-
win_width = screen_width * 3 / 4;
if (1600 < win_width)
win_width = 1600;
@@ -102,7 +99,7 @@ gui_window *gui_create_browser_window(struct browser_window *bw)
window.extent.x0 = 0;
window.extent.y0 = win_height;
window.extent.x1 = win_width;
- window.extent.y1 = toolbar_height;
+ window.extent.y1 = 0;
window.title_flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED;
window.work_flags = wimp_BUTTON_CLICK_DRAG << wimp_ICON_BUTTON_TYPE_SHIFT;
window.sprite_area = wimpspriteop_AREA;
@@ -115,66 +112,36 @@ gui_window *gui_create_browser_window(struct browser_window *bw)
g->window = wimp_create_window(&window);
strcpy(g->title, "NetSurf");
+ strcpy(g->throb_buf, "throbber0");
- g->data.browser.toolbar = 0;
- if (option_show_toolbar)
- {
- g->data.browser.toolbar = ro_theme_create_toolbar(g->url, g->status,
- g->throb_buf);
- g->data.browser.toolbar_width = -1;
- sprintf(g->throb_buf, "throbber0");
- }
+ ro_theme_create_toolbar(g);
- g->data.browser.reformat_pending = false;
- g->data.browser.old_width = 0;
- g->scale = 1;
+ g->data.browser.reformat_pending = false;
+ g->data.browser.old_width = 0;
- g->next = window_list;
- window_list = g;
- window_count++;
+ g->next = window_list;
+ window_list = g;
+ window_count++;
+
+ /* Set the window options
+ */
+ bw->window = g;
+ gui_window_clone_options(bw, clone);
state.w = g->window;
wimp_get_window_state(&state);
state.next = wimp_TOP;
ro_gui_window_open(g, (wimp_open*)&state);
- outline.w = g->window;
- wimp_get_window_outline(&outline);
-
- state.w = g->data.browser.toolbar;
- state.visible.x1 = outline.outline.x1 - 2;
- state.visible.y0 = state.visible.y1 - toolbar_height;
- state.xscroll = 0;
- state.yscroll = 0;
- state.next = wimp_TOP;
-
- g->data.browser.toolbar_width = state.visible.x1 - state.visible.x0;
- ro_theme_resize_toolbar(g->data.browser.toolbar,
- g->data.browser.toolbar_width,
- state.visible.y1 - state.visible.y0);
-
- wimp_open_window_nested((wimp_open *) &state, g->window,
- wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
- << wimp_CHILD_LS_EDGE_SHIFT |
- wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
- << 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);
-
- error = xwimp_set_caret_position(g->data.browser.toolbar,
- ICON_TOOLBAR_URL, -1, -1, -1, 0);
- if (error)
- LOG(("xwimp_set_caret_position: 0x%x: %s",
- error->errnum, error->errmess));
-
+ /* Set the caret position to the URL bar
+ */
+ xwimp_set_caret_position(g->data.browser.toolbar->toolbar_handle,
+ ICON_TOOLBAR_URL, -1, -1, -1, 0);
return g;
}
-void gui_window_set_title(gui_window* g, char* title)
-{
+void gui_window_set_title(gui_window* g, char* title) {
strncpy(g->title, title, 255);
wimp_force_redraw_title(g->window);
}
@@ -199,9 +166,8 @@ void gui_window_destroy(gui_window* g)
window_count--;
+ ro_toolbar_destroy(g->data.browser.toolbar);
xwimp_delete_window(g->window);
- if (g->data.browser.toolbar)
- xwimp_delete_window(g->data.browser.toolbar);
xfree(g);
}
@@ -243,9 +209,9 @@ void ro_gui_window_redraw(gui_window* g, wimp_draw* redraw)
while (more)
{
content_redraw(c,
- (int) redraw->box.x0 - (int) redraw->xscroll,
- (int) redraw->box.y1 - (int) redraw->yscroll,
- c->width * 2, c->height * 2,
+ (int) redraw->box.x0 - (int) redraw->xscroll,
+ (int) redraw->box.y1 - (int) redraw->yscroll,
+ c->width * 2, c->height * 2,
redraw->clip.x0, redraw->clip.y0,
redraw->clip.x1 - 1, redraw->clip.y1 - 1,
g->scale);
@@ -319,7 +285,6 @@ void gui_window_update_box(gui_window *g, const union content_msg_data *data)
}
}
-
void gui_window_set_scroll(gui_window* g, unsigned long sx, unsigned long sy)
{
wimp_window_state state;
@@ -329,13 +294,11 @@ void gui_window_set_scroll(gui_window* g, unsigned long sx, unsigned long sy)
wimp_get_window_state(&state);
state.xscroll = sx * 2;
state.yscroll = -sy * 2;
- if (option_show_toolbar)
- state.yscroll += ro_theme_toolbar_height();
+ state.yscroll += g->data.browser.toolbar->height;
ro_gui_window_open(g, (wimp_open*)&state);
}
-unsigned long gui_window_get_width(gui_window* g)
-{
+unsigned long gui_window_get_width(gui_window* g) {
wimp_window_state state;
state.w = g->window;
wimp_get_window_state(&state);
@@ -343,9 +306,7 @@ unsigned long gui_window_get_width(gui_window* g)
}
-void gui_window_set_extent(gui_window *g, unsigned long width,
- unsigned long height)
-{
+void gui_window_set_extent(gui_window *g, unsigned long width, unsigned long height) {
os_box extent = { 0, 0, 0, 0 };
wimp_window_state state;
int toolbar_height = 0;
@@ -357,8 +318,7 @@ void gui_window_set_extent(gui_window *g, unsigned long width,
wimp_get_window_state(&state);
/* account for toolbar height, if present */
- if (option_show_toolbar)
- toolbar_height = ro_theme_toolbar_height();
+ if (g->data.browser.toolbar) toolbar_height = g->data.browser.toolbar->height;
if (width < (unsigned int)(state.visible.x1 - state.visible.x0))
width = state.visible.x1 - state.visible.x0;
@@ -373,35 +333,30 @@ void gui_window_set_extent(gui_window *g, unsigned long width,
}
-void gui_window_set_status(gui_window* g, const char* text)
-{
- if (strcmp(g->status, text) != 0)
- {
- strncpy(g->status, text, 255);
- wimp_set_icon_state(g->data.browser.toolbar, ICON_TOOLBAR_STATUS, 0, 0);
- }
+void gui_window_set_status(gui_window* g, const char* text) {
+ if (g->data.browser.toolbar) {
+ ro_gui_set_icon_string(g->data.browser.toolbar->status_handle, ICON_STATUS_TEXT, text);
+ }
}
-
/**
* Set the contents of a window's address bar.
*/
-void gui_window_set_url(gui_window *g, char *url)
-{
- wimp_caret c;
- strncpy(g->url, url, 255);
- wimp_set_icon_state(g->data.browser.toolbar, ICON_TOOLBAR_URL, 0, 0);
- /* Move the caret to the url bar.
- * It's ok to do this as this only gets
- * called when fetching a new page .
- */
- wimp_get_caret_position(&c);
- if (c.w == g->window || c.w == g->data.browser.toolbar) {
- wimp_set_caret_position(g->data.browser.toolbar,
- ICON_TOOLBAR_URL,
- 0,0,-1, (int) strlen(g->url));
- }
+void gui_window_set_url(gui_window *g, char *url) {
+ wimp_caret c;
+ if (g->data.browser.toolbar) {
+ ro_gui_set_icon_string(g->data.browser.toolbar->toolbar_handle, ICON_TOOLBAR_URL, url);
+
+ /* Move the caret to the URL bar
+ */
+ if (!xwimp_get_caret_position(&c)) {
+ if (c.w == g->window || c.w == g->data.browser.toolbar->toolbar_handle) {
+ xwimp_set_caret_position(g->data.browser.toolbar->toolbar_handle,
+ ICON_TOOLBAR_URL, 0, 0, -1, (int)strlen(g->url));
+ }
+ }
+ }
}
@@ -409,8 +364,7 @@ void gui_window_set_url(gui_window *g, char *url)
* Open a window using the given wimp_open, handling toolbars and resizing.
*/
-void ro_gui_window_open(gui_window *g, wimp_open *open)
-{
+void ro_gui_window_open(gui_window *g, wimp_open *open) {
int width = open->visible.x1 - open->visible.x0;
int height = open->visible.y1 - open->visible.y0;
int toolbar_height = 0;
@@ -436,14 +390,14 @@ void ro_gui_window_open(gui_window *g, wimp_open *open)
}
/* account for toolbar height, if present */
- if (option_show_toolbar) {
- toolbar_height = ro_theme_toolbar_height();
- height -= toolbar_height;
- }
+ if (g->data.browser.toolbar) toolbar_height = g->data.browser.toolbar->height;
+ height -= toolbar_height;
- /* the height should be no less than the content height */
- if (content && (unsigned int)height < content->height * 2 * g->scale)
+ /* The height should be no less than the content height
+ */
+ if (content && (unsigned int)height < content->height * 2 * g->scale) {
height = content->height * 2 * g->scale;
+ }
/* change extent if necessary */
if (g->data.browser.old_width != width ||
@@ -483,101 +437,75 @@ void ro_gui_window_open(gui_window *g, wimp_open *open)
g->data.browser.old_height = height;
}
- /* open toolbar, if present */
- if (!toolbar_height)
- return;
-
- state.w = g->data.browser.toolbar;
- wimp_get_window_state(&state);
- if (state.visible.x1 - state.visible.x0 !=
- g->data.browser.toolbar_width) {
- g->data.browser.toolbar_width = state.visible.x1 -
- state.visible.x0;
- ro_theme_resize_toolbar(g->data.browser.toolbar,
- g->data.browser.toolbar_width,
- state.visible.y1 - state.visible.y0);
- }
+ ro_theme_resize_toolbar(g);
}
-void ro_gui_throb(void)
-{
- gui_window* g;
- float nowtime = (float) (clock() / (CLOCKS_PER_SEC/(15*23/theme_throbs)));
-
- for (g = window_list; g != NULL; g = g->next)
- {
- if (g->type == GUI_BROWSER_WINDOW)
- {
- if (option_show_toolbar)
- {
- if (g->data.browser.bw->throbbing != 0)
- {
- if (nowtime > g->throbtime + 0.2)
- {
- g->throbtime = nowtime;
- g->throbber++;
- if ((unsigned int)g->throbber > theme_throbs)
- g->throbber = 0;
- sprintf(g->throb_buf, "throbber%u", g->throbber);
- wimp_set_icon_state(g->data.browser.toolbar,
- ICON_TOOLBAR_THROBBER, 0, 0);
- }
- }
- }
- }
- }
+void ro_gui_throb(void) {
+ gui_window* g;
+
+ /* Abort on no throbs
+ */
+ if (theme_throbs == 0) return;
+
+ /* Animate
+ */
+ float nowtime = (float) (clock() / (CLOCKS_PER_SEC/(15*23/theme_throbs)));
+ for (g = window_list; g != NULL; g = g->next) {
+ if ((g->type == GUI_BROWSER_WINDOW) && (g->data.browser.bw->throbbing)) {
+ if (nowtime > g->throbtime + 0.2) {
+ g->throbtime = nowtime;
+ g->throbber++;
+ if (g->throbber > theme_throbs) g->throbber = 0;
+ sprintf(g->throb_buf, "throbber%i", g->throbber);
+ ro_gui_redraw_icon(g->data.browser.toolbar->toolbar_handle, ICON_TOOLBAR_THROBBER);
+ }
+ }
+ }
}
-gui_window* ro_lookup_gui_from_w(wimp_w window)
-{
- gui_window* g;
- for (g = window_list; g != NULL; g = g->next)
- {
- if (g->type == GUI_BROWSER_WINDOW)
- {
- if (g->window == window)
- {
- return g;
- }
- }
- }
- return NULL;
+gui_window *ro_lookup_gui_from_w(wimp_w window) {
+ gui_window* g;
+ for (g = window_list; g != NULL; g = g->next) {
+ if ((g->type == GUI_BROWSER_WINDOW) && (g->window == window)) return g;
+ }
+ return NULL;
}
-gui_window* ro_lookup_gui_toolbar_from_w(wimp_w window)
-{
- gui_window* g;
+gui_window *ro_lookup_gui_toolbar_from_w(wimp_w window) {
+ gui_window* g;
+ for (g = window_list; g != NULL; g = g->next) {
+ if ((g->type == GUI_BROWSER_WINDOW) && (g->data.browser.toolbar) &&
+ (g->data.browser.toolbar->toolbar_handle == window)) return g;
+ }
+ return NULL;
+}
- for (g = window_list; g != NULL; g = g->next)
- {
- if (g->type == GUI_BROWSER_WINDOW)
- {
- if (g->data.browser.toolbar == window)
- {
- return g;
- }
- }
- }
- return NULL;
+gui_window *ro_lookup_gui_status_from_w(wimp_w window) {
+ gui_window* g;
+ for (g = window_list; g != NULL; g = g->next) {
+ if ((g->type == GUI_BROWSER_WINDOW) && (g->data.browser.toolbar) &&
+ (g->data.browser.toolbar->status_handle == window)) return g;
+ }
+ return NULL;
}
/**
* Convert a wimp window handle to the owning gui_window structure.
*/
-gui_window *ro_gui_window_lookup(wimp_w w)
-{
+gui_window *ro_gui_window_lookup(wimp_w w) {
gui_window *g;
-
for (g = window_list; g; g = g->next) {
- if (g->window == w)
- return g;
- else if (g->type == GUI_BROWSER_WINDOW &&
- g->data.browser.toolbar == w)
+ if (g->window == w) {
return g;
+ } else if (g->type == GUI_BROWSER_WINDOW) {
+ if ((g->data.browser.toolbar) &&
+ ((g->data.browser.toolbar->toolbar_handle == w) ||
+ (g->data.browser.toolbar->status_handle == w))) return g;
+ }
}
- return 0;
+ return NULL;
}
@@ -588,8 +516,8 @@ void ro_gui_window_mouse_at(wimp_pointer* pointer)
gui_window* g;
if (pointer->w == history_window) {
- ro_gui_history_mouse_at(pointer);
- return;
+ ro_gui_history_mouse_at(pointer);
+ return;
}
g = ro_lookup_gui_from_w(pointer->w);
@@ -625,17 +553,18 @@ void ro_gui_window_mouse_at(wimp_pointer* pointer)
}
}
-void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer)
-{
+void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer) {
+ unsigned int history_move_back;
switch (pointer->i) {
case ICON_TOOLBAR_BACK:
- history_back(g->data.browser.bw,
- g->data.browser.bw->history);
- break;
-
case ICON_TOOLBAR_FORWARD:
- history_forward(g->data.browser.bw,
- g->data.browser.bw->history);
+ history_move_back = (pointer->i == ICON_TOOLBAR_BACK);
+ if (pointer->buttons == wimp_CLICK_ADJUST) history_move_back = !history_move_back;
+ if (history_move_back) {
+ history_back(g->data.browser.bw, g->data.browser.bw->history);
+ } else {
+ history_forward(g->data.browser.bw, g->data.browser.bw->history);
+ }
break;
case ICON_TOOLBAR_HISTORY:
@@ -653,105 +582,123 @@ void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer)
);*/
break;
+ case ICON_TOOLBAR_SCALE:
+ current_gui = g;
+ ro_gui_menu_prepare_scale();
+ /** \todo make scale window persistent */
+ xwimp_create_menu((wimp_menu *) dialog_zoom,
+ pointer->pos.x, pointer->pos.y);
+ break;
+
case ICON_TOOLBAR_SAVE:
- current_gui = g;
+ current_gui = g;
gui_current_save_type = GUI_SAVE_SOURCE;
ro_gui_menu_prepare_save(g->data.browser.bw->current_content);
/** \todo make save window persistent */
xwimp_create_menu((wimp_menu *) dialog_saveas,
pointer->pos.x, pointer->pos.y);
- break;
+ break;
}
}
+void ro_gui_status_click(gui_window* g, wimp_pointer* pointer) {
+ wimp_drag drag;
+ os_error *error;
+ switch (pointer->i) {
+ case ICON_STATUS_RESIZE:
+ gui_current_drag_type = GUI_DRAG_STATUS_RESIZE;
+ drag.w = g->data.browser.toolbar->status_handle;
+ drag.type = wimp_DRAG_SYSTEM_SIZE;
+ drag.initial.x0 = pointer->pos.x;
+ drag.initial.x1 = pointer->pos.x;
+ drag.initial.y0 = pointer->pos.y;
+ drag.initial.y1 = pointer->pos.y;
+ error = xwimp_drag_box(&drag);
+ break;
+ }
+}
-void ro_gui_window_click(gui_window* g, wimp_pointer* pointer)
-{
- struct browser_action msg;
- int x,y;
- wimp_window_state state;
- state.w = pointer->w;
- wimp_get_window_state(&state);
+void ro_gui_window_click(gui_window* g, wimp_pointer* pointer) {
+ struct browser_action msg;
+ int x,y;
+ wimp_window_state state;
- if (g->type == GUI_BROWSER_WINDOW)
- {
- x = window_x_units(pointer->pos.x, &state) / 2 / g->scale;
- y = -window_y_units(pointer->pos.y, &state) / 2 / g->scale;
+ if (g->type != GUI_BROWSER_WINDOW) return;
- if (pointer->buttons == wimp_CLICK_MENU)
- {
+ state.w = pointer->w;
+ wimp_get_window_state(&state);
+
+ x = window_x_units(pointer->pos.x, &state) / 2 / g->scale;
+ y = -window_y_units(pointer->pos.y, &state) / 2 / g->scale;
+
+ if (pointer->buttons == wimp_CLICK_MENU) {
ro_gui_create_menu(browser_menu, pointer->pos.x - 64, pointer->pos.y, g);
- }
- else if (g->data.browser.bw->current_content != NULL)
- {
+ } else if (g->data.browser.bw->current_content != NULL) {
if (g->data.browser.bw->current_content->type == CONTENT_HTML)
{
- if (pointer->buttons == wimp_CLICK_SELECT)
+ if (pointer->buttons == wimp_CLICK_SELECT)
{
msg.type = act_MOUSE_CLICK;
- msg.data.mouse.x = x;
+ msg.data.mouse.x = x;
msg.data.mouse.y = y;
if (browser_window_action(g->data.browser.bw, &msg) == 1)
return;
msg.type = act_UNKNOWN;
}
- if (pointer->buttons == wimp_CLICK_SELECT && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
- msg.type = act_CLEAR_SELECTION;
- else if (pointer->buttons == wimp_CLICK_ADJUST && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
- msg.type = act_ALTER_SELECTION;
- else if (pointer->buttons == wimp_DRAG_SELECT ||
- pointer->buttons == wimp_DRAG_ADJUST)
- {
- msg.type = act_START_NEW_SELECTION;
- if (pointer->buttons == wimp_DRAG_ADJUST && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
- msg.type = act_ALTER_SELECTION;
-
- ro_gui_start_selection(pointer, &state, g);
- g->drag_status = drag_BROWSER_TEXT_SELECTION;
- }
- msg.data.mouse.x = x;
- msg.data.mouse.y = y;
- if (msg.type != act_UNKNOWN)
- browser_window_action(g->data.browser.bw, &msg);
-
- if (pointer->buttons == wimp_CLICK_ADJUST && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
- {
- current_gui->data.browser.bw->current_content->data.html.text_selection.altering = alter_UNKNOWN;
- }
-
- if (pointer->buttons == wimp_CLICK_SELECT
- || pointer->buttons == wimp_CLICK_ADJUST)
- {
- if (pointer->buttons == wimp_CLICK_SELECT)
- msg.type = act_FOLLOW_LINK;
- else
- msg.type = act_FOLLOW_LINK_NEW_WINDOW;
- msg.data.mouse.x = x;
- msg.data.mouse.y = y;
- browser_window_action(g->data.browser.bw, &msg);
- }
+ if (pointer->buttons == wimp_CLICK_SELECT && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
+ msg.type = act_CLEAR_SELECTION;
+ else if (pointer->buttons == wimp_CLICK_ADJUST && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
+ msg.type = act_ALTER_SELECTION;
+ else if (pointer->buttons == wimp_DRAG_SELECT ||
+ pointer->buttons == wimp_DRAG_ADJUST)
+ {
+ msg.type = act_START_NEW_SELECTION;
+ if (pointer->buttons == wimp_DRAG_ADJUST && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
+ msg.type = act_ALTER_SELECTION;
+
+ ro_gui_start_selection(pointer, &state, g);
+ g->drag_status = drag_BROWSER_TEXT_SELECTION;
+ }
+ msg.data.mouse.x = x;
+ msg.data.mouse.y = y;
+ if (msg.type != act_UNKNOWN)
+ browser_window_action(g->data.browser.bw, &msg);
+
+ if (pointer->buttons == wimp_CLICK_ADJUST && g->data.browser.bw->current_content->data.html.text_selection.selected == 1)
+ {
+ current_gui->data.browser.bw->current_content->data.html.text_selection.altering = alter_UNKNOWN;
+ }
+
+ if (pointer->buttons == wimp_CLICK_SELECT
+ || pointer->buttons == wimp_CLICK_ADJUST)
+ {
+ if (pointer->buttons == wimp_CLICK_SELECT)
+ msg.type = act_FOLLOW_LINK;
+ else
+ msg.type = act_FOLLOW_LINK_NEW_WINDOW;
+ msg.data.mouse.x = x;
+ msg.data.mouse.y = y;
+ browser_window_action(g->data.browser.bw, &msg);
+ }
}
}
- }
}
-void gui_window_start_throbber(struct gui_window* g)
-{
- g->throbtime = (float) (clock() + 0) / CLOCKS_PER_SEC; /* workaround compiler warning */
- g->throbber = 0;
+void gui_window_start_throbber(struct gui_window* g) {
+ if (theme_throbs == 0) return;
+ g->throbtime = (float) (clock() + 0) / CLOCKS_PER_SEC; /* workaround compiler warning */
+ g->throbber = 0;
}
-void gui_window_stop_throbber(gui_window* g)
-{
- g->throbber = 0;
- sprintf(g->throb_buf, "throbber%u", g->throbber);
- wimp_set_icon_state(g->data.browser.toolbar, ICON_TOOLBAR_THROBBER, 0, 0);
+void gui_window_stop_throbber(gui_window* g) {
+ g->throbber = 0;
+ sprintf(g->throb_buf, "throbber%u", g->throbber);
+ ro_gui_redraw_icon(g->data.browser.toolbar->toolbar_handle, ICON_TOOLBAR_THROBBER);
}
-void gui_window_place_caret(gui_window *g, int x, int y, int height)
-{
+void gui_window_place_caret(gui_window *g, int x, int y, int height) {
wimp_set_caret_position(g->window, -1,
x * 2, -(y + height) * 2, height * 2, -1);
}
@@ -787,7 +734,7 @@ bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar)
/* We can't map on to any of: 3,8,10,13,21,22 or 24
* That leaves 1,2,4-7,11,12,14-20,23,25-31 and 129-159
*/
- if (c == 394) c = 9; /* Tab */
+ if (c == 394) c = 9; /* Tab */
else if (c == 410) c = 11; /* Shift+Tab */
else if (c == 428) c = 26; /* Ctrl+Left */
else if (c == 429) c = 27; /* Ctrl+Right*/
@@ -895,8 +842,7 @@ bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar)
state.w = g->window;
wimp_get_window_state(&state);
y = state.visible.y1 - state.visible.y0 - 32;
- if (option_show_toolbar)
- y -= ro_theme_toolbar_height();
+ y -= g->data.browser.toolbar->height;
switch (key) {
case wimp_KEY_UP:
@@ -917,7 +863,7 @@ bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar)
case wimp_KEY_CONTROL | wimp_KEY_DOWN:
state.yscroll = -0x10000000;
break;
- }
+ }
wimp_open_window((wimp_open *) &state);
return true;
@@ -937,8 +883,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 (option_show_toolbar)
- y -= ro_theme_toolbar_height();
+ y -= g->data.browser.toolbar->height;
switch (scroll->xmin) {
case wimp_SCROLL_PAGE_LEFT:
@@ -981,13 +926,12 @@ void ro_gui_scroll_request(wimp_scroll *scroll)
/**
* Convert x from screen to window coordinates.
*
- * \param x x coordinate / os units
+ * \param x x coordinate / os units
* \param state window state
* \return x coordinate in window / os units
*/
-
-int window_x_units(int x, wimp_window_state *state)
-{
+//#define window_x_units(x, state) (x - (state->visible.x0 - state->xscroll))
+int window_x_units(int x, wimp_window_state *state) {
return x - (state->visible.x0 - state->xscroll);
}
@@ -995,13 +939,12 @@ int window_x_units(int x, wimp_window_state *state)
/**
* Convert y from screen to window coordinates.
*
- * \param y y coordinate / os units
+ * \param y y coordinate / os units
* \param state window state
* \return y coordinate in window / os units
*/
-
-int window_y_units(int y, wimp_window_state *state)
-{
+//#define window_y_units(y, state) (y - (state->visible.y1 - state->yscroll))
+int window_y_units(int y, wimp_window_state *state) {
return y - (state->visible.y1 - state->yscroll);
}