summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2003-11-07 23:51:13 +0000
committerJames Bursa <james@netsurf-browser.org>2003-11-07 23:51:13 +0000
commitb055948973d213cbc29bc71a9b90a92240056264 (patch)
treeb62620aab799e3e1fb827ed9b9b2ddc750bea2d3
parente8def12ba268b7b663df024979f399d32d3dae9d (diff)
downloadnetsurf-b055948973d213cbc29bc71a9b90a92240056264.tar.gz
netsurf-b055948973d213cbc29bc71a9b90a92240056264.tar.bz2
[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
-rw-r--r--!NetSurf/!Boot,feb2
-rw-r--r--!NetSurf/!Run,feb6
-rw-r--r--desktop/gui.h1
-rw-r--r--desktop/netsurf.c1
-rw-r--r--makefile2
-rw-r--r--riscos/dialog.c12
-rw-r--r--riscos/download.c22
-rw-r--r--riscos/gui.c1450
-rw-r--r--riscos/gui.h17
-rw-r--r--riscos/plugin.c4
-rw-r--r--riscos/textselection.c2
-rw-r--r--riscos/theme.c2
-rw-r--r--riscos/theme.h2
-rw-r--r--riscos/window.c612
14 files changed, 1091 insertions, 1044 deletions
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 "<Alias$Open_URI_https>" = "" Then Set Alias$Open_URI_https <NetSurf$Dir>.URI
If "<Alias$Open_URI_file>" = "" Then Set Alias$Open_URI_file <NetSurf$Dir>.URILaunch
| Claim URI files
-If "<Alias$@RunType_F91>" = "" Then Set Alias$@RunType_F91 <NetSurf$Dir>.URILaunch
+|If "<Alias$@RunType_F91>" = "" Then Set Alias$@RunType_F91 <NetSurf$Dir>.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 "<InetDBase$Path>" = "" 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 <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);
}
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 <stdio.h>
+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 <monkeyson@users.sourceforge.net>
+ * Copyright 2003 James Bursa <bursa@users.sourceforge.net>
+ * Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk>
+ */
+
+#include <string.h>
+#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);
+}