From b055948973d213cbc29bc71a9b90a92240056264 Mon Sep 17 00:00:00 2001 From: James Bursa Date: Fri, 7 Nov 2003 23:51:13 +0000 Subject: [project @ 2003-11-07 23:51:13 by bursa] Split out window.c, implement DataOpen and tidy up gui code. svn path=/import/netsurf/; revision=408 --- !NetSurf/!Boot,feb | 2 +- !NetSurf/!Run,feb | 6 +- desktop/gui.h | 1 + desktop/netsurf.c | 1 + makefile | 2 +- riscos/dialog.c | 12 +- riscos/download.c | 22 +- riscos/gui.c | 1562 +++++++++++++++--------------------------------- riscos/gui.h | 17 +- riscos/plugin.c | 4 +- riscos/textselection.c | 2 +- riscos/theme.c | 2 + riscos/theme.h | 2 + riscos/window.c | 612 +++++++++++++++++++ 14 files changed, 1147 insertions(+), 1100 deletions(-) create mode 100644 riscos/window.c diff --git a/!NetSurf/!Boot,feb b/!NetSurf/!Boot,feb index ae72986e2..d6dc32236 100644 --- a/!NetSurf/!Boot,feb +++ b/!NetSurf/!Boot,feb @@ -9,4 +9,4 @@ If "" = "" Then Set Alias$Open_URI_https .URI If "" = "" Then Set Alias$Open_URI_file .URILaunch | Claim URI files -If "" = "" Then Set Alias$@RunType_F91 .URILaunch +|If "" = "" Then Set Alias$@RunType_F91 .URILaunch diff --git a/!NetSurf/!Run,feb b/!NetSurf/!Run,feb index f9cc831af..b908da4d2 100644 --- a/!NetSurf/!Run,feb +++ b/!NetSurf/!Run,feb @@ -25,11 +25,11 @@ RMEnsure SharedUnixLibrary 1.02 Error NetSurf requires SharedUnixLibrary 1.02 or | Load AcornURI if it isn't already | http://sudden.recoil.org/ -Set NetSurf$Start_URI_Handler "no" -RMEnsure AcornURI 0.12 Set NetSurf$Start_URI_Handler "yes" +Unset NetSurf$Start_URI_Handler +RMEnsure AcornURI 0.12 Set NetSurf$Start_URI_Handler 1 RMEnsure AcornURI 0.12 RMLoad System:Modules.Network.URI RMEnsure AcornURI 0.12 Error NetSurf requires AcornURI 0.12 or later. A version of this can be found at http://sudden.recoil.org/others/ -RMEnsure AcornURI 0.12 Set NetSurf$Start_URI_Handler "no" +RMEnsure AcornURI 0.12 Unset NetSurf$Start_URI_Handler | Check for mime map module If "" = "" Then Error Inet databases can not be found diff --git a/desktop/gui.h b/desktop/gui.h index aa87b6681..5ca8e038d 100644 --- a/desktop/gui.h +++ b/desktop/gui.h @@ -53,6 +53,7 @@ void gui_download_window_error(gui_window *g, const char *error); void gui_init(int argc, char** argv); void gui_multitask(void); void gui_poll(bool active); +void gui_quit(void); gui_safety gui_window_set_redraw_safety(gui_window* g, gui_safety s); diff --git a/desktop/netsurf.c b/desktop/netsurf.c index ebc364612..61b4568a9 100644 --- a/desktop/netsurf.c +++ b/desktop/netsurf.c @@ -76,4 +76,5 @@ void netsurf_exit(void) { cache_quit(); fetch_quit(); + gui_quit(); } diff --git a/makefile b/makefile index b7d432294..22d05f4e4 100644 --- a/makefile +++ b/makefile @@ -14,7 +14,7 @@ OBJECTS = $(OBJECTS_COMMON) \ browser.o loginlist.o netsurf.o \ htmlredraw.o \ 401login.o dialog.o download.o gui.o menus.o mouseactions.o \ - options.o textselection.o theme.o \ + options.o textselection.o theme.o window.o \ draw.o gif.o jpeg.o plugin.o png.o sprite.o \ about.o filetype.o font.o uri.o OBJECTS_DEBUG = $(OBJECTS_COMMON) \ diff --git a/riscos/dialog.c b/riscos/dialog.c index 5dd170dc6..06c6b705e 100644 --- a/riscos/dialog.c +++ b/riscos/dialog.c @@ -118,17 +118,13 @@ wimp_w ro_gui_dialog_create(const char *template_name) void ro_gui_dialog_open(wimp_w w) { - int xeig_factor, yeig_factor, xwind_limit, ywind_limit, - screen_x, screen_y, dx, dy; + int screen_x, screen_y, dx, dy; wimp_window_state open; /* find screen centre in os units */ - os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_XEIG_FACTOR, &xeig_factor); - os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_YEIG_FACTOR, &yeig_factor); - os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_XWIND_LIMIT, &xwind_limit); - os_read_mode_variable(os_CURRENT_MODE, os_MODEVAR_YWIND_LIMIT, &ywind_limit); - screen_x = (xwind_limit + 1) << (xeig_factor - 1); - screen_y = (ywind_limit + 1) << (yeig_factor - 1); + ro_gui_screen_size(&screen_x, &screen_y); + screen_x /= 2; + screen_y /= 2; /* centre and open */ open.w = w; diff --git a/riscos/download.c b/riscos/download.c index 100b28eda..0396fba58 100644 --- a/riscos/download.c +++ b/riscos/download.c @@ -91,8 +91,8 @@ gui_window *gui_create_download_window(struct content *content) 256; /* create and open the download window */ - g->data.download.window = wimp_create_window(download_template); - ro_gui_dialog_open(g->data.download.window); + g->window = wimp_create_window(download_template); + ro_gui_dialog_open(g->window); g->data.download.download_status = download_INCOMPLETE; @@ -141,7 +141,7 @@ void ro_gui_download_leaf(const char *url, char *leaf) void gui_download_window_update_status(gui_window *g) { strncpy(g->status, g->data.download.content->status_message, 256); - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_STATUS, 0, 0); } @@ -156,15 +156,15 @@ void gui_download_window_error(gui_window *g, const char *error) /* place error message in status icon in red */ strncpy(g->status, error, 256); - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_STATUS, wimp_COLOUR_RED << wimp_ICON_FG_COLOUR_SHIFT, wimp_ICON_FG_COLOUR); /* grey out file and pathname icons */ - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_ICON, wimp_ICON_SHADED, 0); - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_PATH, wimp_ICON_SHADED, 0); g->data.download.download_status = download_ERROR; @@ -179,13 +179,13 @@ void gui_download_window_done(gui_window *g) { snprintf(g->status, 256, messages_get("Downloaded"), g->data.download.content->data.other.length); - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_STATUS, 0, 0); // clear shaded path and icon icons - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_ICON, 0, wimp_ICON_SHADED); - wimp_set_icon_state(g->data.download.window, + wimp_set_icon_state(g->window, ICON_DOWNLOAD_PATH, 0, wimp_ICON_SHADED); g->data.download.download_status = download_COMPLETE; @@ -223,7 +223,7 @@ struct gui_window * ro_lookup_download_window_from_w(wimp_w window) { if (g->type == GUI_DOWNLOAD_WINDOW) { - if (g->data.browser.window == window) + if (g->window == window) { return g; } @@ -236,5 +236,5 @@ void ro_download_window_close(struct gui_window *g) { // free contexts etc??? - wimp_close_window(g->data.download.window); + wimp_close_window(g->window); } diff --git a/riscos/gui.c b/riscos/gui.c index 712244842..37343d91e 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -8,18 +8,16 @@ */ #include -#include #include #include #include #include #include +#include #include "oslib/os.h" #include "oslib/osfile.h" -#include "oslib/osgbpb.h" #include "oslib/plugin.h" #include "oslib/wimp.h" -#include "oslib/wimpspriteop.h" #include "oslib/uri.h" #include "netsurf/desktop/gui.h" #include "netsurf/desktop/netsurf.h" @@ -36,1044 +34,135 @@ #include "netsurf/utils/messages.h" #include "netsurf/utils/utils.h" -const char *__dynamic_da_name = "NetSurf"; -//static char empty_text[] = ""; -//static char password_v[] = "D*"; -char *NETSURF_DIR; -gui_window *window_list = 0; +const char *__dynamic_da_name = "NetSurf"; /**< For UnixLib. */ +const char *HOME_URL = "file:///%3CNetSurf$Dir%3E/Docs/en/intro"; +const char *HELP_URL = "file:///%3CNetSurf$Dir%3E/Docs/en/index"; -const char* HOME_URL = "file:///%3CNetSurf$Dir%3E/Docs/en/intro"; -const char* HELP_URL = "file:///%3CNetSurf$Dir%3E/Docs/en/index"; +char *NETSURF_DIR; +wimp_menu *combo_menu; +struct form_control *current_gadget; +gui_window *over_window = 0; /**< Window which the pointer is over. */ +bool gui_reformat_pending = false; /**< Some windows have been resized, + and should be reformatted. */ +static wimp_t task_handle; /**< RISC OS wimp task handle. */ +/** Accepted wimp user messages. */ +static const wimp_MESSAGE_LIST(24) task_messages = { { + message_DATA_SAVE, + message_DATA_SAVE_ACK, + message_DATA_LOAD, + message_DATA_OPEN, + message_URI_PROCESS, + message_PLUG_IN_OPENING, + message_PLUG_IN_CLOSED, + message_PLUG_IN_RESHAPE_REQUEST, + message_PLUG_IN_FOCUS, + message_PLUG_IN_URL_ACCESS, + message_PLUG_IN_STATUS, + message_PLUG_IN_BUSY, + message_PLUG_IN_STREAM_NEW, + message_PLUG_IN_STREAM_WRITE, + message_PLUG_IN_STREAM_WRITTEN, + message_PLUG_IN_STREAM_DESTROY, + message_PLUG_IN_OPEN, + message_PLUG_IN_CLOSE, + message_PLUG_IN_RESHAPE, + message_PLUG_IN_STREAM_AS_FILE, + message_PLUG_IN_NOTIFY, + message_PLUG_IN_ABORT, + message_PLUG_IN_ACTION, + /* message_PLUG_IN_INFORMED, (not provided by oslib) */ + 0 +} }; +struct ro_gui_poll_block { + wimp_event_no event; + wimp_block *block; + struct ro_gui_poll_block *next; +}; +struct ro_gui_poll_block *ro_gui_poll_queued_blocks = 0; -void ro_gui_window_click(gui_window* g, wimp_pointer* mouse); -//void ro_gui_window_mouse_at(gui_window* g, wimp_pointer* mouse); -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_keypress(gui_window* g, wimp_key* key); -static void ro_gui_toolbar_redraw(gui_window* g, wimp_draw* redraw); -static void gui_disable_icon(wimp_w w, wimp_i i); -static void gui_enable_icon(wimp_w w, wimp_i i); -static void ro_gui_icon_bar_click(wimp_pointer* pointer); -static void ro_gui_throb(void); -static gui_window* ro_lookup_gui_from_w(wimp_w window); -static gui_window* ro_lookup_gui_toolbar_from_w(wimp_w window); -static void ro_gui_window_mouse_at(wimp_pointer* pointer); -static void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer); +static void ro_gui_icon_bar_create(void); static void ro_gui_poll_queue(wimp_event_no event, wimp_block* block); +static void ro_gui_icon_bar_click(wimp_pointer* pointer); static void ro_gui_keypress(wimp_key* key); static void ro_msg_datasave(wimp_message* block); static void ro_msg_dataload(wimp_message* block); static void ro_msg_datasave_ack(wimp_message* message); -static void ro_gui_screen_size(int *width, int *height); -int ro_save_data(void *data, unsigned long length, char *file_name, bits file_type); - - - -wimp_menu* combo_menu; -struct form_control* current_gadget; - - -int TOOLBAR_HEIGHT = 128; - -ro_theme* current_theme = NULL; - -const char* BROWSER_VALIDATION = "\0"; - -const char* task_name = "NetSurf"; -const wimp_MESSAGE_LIST(23) task_messages = { - {message_DATA_SAVE, - message_DATA_SAVE_ACK, - message_DATA_LOAD, - message_URI_PROCESS, - message_PLUG_IN_OPENING, - message_PLUG_IN_CLOSED, - message_PLUG_IN_RESHAPE_REQUEST, - message_PLUG_IN_FOCUS, - message_PLUG_IN_URL_ACCESS, - message_PLUG_IN_STATUS, - message_PLUG_IN_BUSY, - message_PLUG_IN_STREAM_NEW, - message_PLUG_IN_STREAM_WRITE, - message_PLUG_IN_STREAM_WRITTEN, - message_PLUG_IN_STREAM_DESTROY, - message_PLUG_IN_OPEN, - message_PLUG_IN_CLOSE, - message_PLUG_IN_RESHAPE, - message_PLUG_IN_STREAM_AS_FILE, - message_PLUG_IN_NOTIFY, - message_PLUG_IN_ABORT, - message_PLUG_IN_ACTION, - /* message_PLUG_IN_INFORMED, (not provided by oslib) */ - 0} }; -wimp_t task_handle; - -wimp_i ro_gui_iconbar_i; - -gui_window* over_window = NULL; -bool gui_reformat_pending = false; - -int ro_x_units(unsigned long browser_units) -{ - return (browser_units << 1); -} - -int ro_y_units(unsigned long browser_units) -{ - return -(browser_units << 1); -} - -unsigned long browser_x_units(int ro_units) -{ - return (ro_units >> 1); -} - -unsigned long browser_y_units(int ro_units) -{ - return -(ro_units >> 1); -} - -int window_x_units(int scr_units, wimp_window_state* win) -{ - return scr_units - (win->visible.x0 - win->xscroll); -} - -int window_y_units(int scr_units, wimp_window_state* win) -{ - return scr_units - (win->visible.y1 - win->yscroll); -} - - -gui_window *gui_create_browser_window(struct browser_window *bw) -{ - struct wimp_window window; - - gui_window* g = (gui_window*) xcalloc(1, sizeof(gui_window)); - g->type = GUI_BROWSER_WINDOW; - g->data.browser.bw = bw; - /* create browser and toolbar windows here */ - - window.visible.x0 = 0; - window.visible.y0 = 0; - window.visible.x1 = ro_x_units(bw->format_width); - window.visible.y1 = 2000; - window.xscroll = 0; - window.yscroll = 0; - window.next = wimp_TOP; - window.flags = - wimp_WINDOW_MOVEABLE | wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_BACK_ICON | - wimp_WINDOW_CLOSE_ICON | wimp_WINDOW_TITLE_ICON | wimp_WINDOW_VSCROLL | - wimp_WINDOW_HSCROLL | wimp_WINDOW_SIZE_ICON | wimp_WINDOW_TOGGLE_ICON | - wimp_WINDOW_IGNORE_XEXTENT; - window.title_fg = wimp_COLOUR_BLACK; - window.title_bg = wimp_COLOUR_LIGHT_GREY; - window.work_fg = wimp_COLOUR_LIGHT_GREY; - window.work_bg = wimp_COLOUR_WHITE; - window.scroll_outer = wimp_COLOUR_DARK_GREY; - window.scroll_inner = wimp_COLOUR_MID_LIGHT_GREY; - window.highlight_bg = wimp_COLOUR_CREAM; - window.extra_flags = 0; - window.extent.x0 = 0; - window.extent.y0 = ro_y_units(bw->format_height); - window.extent.x1 = 8192;//ro_x_units(bw->format_width); - if ((bw->flags & browser_TOOLBAR) != 0) - { - window.extent.y1 = ro_theme_toolbar_height(current_theme); - } - else - { - 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; - window.xmin = 100; - window.ymin = window.extent.y1 + 100; - window.title_data.indirected_text.text = g->title; - window.title_data.indirected_text.validation = BROWSER_VALIDATION; - window.title_data.indirected_text.size = 255; - window.icon_count = 0; - g->data.browser.window = wimp_create_window(&window); - - strcpy(g->title, "NetSurf"); - - g->data.browser.toolbar = 0; - if ((bw->flags & browser_TOOLBAR) != 0) - { - ro_theme_window create_toolbar; - - create_toolbar.type = THEME_TOOLBAR; - create_toolbar.data.toolbar.indirected_url = g->url; - create_toolbar.data.toolbar.indirected_status = g->status; - g->data.browser.toolbar = ro_theme_create_window(current_theme, &create_toolbar); - g->data.browser.toolbar_width = -1; - } - - g->redraw_safety = SAFE; - g->data.browser.reformat_pending = false; - g->data.browser.old_width = 0; - - g->next = window_list; - window_list = g; - return g; -} - -void gui_window_set_title(gui_window* g, char* title) -{ - if (title != NULL) - strncpy(g->title, title, 255); - else - strcpy(g->title, "NetSurf (untitled document)"); - wimp_force_redraw_title(g->data.browser.window); -} - -void gui_window_destroy(gui_window* g) -{ - assert(g != 0); - - if (g == window_list) - window_list = g->next; - else - { - gui_window* gg; - assert(window_list != NULL); - gg = window_list; - while (gg->next != g && gg->next != NULL) - gg = gg->next; - assert(gg->next != NULL); - gg->next = g->next; - } - - xwimp_delete_window(g->data.browser.window); - if (g->data.browser.toolbar) - xwimp_delete_window(g->data.browser.toolbar); - - xfree(g); -} - -void gui_window_show(gui_window* g) -{ - wimp_window_state state; - if (g == NULL) - return; - state.w = g->data.browser.window; - wimp_get_window_state(&state); - state.next = wimp_TOP; - ro_gui_window_open(g, (wimp_open*)&state); -} - -void gui_window_redraw(gui_window* g, unsigned long x0, unsigned long y0, - unsigned long x1, unsigned long y1) -{ - if (g == NULL) - return; - - wimp_force_redraw(g->data.browser.window, - ro_x_units(x0), ro_y_units(y1), ro_x_units(x1), ro_y_units(y0)); -} - -void gui_window_redraw_window(gui_window* g) -{ - wimp_window_info info; - if (g == NULL) - return; - info.w = g->data.browser.window; - wimp_get_window_info_header_only(&info); - wimp_force_redraw(g->data.browser.window, info.extent.x0, info.extent.y0, info.extent.x1, info.extent.y1); -} - -gui_safety gui_window_set_redraw_safety(gui_window* g, gui_safety s) -{ - gui_safety old; - - if (g == NULL) - return SAFE; - - old = g->redraw_safety; - g->redraw_safety = s; - - return old; -} - - - - -void ro_gui_toolbar_redraw(gui_window* g, wimp_draw* redraw) -{ - osbool more; - wimp_icon_state throbber; - - throbber.w = g->data.browser.toolbar; - throbber.i = ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"); - wimp_get_icon_state(&throbber); - - throbber.icon.flags = wimp_ICON_SPRITE; - snprintf(throbber.icon.data.sprite, 12, "throbber%d", g->throbber); - - more = wimp_redraw_window(redraw); - while (more) - { - wimp_plot_icon(&throbber.icon); - more = wimp_get_rectangle(redraw); - } - return; -} - -void ro_gui_window_redraw(gui_window* g, wimp_draw* redraw) -{ - osbool more; - struct content *c = g->data.browser.bw->current_content; - - if (g->redraw_safety == SAFE && g->type == GUI_BROWSER_WINDOW && c != NULL) - { - more = wimp_redraw_window(redraw); - wimp_set_font_colours(wimp_COLOUR_WHITE, wimp_COLOUR_BLACK); - - 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, - redraw->clip.x0, redraw->clip.y0, - redraw->clip.x1 - 1, redraw->clip.y1 - 1); - more = wimp_get_rectangle(redraw); - } - } - else - { - more = wimp_redraw_window(redraw); - while (more) - more = wimp_get_rectangle(redraw); - } -} - -void gui_window_set_scroll(gui_window* g, unsigned long sx, unsigned long sy) -{ - wimp_window_state state; - if (g == NULL) - return; - state.w = g->data.browser.window; - wimp_get_window_state(&state); - state.xscroll = ro_x_units(sx); - state.yscroll = ro_y_units(sy); - if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) - state.yscroll += ro_theme_toolbar_height(current_theme); - ro_gui_window_open(g, (wimp_open*)&state); -} - -unsigned long gui_window_get_width(gui_window* g) -{ - wimp_window_state state; - state.w = g->data.browser.window; - wimp_get_window_state(&state); - return browser_x_units(state.visible.x1 - state.visible.x0); -} - -void gui_window_set_extent(gui_window* g, unsigned long width, unsigned long height) -{ - os_box extent; - - if (g == 0) - return; - - extent.x0 = 0; - extent.y0 = ro_y_units(height); - if (extent.y0 > -960) - extent.y0 = -960; - extent.x1 = ro_x_units(width); - if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) - { - extent.y1 = ro_theme_toolbar_height(current_theme); - } - else - { - extent.y1 = 0; - } - wimp_set_extent(g->data.browser.window, &extent); - -} - -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, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_STATUS"), 0, 0); - } -} - -void gui_disable_icon(wimp_w w, wimp_i i) -{ - wimp_set_icon_state(w, i, wimp_ICON_SHADED, wimp_ICON_SHADED); -} - -void gui_enable_icon(wimp_w w, wimp_i i) -{ - wimp_set_icon_state(w, i, 0, wimp_ICON_SHADED); -} - -void gui_window_message(gui_window* g, gui_message* msg) -{ - if (g == NULL || msg == NULL) - return; - - switch (msg->type) - { - case msg_SET_URL: - fprintf(stderr, "Set URL '%s'\n", msg->data.set_url.url); - strncpy(g->url, msg->data.set_url.url, 255); - wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_URL"), 0, 0); - if (g->data.browser.bw->history != NULL) - { - if (g->data.browser.bw->history->earlier != NULL) - gui_enable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")); - else - gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")); - if (g->data.browser.bw->history->later != NULL) - gui_enable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")); - else - gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")); - } - else - { - gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")); - gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")); - } - break; - default: - break; - } -} - -void ro_gui_window_open(gui_window* g, wimp_open* open) -{ - if (g->type == GUI_BROWSER_WINDOW) - { - wimp_window_state state; - state.w = g->data.browser.window; - wimp_get_window_state(&state); - if (state.flags & wimp_WINDOW_TOGGLED) { - open->visible.x0 = open->visible.y0 = 0; - ro_gui_screen_size(&open->visible.x1, &open->visible.y1); - } - - if (g->data.browser.bw->current_content != 0) { - int width = open->visible.x1 - open->visible.x0; - if (g->data.browser.old_width != width) { - if (g->data.browser.bw->current_content->width - < browser_x_units(width)) - gui_window_set_extent(g, browser_x_units(width), - g->data.browser.bw->current_content->height); - else - gui_window_set_extent(g, g->data.browser.bw->current_content->width, - g->data.browser.bw->current_content->height); - g->data.browser.old_width = width; - g->data.browser.reformat_pending = true; - gui_reformat_pending = true; - } - } - wimp_open_window(open); - - if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) - { - wimp_outline outline; - wimp_window_state tstate; - - outline.w = g->data.browser.window; - wimp_get_window_outline(&outline); - - - tstate.w = g->data.browser.toolbar; - tstate.visible.x0 = open->visible.x0; - tstate.visible.x1 = outline.outline.x1 - 2; - tstate.visible.y1 = open->visible.y1; - tstate.visible.y0 = tstate.visible.y1 - ro_theme_toolbar_height(current_theme); - tstate.xscroll = 0; - tstate.yscroll = 0; - tstate.next = wimp_TOP; - - wimp_open_window_nested((wimp_open *) &tstate, g->data.browser.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_BOTTOM_OR_LEFT - << wimp_CHILD_RS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_TS_EDGE_SHIFT); - - if (tstate.visible.x1 - tstate.visible.x0 != g->data.browser.toolbar_width) - { - g->data.browser.toolbar_width = tstate.visible.x1 - tstate.visible.x0; - ro_theme_resize(current_theme, THEME_TOOLBAR, g->data.browser.toolbar, g->data.browser.toolbar_width, tstate.visible.y1 - tstate.visible.y0); - } - - } - } else { - wimp_open_window(open); - } -} - -void ro_gui_icon_bar_click(wimp_pointer* pointer) -{ - if (pointer->buttons == wimp_CLICK_MENU) - { - ro_gui_create_menu(iconbar_menu, pointer->pos.x - 64, 96 + iconbar_menu_height, NULL); - } - else if (pointer->buttons == wimp_CLICK_SELECT) - { - struct browser_window* bw; - bw = create_browser_window(browser_TITLE | browser_TOOLBAR - | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); - gui_window_show(bw->window); - browser_window_open_location(bw, HOME_URL); - wimp_set_caret_position(bw->window->data.browser.toolbar, - ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_URL"), - 0,0,-1, (int) strlen(bw->window->url) - 1); - } -// else if (pointer->buttons == wimp_CLICK_ADJUST) -// netsurf_quit = 1; -} - - -/*** bodge to fix filenames in unixlib. there's probably a proper way - of doing this, but 'ck knows what it is. ***/ -extern int __riscosify_control; -#define __RISCOSIFY_NO_PROCESS 0x0040 - -void gui_init(int argc, char** argv) -{ - wimp_icon_create iconbar; - wimp_version_no version; - char theme_fname[256]; - int *varsize; - char *var; - os_error *e; - fileswitch_object_type *ot; - - NETSURF_DIR = getenv("NetSurf$Dir"); - messages_load(".Resources.en.Messages"); - -/* __riscosify_control = __RISCOSIFY_NO_PROCESS; */ - - task_handle = wimp_initialise(wimp_VERSION_RO38, task_name, (wimp_message_list*) &task_messages, &version); - - /* Issue a *Desktop to poke AcornURI into life */ - if(strcasecmp(getenv("NetSurf$Start_URI_Handler"), "yes") == 0) - xwimp_start_task("Desktop", NULL); - xos_cli("UnSet NetSurf$Start_Uri_Handler"); - - iconbar.w = wimp_ICON_BAR_RIGHT; - iconbar.icon.extent.x0 = 0; - iconbar.icon.extent.y0 = 0; - iconbar.icon.extent.x1 = 68; - iconbar.icon.extent.y1 = 68; - iconbar.icon.flags = wimp_ICON_SPRITE | wimp_ICON_HCENTRED - | wimp_ICON_VCENTRED | (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT); - strcpy(iconbar.icon.data.sprite, "!netsurf"); - ro_gui_iconbar_i = wimp_create_icon(&iconbar); - - if (OPTIONS.theme != NULL) { - - /* get size of */ - e = xos_read_var_val_size ("NetSurf$Dir",0,os_VARTYPE_STRING, - &varsize, NULL, NULL); - var = xcalloc((~((int)varsize) + 10),sizeof(char)); - /* get real value of */ - e = xos_read_var_val ("NetSurf$Dir", var, (~(int)varsize), 0, - os_VARTYPE_STRING, NULL, NULL, NULL); - - strcat(var, ".Themes."); - /* check if theme directory exists */ - e = xosfile_read_stamped_path ((const char*)OPTIONS.theme, - (const char*)var, - &ot, NULL, NULL, NULL, NULL, NULL); - xfree(var); - /* yes -> use this theme */ - if (ot != fileswitch_NOT_FOUND && ot == fileswitch_IS_DIR) { - sprintf(theme_fname, ".Themes.%s", OPTIONS.theme); - } - /* no -> use default theme */ - else { - OPTIONS.theme = strdup("Default"); - sprintf(theme_fname, ".Themes.Default"); - } - } - else { - sprintf(theme_fname, ".Themes.Default"); - OPTIONS.theme = strdup("Default"); - } - LOG(("Using theme '%s' - from '%s'",theme_fname, OPTIONS.theme)); - current_theme = ro_theme_create(theme_fname); - - wimp_open_template(".Resources.Templates"); - ro_gui_dialog_init(); - ro_gui_download_init(); - ro_gui_menus_init(); - ro_gui_401login_init(); - wimp_close_template(); -} - -void ro_gui_throb(void) -{ - gui_window* g; - float nowtime = (float) clock() / CLOCKS_PER_SEC; - - for (g = window_list; g != NULL; g = g->next) - { - if (g->type == GUI_BROWSER_WINDOW) - { - if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) - { - if (g->data.browser.bw->throbbing != 0) - { - if (nowtime > g->throbtime + 0.2) - { - g->throbtime = nowtime; - g->throbber++; - if (g->throbber > current_theme->throbs) - g->throbber = 0; - - wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"), 0, 0); - } - } - } - } - } -} - -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->data.browser.window == window) - { - return g; - } - } - } - return NULL; -} - -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) - { - if (g->data.browser.toolbar == window) - { - return g; - } - } - } - return NULL; -} - -void ro_gui_window_mouse_at(wimp_pointer* pointer) -{ - int x,y; - wimp_window_state state; - gui_window* g; - - g = ro_lookup_gui_from_w(pointer->w); - - if (g == NULL) - return; - - if (g->redraw_safety != SAFE) - { - fprintf(stderr, "mouse at UNSAFE\n"); - return; - } - - state.w = pointer->w; - wimp_get_window_state(&state); - - x = browser_x_units(window_x_units(pointer->pos.x, &state)); - y = browser_y_units(window_y_units(pointer->pos.y, &state)); - - if (g->drag_status == drag_BROWSER_TEXT_SELECTION) - { - struct browser_action msg; - msg.type = act_ALTER_SELECTION; - msg.data.mouse.x = x; - msg.data.mouse.y = y; - browser_window_action(g->data.browser.bw, &msg); - } - - if (g->type == GUI_BROWSER_WINDOW) - { - if (g->data.browser.bw->current_content != NULL) - { - struct browser_action msg; - msg.type = act_MOUSE_AT; - msg.data.mouse.x = x; - msg.data.mouse.y = y; - browser_window_action(g->data.browser.bw, &msg); - } - } -} - -void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer) -{ - if (pointer->i == ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")) - { - browser_window_back(g->data.browser.bw); - } - else if (pointer->i == ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")) - { - browser_window_forward(g->data.browser.bw); - } - else if (pointer->i == ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_RELOAD")) - { - browser_window_open_location_historical(g->data.browser.bw, - g->data.browser.bw->url, 0, 0); - } -} - - -void ro_gui_window_click(gui_window* g, wimp_pointer* pointer) -{ - struct browser_action msg; - int x,y; - wimp_window_state state; - - if (g->redraw_safety != SAFE) - { - fprintf(stderr, "gui_window_click UNSAFE\n"); - return; - } - - state.w = pointer->w; - wimp_get_window_state(&state); +static int ro_save_data(void *data, unsigned long length, char *file_name, bits file_type); +static void ro_msg_dataopen(wimp_message* block); +static char *ro_path_to_url(const char *path); - if (g->type == GUI_BROWSER_WINDOW) - { - x = browser_x_units(window_x_units(pointer->pos.x, &state)); - y = browser_y_units(window_y_units(pointer->pos.y, &state)); - - if (pointer->buttons == wimp_CLICK_MENU) - { - /* check for mouse gestures */ - ro_gui_mouse_action(g); - } - 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) - { - msg.type = act_MOUSE_CLICK; - msg.data.mouse.x = x; - msg.data.mouse.y = y; - msg.data.mouse.buttons = act_BUTTON_NORMAL; - 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_drag.data.selection.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); - } - } - } - } -} - -struct ro_gui_poll_block -{ - wimp_event_no event; - wimp_block* block; - struct ro_gui_poll_block* next; -}; - -struct ro_gui_poll_block* ro_gui_poll_queued_blocks = NULL; -void ro_gui_poll_queue(wimp_event_no event, wimp_block* block) -{ - struct ro_gui_poll_block* q = xcalloc(1, sizeof(struct ro_gui_poll_block)); - - q->event = event; - q->block = xcalloc(1, sizeof(*block)); - memcpy(q->block, block, sizeof(*block)); - q->next = NULL; - - if (ro_gui_poll_queued_blocks == NULL) - { - ro_gui_poll_queued_blocks = q; - return; - } - else - { - struct ro_gui_poll_block* current = ro_gui_poll_queued_blocks; - while (current->next != NULL) - current = current->next; - current->next = q; - } - return; -} - -void gui_multitask(void) -{ - wimp_event_no event; - wimp_block block; - gui_window* g; - - event = wimp_poll(wimp_QUEUE_KEY | - wimp_MASK_LOSE | wimp_MASK_GAIN | wimp_MASK_POLLWORD, &block, 0); - - switch (event) - { - case wimp_NULL_REASON_CODE: - if (over_window != NULL) - { - wimp_pointer pointer; - wimp_get_pointer_info(&pointer); - ro_gui_window_mouse_at(&pointer); - } - ro_gui_throb(); - break; - - case wimp_REDRAW_WINDOW_REQUEST : - if (block.redraw.w == dialog_config_th) - ro_gui_redraw_config_th(&block.redraw); - else { - g = ro_lookup_gui_from_w(block.redraw.w); - if (g) - ro_gui_window_redraw(g, &(block.redraw)); - else { - g = ro_lookup_gui_toolbar_from_w(block.redraw.w); - if (g) - ro_gui_toolbar_redraw(g, &(block.redraw)); - else { - osbool more = wimp_redraw_window(&block.redraw); - while (more) - more = wimp_get_rectangle(&block.redraw); - } - } - } - break; - - case wimp_OPEN_WINDOW_REQUEST : - g = ro_lookup_gui_from_w(block.open.w); - if (g != NULL) - ro_gui_window_open(g, &(block.open)); - else - { - wimp_open_window(&block.open); - } - break; - - case wimp_CLOSE_WINDOW_REQUEST : - ro_gui_poll_queue(event, &block); - break; - - case wimp_MOUSE_CLICK : - if (block.pointer.w == wimp_ICON_BAR) - ro_gui_icon_bar_click(&(block.pointer)); - else - { - g = ro_lookup_gui_from_w(block.pointer.w); - if (g != NULL) - { - if (g->redraw_safety == SAFE) - ro_gui_window_click(g, &(block.pointer)); - else - ro_gui_poll_queue(event, &block); - } - else - { - g = ro_lookup_gui_toolbar_from_w(block.pointer.w); - if (g != NULL) - { - ro_gui_toolbar_click(g, &(block.pointer)); - } - else - { - ro_gui_poll_queue(event, &block); - } - } - } - break; - - case wimp_POINTER_LEAVING_WINDOW : - over_window = NULL; - break; - case wimp_POINTER_ENTERING_WINDOW : - over_window = ro_lookup_gui_from_w(block.leaving.w); - break; - case wimp_USER_DRAG_BOX : - ro_gui_drag_end(&(block.dragged)); - break; - case wimp_MENU_SELECTION : - case wimp_USER_MESSAGE : - case wimp_USER_MESSAGE_RECORDED : - case wimp_USER_MESSAGE_ACKNOWLEDGE: - - fprintf(stderr, "MESSAGE %d (%x) HAS ARRIVED\n", block.message.action, block.message.action); - - switch (block.message.action) - { - case message_DATA_SAVE : - ro_msg_datasave(&(block.message)); - break; - - case message_DATA_SAVE_ACK : - ro_msg_datasave_ack(&(block.message)); - break; - - case message_DATA_LOAD : - ro_msg_dataload(&(block.message)); - break; +/** + * Initialise the gui (RISC OS specific part). + */ - case message_URI_PROCESS : - ro_uri_message_received(&(block.message)); - break; +void gui_init(int argc, char** argv) +{ + char theme_fname[256]; - case message_PLUG_IN_OPENING: - case message_PLUG_IN_CLOSED: - case message_PLUG_IN_RESHAPE_REQUEST: - case message_PLUG_IN_FOCUS: - case message_PLUG_IN_URL_ACCESS: - case message_PLUG_IN_STATUS: - case message_PLUG_IN_BUSY: - case message_PLUG_IN_STREAM_NEW: - case message_PLUG_IN_STREAM_WRITE: - case message_PLUG_IN_STREAM_WRITTEN: - case message_PLUG_IN_STREAM_DESTROY: - case message_PLUG_IN_OPEN: - case message_PLUG_IN_CLOSE: - case message_PLUG_IN_RESHAPE: - case message_PLUG_IN_STREAM_AS_FILE: - case message_PLUG_IN_NOTIFY: - case message_PLUG_IN_ABORT: - case message_PLUG_IN_ACTION: - plugin_msg_parse(&(block.message), - (event == wimp_USER_MESSAGE_ACKNOWLEDGE ? 1 : 0)); - break; + NETSURF_DIR = getenv("NetSurf$Dir"); + messages_load(".Resources.en.Messages"); - case message_QUIT : - netsurf_quit = true; - break; + task_handle = wimp_initialise(wimp_VERSION_RO38, "NetSurf", + (wimp_message_list*) &task_messages, 0); - default: - ro_gui_poll_queue(event, &block); - break; + /* Issue a *Desktop to poke AcornURI into life */ + if (getenv("NetSurf$Start_URI_Handler")) + xwimp_start_task("Desktop", 0); - } - break; - default: - break; - } + if (OPTIONS.theme) { + snprintf(theme_fname, sizeof(theme_fname), + ".Themes.%s", OPTIONS.theme); + /* check if theme directory exists */ + if (!is_dir(theme_fname)) { + free(OPTIONS.theme); + OPTIONS.theme = strdup("Default"); + sprintf(theme_fname, ".Themes.Default"); + } + } else { + OPTIONS.theme = strdup("Default"); + sprintf(theme_fname, ".Themes.Default"); + } + current_theme = ro_theme_create(theme_fname); + wimp_open_template(".Resources.Templates"); + ro_gui_dialog_init(); + ro_gui_download_init(); + ro_gui_menus_init(); + ro_gui_401login_init(); + wimp_close_template(); + ro_gui_icon_bar_create(); } -void ro_gui_keypress(wimp_key* key) + +/** + * Create an iconbar icon. + */ + +void ro_gui_icon_bar_create(void) { - gui_window* g; + wimp_icon_create icon = { + wimp_ICON_BAR_RIGHT, + { { 0, 0, 68, 68 }, + wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | + (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT), + { "!netsurf" } } }; + wimp_create_icon(&icon); +} - if (key->i == -1 && (key->c < 256 || (key->c >= 396 && key->c <= 399))) { - g = ro_lookup_gui_from_w(key->w); - if (g) { - /* Munge cursor keys into unused control chars */ - if (key->c == 396) key->c = 29; /* Left */ - else if (key->c == 397) key->c = 28; /* Right */ - else if (key->c == 398) key->c = 31; /* Down */ - else if (key->c == 399) key->c = 30; /* Up */ - browser_window_key_press(g->data.browser.bw, (char) key->c); - return; - } - } - g = ro_lookup_gui_toolbar_from_w(key->w); - if (g != NULL) - { - if (key->c == wimp_KEY_RETURN) - { - if (g->data.browser.bw->url != NULL) - { - xfree(g->data.browser.bw->url); - g->data.browser.bw->url = NULL; - } - if (strcasecmp(g->url, "about:") == 0) { - about_create(); - browser_window_open_location(g->data.browser.bw, - "file:///%3CWimp$ScrapDir%3E/WWW/NetSurf/About"); - } - else { - browser_window_open_location(g->data.browser.bw, g->url); - } - return; - } - else if (key->c == wimp_KEY_F8) - { - /* TODO: use some protocol so it's type as HTML not Text. */ - if(g->data.browser.bw->current_content->type == CONTENT_HTML || - g->data.browser.bw->current_content->type == CONTENT_TEXTPLAIN) - xosfile_save_stamped("Pipe:$.Source", osfile_TYPE_TEXT, - g->data.browser.bw->current_content->data.html.source, - (g->data.browser.bw->current_content->data.html.source + - g->data.browser.bw->current_content->data.html.length)); - xosfile_set_type("Pipe:$.Source", osfile_TYPE_TEXT); - xos_cli("Filer_Run Pipe:$.Source"); - } - else if (key->c == wimp_KEY_F9) - { - if (g->data.browser.bw->current_content->type == CONTENT_HTML) - box_dump(g->data.browser.bw->current_content->data.html.layout->children, 0); - } - else if (key->c == wimp_KEY_F10) - { - cache_dump(); - } - else if (key->c == (wimp_KEY_CONTROL + wimp_KEY_F2)) - { - browser_window_destroy(g->data.browser.bw); - } - } - wimp_process_key(key->c); - return; +/** + * Close down the gui (RISC OS). + */ + +void gui_quit(void) +{ + wimp_close_down(task_handle); } + void gui_poll(bool active) { wimp_event_no event; @@ -1243,6 +332,165 @@ void gui_poll(bool active) ro_msg_dataload(&(block.message)); break; + case message_DATA_OPEN: + ro_msg_dataopen(&(block.message)); + break; + + case message_URI_PROCESS : + ro_uri_message_received(&(block.message)); + break; + + case message_PLUG_IN_OPENING: + case message_PLUG_IN_CLOSED: + case message_PLUG_IN_RESHAPE_REQUEST: + case message_PLUG_IN_FOCUS: + case message_PLUG_IN_URL_ACCESS: + case message_PLUG_IN_STATUS: + case message_PLUG_IN_BUSY: + case message_PLUG_IN_STREAM_NEW: + case message_PLUG_IN_STREAM_WRITE: + case message_PLUG_IN_STREAM_WRITTEN: + case message_PLUG_IN_STREAM_DESTROY: + case message_PLUG_IN_OPEN: + case message_PLUG_IN_CLOSE: + case message_PLUG_IN_RESHAPE: + case message_PLUG_IN_STREAM_AS_FILE: + case message_PLUG_IN_NOTIFY: + case message_PLUG_IN_ABORT: + case message_PLUG_IN_ACTION: + plugin_msg_parse(&(block.message), + (event == wimp_USER_MESSAGE_ACKNOWLEDGE ? 1 : 0)); + break; + + case message_QUIT : + netsurf_quit = true; + break; + } + break; + } + } + } while (finished == 0); + + return; +} + +void gui_multitask(void) +{ + wimp_event_no event; + wimp_block block; + gui_window* g; + + event = wimp_poll(wimp_QUEUE_KEY | + wimp_MASK_LOSE | wimp_MASK_GAIN, &block, 0); + + switch (event) + { + case wimp_NULL_REASON_CODE: + if (over_window != NULL) + { + wimp_pointer pointer; + wimp_get_pointer_info(&pointer); + ro_gui_window_mouse_at(&pointer); + } + ro_gui_throb(); + break; + + case wimp_REDRAW_WINDOW_REQUEST : + if (block.redraw.w == dialog_config_th) + ro_gui_redraw_config_th(&block.redraw); + else { + g = ro_lookup_gui_from_w(block.redraw.w); + if (g) + ro_gui_window_redraw(g, &(block.redraw)); + else { + g = ro_lookup_gui_toolbar_from_w(block.redraw.w); + if (g) + ro_gui_toolbar_redraw(g, &(block.redraw)); + else { + osbool more = wimp_redraw_window(&block.redraw); + while (more) + more = wimp_get_rectangle(&block.redraw); + } + } + } + break; + + case wimp_OPEN_WINDOW_REQUEST : + g = ro_lookup_gui_from_w(block.open.w); + if (g != NULL) + ro_gui_window_open(g, &(block.open)); + else + { + wimp_open_window(&block.open); + } + break; + + case wimp_CLOSE_WINDOW_REQUEST : + ro_gui_poll_queue(event, &block); + break; + + case wimp_MOUSE_CLICK : + if (block.pointer.w == wimp_ICON_BAR) + ro_gui_icon_bar_click(&(block.pointer)); + else + { + g = ro_lookup_gui_from_w(block.pointer.w); + if (g != NULL) + { + if (g->redraw_safety == SAFE) + ro_gui_window_click(g, &(block.pointer)); + else + ro_gui_poll_queue(event, &block); + } + else + { + g = ro_lookup_gui_toolbar_from_w(block.pointer.w); + if (g != NULL) + { + ro_gui_toolbar_click(g, &(block.pointer)); + } + else + { + ro_gui_poll_queue(event, &block); + } + } + } + break; + + case wimp_POINTER_LEAVING_WINDOW : + over_window = NULL; + break; + case wimp_POINTER_ENTERING_WINDOW : + over_window = ro_lookup_gui_from_w(block.leaving.w); + break; + case wimp_USER_DRAG_BOX : + ro_gui_drag_end(&(block.dragged)); + break; + case wimp_MENU_SELECTION : + case wimp_USER_MESSAGE : + case wimp_USER_MESSAGE_RECORDED : + case wimp_USER_MESSAGE_ACKNOWLEDGE: + + fprintf(stderr, "MESSAGE %d (%x) HAS ARRIVED\n", block.message.action, block.message.action); + + switch (block.message.action) + { + case message_DATA_SAVE : + ro_msg_datasave(&(block.message)); + break; + + case message_DATA_SAVE_ACK : + ro_msg_datasave_ack(&(block.message)); + break; + + case message_DATA_LOAD : + ro_msg_dataload(&(block.message)); + break; + + case message_DATA_OPEN: + ro_msg_dataopen(&(block.message)); + break; + case message_URI_PROCESS : ro_uri_message_received(&(block.message)); break; @@ -1272,25 +520,129 @@ void gui_poll(bool active) case message_QUIT : netsurf_quit = true; break; + + default: + ro_gui_poll_queue(event, &block); + break; + } break; - } - } - } while (finished == 0); + default: + break; + } + +} + +void ro_gui_poll_queue(wimp_event_no event, wimp_block* block) +{ + struct ro_gui_poll_block* q = xcalloc(1, sizeof(struct ro_gui_poll_block)); + + q->event = event; + q->block = xcalloc(1, sizeof(*block)); + memcpy(q->block, block, sizeof(*block)); + q->next = NULL; + if (ro_gui_poll_queued_blocks == NULL) + { + ro_gui_poll_queued_blocks = q; + return; + } + else + { + struct ro_gui_poll_block* current = ro_gui_poll_queued_blocks; + while (current->next != NULL) + current = current->next; + current->next = q; + } return; } -void gui_window_start_throbber(struct gui_window* g) + + +void ro_gui_icon_bar_click(wimp_pointer* pointer) { - g->throbtime = (float) (clock() + 0) / CLOCKS_PER_SEC; /* workaround compiler warning */ - g->throbber = 0; + if (pointer->buttons == wimp_CLICK_MENU) + { + ro_gui_create_menu(iconbar_menu, pointer->pos.x - 64, 96 + iconbar_menu_height, NULL); + } + else if (pointer->buttons == wimp_CLICK_SELECT) + { + struct browser_window* bw; + bw = create_browser_window(browser_TITLE | browser_TOOLBAR + | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); + gui_window_show(bw->window); + browser_window_open_location(bw, HOME_URL); + wimp_set_caret_position(bw->window->data.browser.toolbar, + ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_URL"), + 0,0,-1, (int) strlen(bw->window->url) - 1); + } } -void gui_window_stop_throbber(gui_window* g) +void ro_gui_keypress(wimp_key* key) { - g->throbber = 0; - wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"), 0, 0); + gui_window* g; + + if (key->i == -1 && (key->c < 256 || (key->c >= 396 && key->c <= 399))) { + g = ro_lookup_gui_from_w(key->w); + if (g) { + /* Munge cursor keys into unused control chars */ + if (key->c == 396) key->c = 29; /* Left */ + else if (key->c == 397) key->c = 28; /* Right */ + else if (key->c == 398) key->c = 31; /* Down */ + else if (key->c == 399) key->c = 30; /* Up */ + browser_window_key_press(g->data.browser.bw, (char) key->c); + return; + } + } + + g = ro_lookup_gui_toolbar_from_w(key->w); + if (g != NULL) + { + if (key->c == wimp_KEY_RETURN) + { + if (g->data.browser.bw->url != NULL) + { + xfree(g->data.browser.bw->url); + g->data.browser.bw->url = NULL; + } + if (strcasecmp(g->url, "about:") == 0) { + about_create(); + browser_window_open_location(g->data.browser.bw, + "file:///%3CWimp$ScrapDir%3E/WWW/NetSurf/About"); + } + else { + browser_window_open_location(g->data.browser.bw, g->url); + } + return; + } + else if (key->c == wimp_KEY_F8) + { + /* TODO: use some protocol so it's type as HTML not Text. */ + if(g->data.browser.bw->current_content->type == CONTENT_HTML || + g->data.browser.bw->current_content->type == CONTENT_TEXTPLAIN) + xosfile_save_stamped("Pipe:$.Source", osfile_TYPE_TEXT, + g->data.browser.bw->current_content->data.html.source, + (g->data.browser.bw->current_content->data.html.source + + g->data.browser.bw->current_content->data.html.length)); + xosfile_set_type("Pipe:$.Source", osfile_TYPE_TEXT); + xos_cli("Filer_Run Pipe:$.Source"); + } + else if (key->c == wimp_KEY_F9) + { + if (g->data.browser.bw->current_content->type == CONTENT_HTML) + box_dump(g->data.browser.bw->current_content->data.html.layout->children, 0); + } + else if (key->c == wimp_KEY_F10) + { + cache_dump(); + } + else if (key->c == (wimp_KEY_CONTROL + wimp_KEY_F2)) + { + browser_window_destroy(g->data.browser.bw); + } + } + wimp_process_key(key->c); + return; } void gui_gadget_combo(struct browser_window* bw, struct form_control* g, unsigned long mx, unsigned long my) @@ -1342,17 +694,10 @@ void gui_gadget_combo(struct browser_window* bw, struct form_control* g, unsigne } wimp_get_pointer_info(&pointer); - //wimp_create_menu(combo_menu, pointer.pos.x - 64, pointer.pos.y); current_gadget = g; ro_gui_create_menu(combo_menu, pointer.pos.x - 64, pointer.pos.y, bw->window); } -void gui_window_place_caret(gui_window *g, int x, int y, int height) -{ - wimp_set_caret_position(g->data.browser.window, -1, - x * 2, -(y + height) * 2, height * 2, -1); -} - void ro_msg_datasave(wimp_message* block) { gui_window* gui; @@ -1460,6 +805,97 @@ void ro_msg_dataload(wimp_message* block) } +void ro_msg_datasave_ack(wimp_message *message) +{ + int save_status = 0; + + LOG(("ACK Message: filename = %s", message->data.data_xfer.file_name)); + + if (current_drag.type == draginfo_DOWNLOAD_SAVE) + { + assert(current_drag.data.download.gui->data.download.download_status == + download_COMPLETE); + + + save_status = ro_save_data(current_drag.data.download.gui->data.download.content->data.other.data, + current_drag.data.download.gui->data.download.content->data.other.length, + message->data.data_xfer.file_name, + current_drag.data.download.gui->data.download.file_type); + + + if (save_status != 1) + { + LOG(("Could not save download data")); + //Report_Error + } + else + { + ro_download_window_close(current_drag.data.download.gui); + current_drag.type = draginfo_NONE; + } + } +} + +int ro_save_data(void *data, unsigned long length, char *file_name, bits file_type) +{ + os_error *written = NULL; + + void *end_data = (int)data + length; + + written = xosfile_save_stamped(file_name, file_type, data, end_data); + + if (written != NULL) + { + LOG(("Unable to create stamped file")); + return 0; + } + + return 1; +} + + +/** + * Handle Message_DataOpen (double-click on file in the Filer). + */ + +void ro_msg_dataopen(wimp_message *message) +{ + char *url; + struct browser_window *bw; + + if (message->data.data_xfer.file_type != 0xfaf) + /* ignore all but HTML */ + return; + + /* send DataLoadAck */ + message->action = message_DATA_LOAD_ACK; + message->your_ref = message->my_ref; + wimp_send_message(wimp_USER_MESSAGE, message, message->sender); + + /* create a new window with the file */ + bw = create_browser_window(browser_TITLE | browser_TOOLBAR | + browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); + gui_window_show(bw->window); + url = ro_path_to_url(message->data.data_xfer.file_name); + browser_window_open_location(bw, url); + free(url); +} + + +/** + * Convert a RISC OS pathname to a file: URL. + */ + +char *ro_path_to_url(const char *path) +{ + unsigned int len = 20 + strlen(path); + char *url = xcalloc(len, 1); + strcpy(url, "file://"); + __unixify(path, __RISCOSIFY_NO_REVERSE_SUFFIX, url + 7, len - 7, 0); + return url; +} + + /** * Find screen size in OS units. */ @@ -1476,6 +912,7 @@ void ro_gui_screen_size(int *width, int *height) *height = (ywind_limit + 1) << yeig_factor; } + void ro_gui_open_help_page (void) { struct browser_window *bw; @@ -1543,50 +980,33 @@ void ro_gui_drag_box_start(wimp_pointer *pointer) } -void ro_msg_datasave_ack(wimp_message *message) -{ - int save_status = 0; - - LOG(("ACK Message: filename = %s", message->data.data_xfer.file_name)); - - if (current_drag.type == draginfo_DOWNLOAD_SAVE) - { - assert(current_drag.data.download.gui->data.download.download_status == - download_COMPLETE); - - save_status = ro_save_data(current_drag.data.download.gui->data.download.content->data.other.data, - current_drag.data.download.gui->data.download.content->data.other.length, - message->data.data_xfer.file_name, - current_drag.data.download.gui->data.download.file_type); - - - if (save_status != 1) - { - LOG(("Could not save download data")); - //Report_Error - } - else - { - ro_download_window_close(current_drag.data.download.gui); - current_drag.type = draginfo_NONE; - } - } +int ro_x_units(unsigned long browser_units) +{ + return (browser_units << 1); } -int ro_save_data(void *data, unsigned long length, char *file_name, bits file_type) +int ro_y_units(unsigned long browser_units) { - os_error *written = NULL; + return -(browser_units << 1); +} - void *end_data = (int)data + length; +unsigned long browser_x_units(int ro_units) +{ + return (ro_units >> 1); +} - written = xosfile_save_stamped(file_name, file_type, data, end_data); +unsigned long browser_y_units(int ro_units) +{ + return -(ro_units >> 1); +} - if (written != NULL) - { - LOG(("Unable to create stamped file")); - return 0; - } +int window_x_units(int scr_units, wimp_window_state* win) +{ + return scr_units - (win->visible.x0 - win->xscroll); +} - return 1; +int window_y_units(int scr_units, wimp_window_state* win) +{ + return scr_units - (win->visible.y1 - win->yscroll); } diff --git a/riscos/gui.h b/riscos/gui.h index a88ff0476..967631032 100644 --- a/riscos/gui.h +++ b/riscos/gui.h @@ -25,14 +25,16 @@ extern int current_menu_x, current_menu_y, iconbar_menu_height; extern struct form_control *current_gadget; extern const char *HOME_URL; extern gui_window *window_list; +extern bool gui_reformat_pending; struct gui_window { gui_window_type type; + wimp_w window; + union { struct { - wimp_w window; wimp_w toolbar; int toolbar_width; struct browser_window* bw; @@ -40,7 +42,6 @@ struct gui_window int old_width; } browser; struct { - wimp_w window; struct content *content; bits file_type; char sprite_name[20]; @@ -91,6 +92,7 @@ int window_x_units(int scr_units, wimp_window_state* win); int window_y_units(int scr_units, wimp_window_state* win); void ro_gui_copy_selection(gui_window* g); void ro_gui_open_help_page(void); +void ro_gui_screen_size(int *width, int *height); /* in menus.c */ void ro_gui_menus_init(void); @@ -125,6 +127,17 @@ void ro_gui_401login_init(void); void ro_gui_401login_open(char* host, char * realm, char* fetchurl); void ro_gui_401login_click(wimp_pointer *pointer); +/* in window.c */ +void ro_gui_window_click(gui_window* g, wimp_pointer* mouse); +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_redraw(gui_window* g, wimp_draw* redraw); +void ro_gui_toolbar_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); + /* icon numbers */ #define ICON_CONFIG_SAVE 0 #define ICON_CONFIG_CANCEL 1 diff --git a/riscos/plugin.c b/riscos/plugin.c index e64fc8b21..a91bd1b37 100644 --- a/riscos/plugin.c +++ b/riscos/plugin.c @@ -183,7 +183,7 @@ void plugin_add_instance(struct content *c, struct browser_window *bw, pmo->flags = 0; pmo->reserved = 0; pmo->browser = (plugin_b)params->browser; - pmo->parent_window = bw->window->data.browser.window; + pmo->parent_window = bw->window->window; pmo->bbox = b; xmimemaptranslate_mime_type_to_filetype(c->mime_type, &pmo->file_type); pmo->filename.pointer = params->filename; @@ -421,7 +421,7 @@ void plugin_reshape_instance(struct content *c, struct browser_window *bw, pmr->flags = 0; pmr->plugin = (plugin_p) params->plugin; pmr->browser = (plugin_b) params->browser; - pmr->parent_window = (wimp_w) bw->window->data.browser.window; + pmr->parent_window = (wimp_w) bw->window->window; pmr->bbox = bbox; m.size = 52; diff --git a/riscos/textselection.c b/riscos/textselection.c index e14e230b6..bad404829 100644 --- a/riscos/textselection.c +++ b/riscos/textselection.c @@ -55,7 +55,7 @@ void ro_gui_drag_end(wimp_dragged* drag) int final_x0, final_y0; wimp_window_state state; - state.w = current_drag.data.selection.gui->data.browser.window; + state.w = current_drag.data.selection.gui->window; wimp_get_window_state(&state); final_x0 = browser_x_units(window_x_units(drag->final.x0, &state)); diff --git a/riscos/theme.c b/riscos/theme.c index 2fc91bfcb..34f66fa19 100644 --- a/riscos/theme.c +++ b/riscos/theme.c @@ -13,6 +13,8 @@ #include "netsurf/utils/utils.h" #include +ro_theme* current_theme = NULL; + void ro_theme_preload_template(ro_theme* theme, char* template_name, int* total_winicon, int* total_indirected) { diff --git a/riscos/theme.h b/riscos/theme.h index 54ccf3f58..5372e3ea1 100644 --- a/riscos/theme.h +++ b/riscos/theme.h @@ -63,6 +63,8 @@ struct ro_theme_window typedef struct ro_theme_window ro_theme_window; typedef struct ro_theme ro_theme; +extern ro_theme *current_theme; + typedef enum {theme_TOOLBAR_UNKNOWN, theme_TOOLBAR_BACK, theme_TOOLBAR_FORWARD, theme_TOOLBAR_RELOAD, theme_TOOLBAR_URL, theme_TOOLBAR_STATUS} theme_gadget; diff --git a/riscos/window.c b/riscos/window.c new file mode 100644 index 000000000..5f437c2c1 --- /dev/null +++ b/riscos/window.c @@ -0,0 +1,612 @@ +/* + * 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 2003 Phil Mellor + * Copyright 2003 James Bursa + * Copyright 2003 John M Bell + */ + +#include +#include "oslib/wimp.h" +#include "oslib/wimpspriteop.h" +#include "netsurf/riscos/gui.h" +#include "netsurf/riscos/theme.h" +#include "netsurf/utils/utils.h" + +gui_window *window_list = 0; + +static void gui_disable_icon(wimp_w w, wimp_i i); +static void gui_enable_icon(wimp_w w, wimp_i i); + +gui_window *gui_create_browser_window(struct browser_window *bw) +{ + struct wimp_window window; + + gui_window* g = (gui_window*) xcalloc(1, sizeof(gui_window)); + g->type = GUI_BROWSER_WINDOW; + g->data.browser.bw = bw; + /* create browser and toolbar windows here */ + + window.visible.x0 = 0; + window.visible.y0 = 0; + window.visible.x1 = ro_x_units(bw->format_width); + window.visible.y1 = 2000; + window.xscroll = 0; + window.yscroll = 0; + window.next = wimp_TOP; + window.flags = + wimp_WINDOW_MOVEABLE | wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_BACK_ICON | + wimp_WINDOW_CLOSE_ICON | wimp_WINDOW_TITLE_ICON | wimp_WINDOW_VSCROLL | + wimp_WINDOW_HSCROLL | wimp_WINDOW_SIZE_ICON | wimp_WINDOW_TOGGLE_ICON | + wimp_WINDOW_IGNORE_XEXTENT; + window.title_fg = wimp_COLOUR_BLACK; + window.title_bg = wimp_COLOUR_LIGHT_GREY; + window.work_fg = wimp_COLOUR_LIGHT_GREY; + window.work_bg = wimp_COLOUR_WHITE; + window.scroll_outer = wimp_COLOUR_DARK_GREY; + window.scroll_inner = wimp_COLOUR_MID_LIGHT_GREY; + window.highlight_bg = wimp_COLOUR_CREAM; + window.extra_flags = 0; + window.extent.x0 = 0; + window.extent.y0 = ro_y_units(bw->format_height); + window.extent.x1 = 8192;//ro_x_units(bw->format_width); + if ((bw->flags & browser_TOOLBAR) != 0) + { + window.extent.y1 = ro_theme_toolbar_height(current_theme); + } + else + { + 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; + window.xmin = 100; + window.ymin = window.extent.y1 + 100; + window.title_data.indirected_text.text = g->title; + window.title_data.indirected_text.validation = -1; + window.title_data.indirected_text.size = 255; + window.icon_count = 0; + g->window = wimp_create_window(&window); + + strcpy(g->title, "NetSurf"); + + g->data.browser.toolbar = 0; + if ((bw->flags & browser_TOOLBAR) != 0) + { + ro_theme_window create_toolbar; + + create_toolbar.type = THEME_TOOLBAR; + create_toolbar.data.toolbar.indirected_url = g->url; + create_toolbar.data.toolbar.indirected_status = g->status; + g->data.browser.toolbar = ro_theme_create_window(current_theme, &create_toolbar); + g->data.browser.toolbar_width = -1; + } + + g->redraw_safety = SAFE; + g->data.browser.reformat_pending = false; + g->data.browser.old_width = 0; + + g->next = window_list; + window_list = g; + return g; +} + + +void gui_window_set_title(gui_window* g, char* title) +{ + strncpy(g->title, title, 255); + wimp_force_redraw_title(g->window); +} + + +void gui_window_destroy(gui_window* g) +{ + assert(g != 0); + + if (g == window_list) + window_list = g->next; + else + { + gui_window* gg; + assert(window_list != NULL); + gg = window_list; + while (gg->next != g && gg->next != NULL) + gg = gg->next; + assert(gg->next != NULL); + gg->next = g->next; + } + + xwimp_delete_window(g->window); + if (g->data.browser.toolbar) + xwimp_delete_window(g->data.browser.toolbar); + + xfree(g); +} + +void gui_window_show(gui_window* g) +{ + wimp_window_state state; + if (g == NULL) + return; + state.w = g->window; + wimp_get_window_state(&state); + state.next = wimp_TOP; + ro_gui_window_open(g, (wimp_open*)&state); +} + +void gui_window_redraw(gui_window* g, unsigned long x0, unsigned long y0, + unsigned long x1, unsigned long y1) +{ + if (g == NULL) + return; + + wimp_force_redraw(g->window, + ro_x_units(x0), ro_y_units(y1), ro_x_units(x1), ro_y_units(y0)); +} + +void gui_window_redraw_window(gui_window* g) +{ + wimp_window_info info; + if (g == NULL) + return; + info.w = g->window; + wimp_get_window_info_header_only(&info); + wimp_force_redraw(g->window, info.extent.x0, info.extent.y0, info.extent.x1, info.extent.y1); +} + +gui_safety gui_window_set_redraw_safety(gui_window* g, gui_safety s) +{ + gui_safety old; + + if (g == NULL) + return SAFE; + + old = g->redraw_safety; + g->redraw_safety = s; + + return old; +} + + +void ro_gui_toolbar_redraw(gui_window* g, wimp_draw* redraw) +{ + osbool more; + wimp_icon_state throbber; + + throbber.w = g->data.browser.toolbar; + throbber.i = ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"); + wimp_get_icon_state(&throbber); + + throbber.icon.flags = wimp_ICON_SPRITE; + snprintf(throbber.icon.data.sprite, 12, "throbber%d", g->throbber); + + more = wimp_redraw_window(redraw); + while (more) + { + wimp_plot_icon(&throbber.icon); + more = wimp_get_rectangle(redraw); + } + return; +} + +void ro_gui_window_redraw(gui_window* g, wimp_draw* redraw) +{ + osbool more; + struct content *c = g->data.browser.bw->current_content; + + if (g->redraw_safety == SAFE && g->type == GUI_BROWSER_WINDOW && c != NULL) + { + more = wimp_redraw_window(redraw); + wimp_set_font_colours(wimp_COLOUR_WHITE, wimp_COLOUR_BLACK); + + 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, + redraw->clip.x0, redraw->clip.y0, + redraw->clip.x1 - 1, redraw->clip.y1 - 1); + more = wimp_get_rectangle(redraw); + } + } + else + { + more = wimp_redraw_window(redraw); + while (more) + more = wimp_get_rectangle(redraw); + } +} + +void gui_window_set_scroll(gui_window* g, unsigned long sx, unsigned long sy) +{ + wimp_window_state state; + if (g == NULL) + return; + state.w = g->window; + wimp_get_window_state(&state); + state.xscroll = ro_x_units(sx); + state.yscroll = ro_y_units(sy); + if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) + state.yscroll += ro_theme_toolbar_height(current_theme); + ro_gui_window_open(g, (wimp_open*)&state); +} + +unsigned long gui_window_get_width(gui_window* g) +{ + wimp_window_state state; + state.w = g->window; + wimp_get_window_state(&state); + return browser_x_units(state.visible.x1 - state.visible.x0); +} + +void gui_window_set_extent(gui_window* g, unsigned long width, unsigned long height) +{ + os_box extent; + + if (g == 0) + return; + + extent.x0 = 0; + extent.y0 = ro_y_units(height); + if (extent.y0 > -960) + extent.y0 = -960; + extent.x1 = ro_x_units(width); + if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) + { + extent.y1 = ro_theme_toolbar_height(current_theme); + } + else + { + extent.y1 = 0; + } + wimp_set_extent(g->window, &extent); + +} + +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, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_STATUS"), 0, 0); + } +} + + +void gui_disable_icon(wimp_w w, wimp_i i) +{ + wimp_set_icon_state(w, i, wimp_ICON_SHADED, wimp_ICON_SHADED); +} + +void gui_enable_icon(wimp_w w, wimp_i i) +{ + wimp_set_icon_state(w, i, 0, wimp_ICON_SHADED); +} + +void gui_window_message(gui_window* g, gui_message* msg) +{ + if (g == NULL || msg == NULL) + return; + + switch (msg->type) + { + case msg_SET_URL: + fprintf(stderr, "Set URL '%s'\n", msg->data.set_url.url); + strncpy(g->url, msg->data.set_url.url, 255); + wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_URL"), 0, 0); + if (g->data.browser.bw->history != NULL) + { + if (g->data.browser.bw->history->earlier != NULL) + gui_enable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")); + else + gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")); + if (g->data.browser.bw->history->later != NULL) + gui_enable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")); + else + gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")); + } + else + { + gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")); + gui_disable_icon(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")); + } + break; + default: + break; + } +} + +void ro_gui_window_open(gui_window* g, wimp_open* open) +{ + if (g->type == GUI_BROWSER_WINDOW) + { + wimp_window_state state; + state.w = g->window; + wimp_get_window_state(&state); + if (state.flags & wimp_WINDOW_TOGGLED) { + open->visible.x0 = open->visible.y0 = 0; + ro_gui_screen_size(&open->visible.x1, &open->visible.y1); + } + + if (g->data.browser.bw->current_content != 0) { + int width = open->visible.x1 - open->visible.x0; + if (g->data.browser.old_width != width) { + if (g->data.browser.bw->current_content->width + < browser_x_units(width)) + gui_window_set_extent(g, browser_x_units(width), + g->data.browser.bw->current_content->height); + else + gui_window_set_extent(g, g->data.browser.bw->current_content->width, + g->data.browser.bw->current_content->height); + g->data.browser.old_width = width; + g->data.browser.reformat_pending = true; + gui_reformat_pending = true; + } + } + wimp_open_window(open); + + if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) + { + wimp_outline outline; + wimp_window_state tstate; + + outline.w = g->window; + wimp_get_window_outline(&outline); + + + tstate.w = g->data.browser.toolbar; + tstate.visible.x0 = open->visible.x0; + tstate.visible.x1 = outline.outline.x1 - 2; + tstate.visible.y1 = open->visible.y1; + tstate.visible.y0 = tstate.visible.y1 - ro_theme_toolbar_height(current_theme); + tstate.xscroll = 0; + tstate.yscroll = 0; + tstate.next = wimp_TOP; + + wimp_open_window_nested((wimp_open *) &tstate, 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_BOTTOM_OR_LEFT + << wimp_CHILD_RS_EDGE_SHIFT | + wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT + << wimp_CHILD_TS_EDGE_SHIFT); + + if (tstate.visible.x1 - tstate.visible.x0 != g->data.browser.toolbar_width) + { + g->data.browser.toolbar_width = tstate.visible.x1 - tstate.visible.x0; + ro_theme_resize(current_theme, THEME_TOOLBAR, g->data.browser.toolbar, g->data.browser.toolbar_width, tstate.visible.y1 - tstate.visible.y0); + } + + } + } else { + wimp_open_window(open); + } +} + + +void ro_gui_throb(void) +{ + gui_window* g; + float nowtime = (float) clock() / CLOCKS_PER_SEC; + + for (g = window_list; g != NULL; g = g->next) + { + if (g->type == GUI_BROWSER_WINDOW) + { + if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0) + { + if (g->data.browser.bw->throbbing != 0) + { + if (nowtime > g->throbtime + 0.2) + { + g->throbtime = nowtime; + g->throbber++; + if (g->throbber > current_theme->throbs) + g->throbber = 0; + + wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"), 0, 0); + } + } + } + } + } +} + +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_toolbar_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->data.browser.toolbar == window) + { + return g; + } + } + } + return NULL; +} + +void ro_gui_window_mouse_at(wimp_pointer* pointer) +{ + int x,y; + wimp_window_state state; + gui_window* g; + + g = ro_lookup_gui_from_w(pointer->w); + + if (g == NULL) + return; + + if (g->redraw_safety != SAFE) + { + fprintf(stderr, "mouse at UNSAFE\n"); + return; + } + + state.w = pointer->w; + wimp_get_window_state(&state); + + x = browser_x_units(window_x_units(pointer->pos.x, &state)); + y = browser_y_units(window_y_units(pointer->pos.y, &state)); + + if (g->drag_status == drag_BROWSER_TEXT_SELECTION) + { + struct browser_action msg; + msg.type = act_ALTER_SELECTION; + msg.data.mouse.x = x; + msg.data.mouse.y = y; + browser_window_action(g->data.browser.bw, &msg); + } + + if (g->type == GUI_BROWSER_WINDOW) + { + if (g->data.browser.bw->current_content != NULL) + { + struct browser_action msg; + msg.type = act_MOUSE_AT; + msg.data.mouse.x = x; + msg.data.mouse.y = y; + browser_window_action(g->data.browser.bw, &msg); + } + } +} + +void ro_gui_toolbar_click(gui_window* g, wimp_pointer* pointer) +{ + if (pointer->i == ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_BACK")) + { + browser_window_back(g->data.browser.bw); + } + else if (pointer->i == ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_FORWARD")) + { + browser_window_forward(g->data.browser.bw); + } + else if (pointer->i == ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_RELOAD")) + { + browser_window_open_location_historical(g->data.browser.bw, + g->data.browser.bw->url, 0, 0); + } +} + + +void ro_gui_window_click(gui_window* g, wimp_pointer* pointer) +{ + struct browser_action msg; + int x,y; + wimp_window_state state; + + if (g->redraw_safety != SAFE) + { + fprintf(stderr, "gui_window_click UNSAFE\n"); + return; + } + + state.w = pointer->w; + wimp_get_window_state(&state); + + if (g->type == GUI_BROWSER_WINDOW) + { + x = browser_x_units(window_x_units(pointer->pos.x, &state)); + y = browser_y_units(window_y_units(pointer->pos.y, &state)); + + if (pointer->buttons == wimp_CLICK_MENU) + { + /* check for mouse gestures */ + ro_gui_mouse_action(g); + } + 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) + { + msg.type = act_MOUSE_CLICK; + msg.data.mouse.x = x; + msg.data.mouse.y = y; + msg.data.mouse.buttons = act_BUTTON_NORMAL; + 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_drag.data.selection.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_stop_throbber(gui_window* g) +{ + g->throbber = 0; + wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"), 0, 0); +} + +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); +} -- cgit v1.2.3