summaryrefslogtreecommitdiff
path: root/riscos/gui.c
diff options
context:
space:
mode:
Diffstat (limited to 'riscos/gui.c')
-rw-r--r--riscos/gui.c1450
1 files changed, 435 insertions, 1015 deletions
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 <assert.h>
-#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
+#include <unixlib/local.h>
#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,819 +34,343 @@
#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);
-}
+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);
-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);
-}
+/**
+ * Initialise the gui (RISC OS specific part).
+ */
-int window_y_units(int scr_units, wimp_window_state* win)
+void gui_init(int argc, char** argv)
{
- return scr_units - (win->visible.y1 - win->yscroll);
-}
+ char theme_fname[256];
+ NETSURF_DIR = getenv("NetSurf$Dir");
+ messages_load("<NetSurf$Dir>.Resources.en.Messages");
-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;
- }
+ task_handle = wimp_initialise(wimp_VERSION_RO38, "NetSurf",
+ (wimp_message_list*) &task_messages, 0);
- g->redraw_safety = SAFE;
- g->data.browser.reformat_pending = false;
- g->data.browser.old_width = 0;
+ /* Issue a *Desktop to poke AcornURI into life */
+ if (getenv("NetSurf$Start_URI_Handler"))
+ xwimp_start_task("Desktop", 0);
- g->next = window_list;
- window_list = g;
- return g;
-}
+ if (OPTIONS.theme) {
+ snprintf(theme_fname, sizeof(theme_fname),
+ "<NetSurf$Dir>.Themes.%s", OPTIONS.theme);
+ /* check if theme directory exists */
+ if (!is_dir(theme_fname)) {
+ free(OPTIONS.theme);
+ OPTIONS.theme = strdup("Default");
+ sprintf(theme_fname, "<NetSurf$Dir>.Themes.Default");
+ }
+ } else {
+ OPTIONS.theme = strdup("Default");
+ sprintf(theme_fname, "<NetSurf$Dir>.Themes.Default");
+ }
+ current_theme = ro_theme_create(theme_fname);
-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);
+ wimp_open_template("<NetSurf$Dir>.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 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);
-}
+/**
+ * Create an iconbar icon.
+ */
-void gui_window_show(gui_window* g)
+void ro_gui_icon_bar_create(void)
{
- 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);
+ 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);
}
-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);
-}
+/**
+ * Close down the gui (RISC OS).
+ */
-gui_safety gui_window_set_redraw_safety(gui_window* g, gui_safety s)
+void gui_quit(void)
{
- gui_safety old;
-
- if (g == NULL)
- return SAFE;
-
- old = g->redraw_safety;
- g->redraw_safety = s;
-
- return old;
+ wimp_close_down(task_handle);
}
-
-
-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)
+void gui_poll(bool active)
{
- osbool more;
- struct content *c = g->data.browser.bw->current_content;
+ wimp_event_no event;
+ wimp_block block;
+ gui_window* g;
+ int finished = 0;
- if (g->redraw_safety == SAFE && g->type == GUI_BROWSER_WINDOW && c != NULL)
+ do
{
- more = wimp_redraw_window(redraw);
- wimp_set_font_colours(wimp_COLOUR_WHITE, wimp_COLOUR_BLACK);
-
- while (more)
+ if (ro_gui_poll_queued_blocks == NULL)
{
- 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;
+ const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN;
+ if (active) {
+ event = wimp_poll(mask, &block, 0);
+ } else if (over_window || gui_reformat_pending) {
+ os_t t = os_read_monotonic_time();
+ event = wimp_poll_idle(mask, &block, t + 10, 0);
+ } else {
+ event = wimp_poll(wimp_MASK_NULL | mask, &block, 0);
}
+ finished = 1;
}
- wimp_open_window(open);
-
- if ((g->data.browser.bw->flags & browser_TOOLBAR) != 0)
+ else
{
- 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);
- }
-
+ struct ro_gui_poll_block* next;
+ event = ro_gui_poll_queued_blocks->event;
+ memcpy(&block, ro_gui_poll_queued_blocks->block, sizeof(block));
+ next = ro_gui_poll_queued_blocks->next;
+ xfree(ro_gui_poll_queued_blocks->block);
+ xfree(ro_gui_poll_queued_blocks);
+ ro_gui_poll_queued_blocks = next;
+ finished = 0;
}
- } else {
- wimp_open_window(open);
- }
-}
+ switch (event)
+ {
+ case wimp_NULL_REASON_CODE :
+ ro_gui_throb();
+ if (over_window != NULL
+ || current_drag.type == draginfo_BROWSER_TEXT_SELECTION)
+ {
+ wimp_pointer pointer;
+ wimp_get_pointer_info(&pointer);
+ ro_gui_window_mouse_at(&pointer);
+ }
+ if (gui_reformat_pending) {
+ for (g = window_list; g; g = g->next) {
+ if (g->type == GUI_BROWSER_WINDOW && g->data.browser.reformat_pending) {
+ content_reformat(g->data.browser.bw->current_content,
+ browser_x_units(g->data.browser.old_width), 1000);
+ g->data.browser.reformat_pending = false;
+ }
+ }
+ gui_reformat_pending = false;
+ }
+ break;
-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;
-}
+ 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 != NULL)
+ ro_gui_window_redraw(g, &(block.redraw));
+ else {
+ g = ro_lookup_gui_toolbar_from_w(block.redraw.w);
+ if (g != NULL) {
+ 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;
-/*** 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
+ case wimp_CLOSE_WINDOW_REQUEST :
+ g = ro_lookup_gui_from_w(block.close.w);
+ if (g != NULL)
+ browser_window_destroy(g->data.browser.bw);
+ else
+ ro_gui_dialog_close(&(block.close.w));
+ break;
-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("<NetSurf$Dir>.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 <netsurf$dir> */
- 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 <netsurf$dir> */
- 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, "<NetSurf$Dir>.Themes.%s", OPTIONS.theme);
- }
- /* no -> use default theme */
- else {
- OPTIONS.theme = strdup("Default");
- sprintf(theme_fname, "<NetSurf$Dir>.Themes.Default");
- }
- }
- else {
- sprintf(theme_fname, "<NetSurf$Dir>.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("<NetSurf$Dir>.Resources.Templates");
- ro_gui_dialog_init();
- ro_gui_download_init();
- ro_gui_menus_init();
- ro_gui_401login_init();
- wimp_close_template();
-}
+ case wimp_POINTER_LEAVING_WINDOW :
+ over_window = NULL;
+ break;
-void ro_gui_throb(void)
-{
- gui_window* g;
- float nowtime = (float) clock() / CLOCKS_PER_SEC;
+ case wimp_POINTER_ENTERING_WINDOW :
+ over_window = ro_lookup_gui_from_w(block.entering.w);
+ break;
- 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)
+ case wimp_MOUSE_CLICK :
+ if (block.pointer.w == wimp_ICON_BAR)
+ ro_gui_icon_bar_click(&(block.pointer));
+ else
{
- if (nowtime > g->throbtime + 0.2)
+ g = ro_lookup_gui_from_w(block.pointer.w);
+ if (g != NULL)
+ {
+ ro_gui_window_click(g, &(block.pointer));
+ }
+ else
{
- g->throbtime = nowtime;
- g->throbber++;
- if (g->throbber > current_theme->throbs)
- g->throbber = 0;
+ g = ro_lookup_gui_toolbar_from_w(block.pointer.w);
+ if (g != NULL)
+ {
+ ro_gui_toolbar_click(g, &(block.pointer));
+ }
+ else
+ {
+ g = ro_lookup_download_window_from_w(block.pointer.w);
+ if (g != NULL)
+ {
+ ro_download_window_click(g, &(block.pointer));
+ }
- wimp_set_icon_state(g->data.browser.toolbar, ro_theme_icon(current_theme, THEME_TOOLBAR, "TOOLBAR_THROBBER"), 0, 0);
+ else ro_gui_dialog_click(&(block.pointer));
}
}
- }
- }
- }
-}
-
-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);
+ break;
- x = browser_x_units(window_x_units(pointer->pos.x, &state));
- y = browser_y_units(window_y_units(pointer->pos.y, &state));
+ case wimp_USER_DRAG_BOX :
+ ro_gui_drag_end(&(block.dragged));
+ break;
- 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);
- }
+ case wimp_KEY_PRESSED :
+ ro_gui_keypress(&(block.key));
+ break;
- 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);
- }
- }
-}
+ case wimp_MENU_SELECTION :
+ ro_gui_menu_selection(&(block.selection));
+ break;
-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);
- }
-}
+ case wimp_LOSE_CARET :
+ break;
+ case wimp_GAIN_CARET :
+ break;
+ case wimp_USER_MESSAGE :
+ case wimp_USER_MESSAGE_RECORDED :
+ case wimp_USER_MESSAGE_ACKNOWLEDGE:
-void ro_gui_window_click(gui_window* g, wimp_pointer* pointer)
-{
- struct browser_action msg;
- int x,y;
- wimp_window_state state;
+ fprintf(stderr, "MESSAGE %d (%x) HAS ARRIVED\n", block.message.action, block.message.action);
- if (g->redraw_safety != SAFE)
- {
- fprintf(stderr, "gui_window_click UNSAFE\n");
- return;
- }
+ switch (block.message.action)
+ {
+ case message_DATA_SAVE :
+ ro_msg_datasave(&(block.message));
+ break;
- state.w = pointer->w;
- wimp_get_window_state(&state);
+ case message_DATA_SAVE_ACK :
+ ro_msg_datasave_ack(&(block.message));
+ break;
- 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));
+ case message_DATA_LOAD :
+ ro_msg_dataload(&(block.message));
+ break;
- 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;
+ case message_DATA_OPEN:
+ ro_msg_dataopen(&(block.message));
+ break;
- 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);
+ case message_URI_PROCESS :
+ ro_uri_message_received(&(block.message));
+ break;
- 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;
- }
+ 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;
- 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);
- }
+ case message_QUIT :
+ netsurf_quit = true;
+ break;
}
+ break;
}
- }
-}
-
-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;
+ }
+ } while (finished == 0);
- 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;
}
@@ -859,7 +381,7 @@ void gui_multitask(void)
gui_window* g;
event = wimp_poll(wimp_QUEUE_KEY |
- wimp_MASK_LOSE | wimp_MASK_GAIN | wimp_MASK_POLLWORD, &block, 0);
+ wimp_MASK_LOSE | wimp_MASK_GAIN, &block, 0);
switch (event)
{
@@ -965,6 +487,10 @@ void gui_multitask(void)
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;
@@ -1007,6 +533,51 @@ void gui_multitask(void)
}
+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 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);
+ }
+}
+
void ro_gui_keypress(wimp_key* key)
{
gui_window* g;
@@ -1074,225 +645,6 @@ void ro_gui_keypress(wimp_key* key)
return;
}
-void gui_poll(bool active)
-{
- wimp_event_no event;
- wimp_block block;
- gui_window* g;
- int finished = 0;
-
- do
- {
- if (ro_gui_poll_queued_blocks == NULL)
- {
- const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN;
- if (active) {
- event = wimp_poll(mask, &block, 0);
- } else if (over_window || gui_reformat_pending) {
- os_t t = os_read_monotonic_time();
- event = wimp_poll_idle(mask, &block, t + 10, 0);
- } else {
- event = wimp_poll(wimp_MASK_NULL | mask, &block, 0);
- }
- finished = 1;
- }
- else
- {
- struct ro_gui_poll_block* next;
- event = ro_gui_poll_queued_blocks->event;
- memcpy(&block, ro_gui_poll_queued_blocks->block, sizeof(block));
- next = ro_gui_poll_queued_blocks->next;
- xfree(ro_gui_poll_queued_blocks->block);
- xfree(ro_gui_poll_queued_blocks);
- ro_gui_poll_queued_blocks = next;
- finished = 0;
- }
- switch (event)
- {
- case wimp_NULL_REASON_CODE :
- ro_gui_throb();
- if (over_window != NULL
- || current_drag.type == draginfo_BROWSER_TEXT_SELECTION)
- {
- wimp_pointer pointer;
- wimp_get_pointer_info(&pointer);
- ro_gui_window_mouse_at(&pointer);
- }
- if (gui_reformat_pending) {
- for (g = window_list; g; g = g->next) {
- if (g->type == GUI_BROWSER_WINDOW && g->data.browser.reformat_pending) {
- content_reformat(g->data.browser.bw->current_content,
- browser_x_units(g->data.browser.old_width), 1000);
- g->data.browser.reformat_pending = false;
- }
- }
- gui_reformat_pending = false;
- }
- 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 != NULL)
- ro_gui_window_redraw(g, &(block.redraw));
- else {
- g = ro_lookup_gui_toolbar_from_w(block.redraw.w);
- if (g != NULL) {
- 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 :
- g = ro_lookup_gui_from_w(block.close.w);
- if (g != NULL)
- browser_window_destroy(g->data.browser.bw);
- else
- ro_gui_dialog_close(&(block.close.w));
- break;
-
- case wimp_POINTER_LEAVING_WINDOW :
- over_window = NULL;
- break;
-
- case wimp_POINTER_ENTERING_WINDOW :
- over_window = ro_lookup_gui_from_w(block.entering.w);
- 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)
- {
- ro_gui_window_click(g, &(block.pointer));
- }
- else
- {
- g = ro_lookup_gui_toolbar_from_w(block.pointer.w);
- if (g != NULL)
- {
- ro_gui_toolbar_click(g, &(block.pointer));
- }
- else
- {
- g = ro_lookup_download_window_from_w(block.pointer.w);
- if (g != NULL)
- {
- ro_download_window_click(g, &(block.pointer));
- }
-
- else ro_gui_dialog_click(&(block.pointer));
- }
- }
- break;
-
- case wimp_USER_DRAG_BOX :
- ro_gui_drag_end(&(block.dragged));
- break;
-
- case wimp_KEY_PRESSED :
- ro_gui_keypress(&(block.key));
- break;
-
- case wimp_MENU_SELECTION :
- ro_gui_menu_selection(&(block.selection));
- break;
-
- case wimp_LOSE_CARET :
- break;
- case wimp_GAIN_CARET :
- break;
-
- 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_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_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_gadget_combo(struct browser_window* bw, struct form_control* g, unsigned long mx, unsigned long my)
{
int count = 0;
@@ -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);
}