summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
Diffstat (limited to 'riscos')
-rw-r--r--riscos/401login.c19
-rw-r--r--riscos/configure.c2
-rw-r--r--riscos/dialog.c1
-rw-r--r--riscos/download.c65
-rw-r--r--riscos/gui.c221
-rw-r--r--riscos/gui.h27
-rw-r--r--riscos/query.c186
-rw-r--r--riscos/query.h3
-rw-r--r--riscos/sslcert.c19
-rw-r--r--riscos/theme.c95
-rw-r--r--riscos/theme.h1
-rw-r--r--riscos/window.c135
12 files changed, 335 insertions, 439 deletions
diff --git a/riscos/401login.c b/riscos/401login.c
index 080a99b2f..9eec1c0ba 100644
--- a/riscos/401login.c
+++ b/riscos/401login.c
@@ -26,6 +26,13 @@
#ifdef WITH_AUTH
+#define ICON_401LOGIN_LOGIN 0
+#define ICON_401LOGIN_CANCEL 1
+#define ICON_401LOGIN_HOST 2
+#define ICON_401LOGIN_REALM 3
+#define ICON_401LOGIN_USERNAME 4
+#define ICON_401LOGIN_PASSWORD 5
+
static void ro_gui_401login_close(wimp_w w);
static bool ro_gui_401login_apply(wimp_w w);
static void ro_gui_401login_open(struct browser_window *bw, const char *host,
@@ -157,12 +164,14 @@ void ro_gui_401login_close(wimp_w w)
free(session->url);
free(session);
- ro_gui_wimp_event_finalise(w);
-
+ ro_gui_dialog_close(w);
error = xwimp_delete_window(w);
- if (error)
- LOG(("xwimp_delete_window: 0x%x: %s",
- error->errnum, error->errmess));
+ if (error) {
+ LOG(("xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+ ro_gui_wimp_event_finalise(w);
}
diff --git a/riscos/configure.c b/riscos/configure.c
index 1c72087ff..643576974 100644
--- a/riscos/configure.c
+++ b/riscos/configure.c
@@ -138,7 +138,6 @@ bool ro_gui_configure_click(wimp_pointer *pointer)
ro_gui_wimp_event_register_close_window(
tool->w,
ro_gui_configure_close);
-
} else {
ro_gui_dialog_open_top(tool->w, NULL, 0, 0);
}
@@ -157,6 +156,7 @@ void ro_gui_configure_close(wimp_w w)
tool->open = false;
if (tool->finalise)
tool->finalise(w);
+ ro_gui_dialog_close(w);
break;
}
}
diff --git a/riscos/dialog.c b/riscos/dialog.c
index fdd71ba77..2f83c1496 100644
--- a/riscos/dialog.c
+++ b/riscos/dialog.c
@@ -398,7 +398,6 @@ void ro_gui_dialog_close(wimp_w close)
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
}
- ro_gui_wimp_event_close_window(close);
}
diff --git a/riscos/download.c b/riscos/download.c
index fb4ddc045..d8266c633 100644
--- a/riscos/download.c
+++ b/riscos/download.c
@@ -38,12 +38,19 @@
#include "netsurf/riscos/save.h"
#include "netsurf/riscos/query.h"
#include "netsurf/riscos/wimp.h"
+#include "netsurf/riscos/wimp_event.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/url.h"
#include "netsurf/utils/utf8.h"
#include "netsurf/utils/utils.h"
+#define ICON_DOWNLOAD_ICON 0
+#define ICON_DOWNLOAD_URL 1
+#define ICON_DOWNLOAD_PATH 2
+#define ICON_DOWNLOAD_DESTINATION 3
+#define ICON_DOWNLOAD_PROGRESS 5
+#define ICON_DOWNLOAD_STATUS 6
typedef enum
{
@@ -122,22 +129,25 @@ static bool ro_gui_download_save(struct gui_download_window *dw,
const char *file_name, bool force_overwrite);
static void ro_gui_download_send_dataload(struct gui_download_window *dw);
static void ro_gui_download_window_destroy_wrapper(void *p);
+static bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit);
static void ro_gui_download_close_confirmed(query_id, enum query_response res, void *p);
static void ro_gui_download_close_cancelled(query_id, enum query_response res, void *p);
static void ro_gui_download_overwrite_confirmed(query_id, enum query_response res, void *p);
static void ro_gui_download_overwrite_cancelled(query_id, enum query_response res, void *p);
+static bool ro_gui_download_click(wimp_pointer *pointer);
+static bool ro_gui_download_keypress(wimp_key *key);
+static void ro_gui_download_close(wimp_w w);
+
static const query_callback close_funcs =
{
ro_gui_download_close_confirmed,
- ro_gui_download_close_cancelled,
ro_gui_download_close_cancelled
};
static const query_callback overwrite_funcs =
{
ro_gui_download_overwrite_confirmed,
- ro_gui_download_overwrite_cancelled,
ro_gui_download_overwrite_cancelled
};
@@ -328,6 +338,11 @@ struct gui_download_window *gui_download_window_create(const char *url,
ro_gui_dialog_open(dw->window);
+ ro_gui_wimp_event_set_user_data(dw->window, dw);
+ ro_gui_wimp_event_register_mouse_click(dw->window, ro_gui_download_click);
+ ro_gui_wimp_event_register_keypress(dw->window, ro_gui_download_keypress);
+ ro_gui_wimp_event_register_close_window(dw->window, ro_gui_download_close);
+
/* issue the warning now, so that it appears in front of the download
* window! */
if (space_warning)
@@ -687,36 +702,20 @@ void gui_download_window_done(struct gui_download_window *dw)
/**
- * Convert a RISC OS window handle to a gui_download_window.
- *
- * \param w RISC OS window handle
- * \return pointer to a structure if found, 0 otherwise
- */
-
-struct gui_download_window * ro_gui_download_window_lookup(wimp_w w)
-{
- struct gui_download_window *dw;
- for (dw = download_window_list; dw; dw = dw->next)
- if (dw->window == w)
- return dw;
- return 0;
-}
-
-
-/**
* Handle Mouse_Click events in a download window.
*
* \param dw download window
* \param pointer block returned by Wimp_Poll
*/
-void ro_gui_download_window_click(struct gui_download_window *dw,
- wimp_pointer *pointer)
+bool ro_gui_download_click(wimp_pointer *pointer)
{
+ struct gui_download_window *dw;
char command[256] = "Filer_OpenDir ";
char *dot;
os_error *error;
+ dw = (struct gui_download_window *)ro_gui_wimp_event_get_user_data(pointer->w);
if (pointer->i == ICON_DOWNLOAD_ICON && !dw->error &&
!dw->saved) {
const char *sprite = ro_gui_get_icon_string(pointer->w, pointer->i);
@@ -738,6 +737,7 @@ void ro_gui_download_window_click(struct gui_download_window *dw,
}
}
}
+ return true;
}
@@ -749,8 +749,11 @@ void ro_gui_download_window_click(struct gui_download_window *dw,
* \return true iff key press handled
*/
-bool ro_gui_download_window_keypress(struct gui_download_window *dw, wimp_key *key)
+bool ro_gui_download_keypress(wimp_key *key)
{
+ struct gui_download_window *dw;
+
+ dw = (struct gui_download_window *)ro_gui_wimp_event_get_user_data(key->w);
switch (key->c)
{
case wimp_KEY_ESCAPE:
@@ -1262,11 +1265,23 @@ void ro_gui_download_send_dataload(struct gui_download_window *dw)
/**
+ * Handle closing of download window
+ */
+void ro_gui_download_close(wimp_w w)
+{
+ struct gui_download_window *dw;
+
+ dw = (struct gui_download_window *)ro_gui_wimp_event_get_user_data(w);
+ ro_gui_download_window_destroy(dw, false);
+}
+
+
+/**
* Close a download window and free any related resources.
*
* \param dw download window
* \param quit destroying because we're quitting the whole app
- * \return true iff window destroyed, not waiting for user confirmation
+ * \return true if window destroyed, not waiting for user confirmation
*/
bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
@@ -1320,12 +1335,14 @@ bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit)
dw->next->prev = dw->prev;
/* delete window */
+ ro_gui_dialog_close(dw->window);
error = xwimp_delete_window(dw->window);
if (error) {
LOG(("xwimp_delete_window: 0x%x: %s",
error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
}
+ ro_gui_wimp_event_finalise(dw->window);
/* close download file */
if (dw->file) {
@@ -1447,7 +1464,7 @@ void ro_gui_download_overwrite_confirmed(query_id id, enum query_response res, v
* Respond to PreQuit message, displaying a prompt message if we need
* the user to confirm the shutdown.
*
- * \return true iff we can shutdown straightaway
+ * \return true if we can shutdown straightaway
*/
bool ro_gui_download_prequit(void)
diff --git a/riscos/gui.c b/riscos/gui.c
index 6dfe2657a..019b290fa 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -142,14 +142,8 @@ const char * NETSURF_DIR;
char *default_stylesheet_url;
char *adblock_stylesheet_url;
-#ifndef ncos
static const char *task_name = "NetSurf";
#define CHOICES_PREFIX "<Choices$Write>.WWW.NetSurf."
-#else
-static const char *task_name = "NCNetSurf";
-#define CHOICES_PREFIX "<User$Path>.Choices.NetSurf."
-#endif
-
/** The pointer is over a window which is tracking mouse movement. */
static bool gui_track = false;
@@ -238,17 +232,16 @@ static struct
} screen_info;
static void ro_gui_create_dirs(void);
+static void ro_gui_create_dir(char *path);
static void ro_gui_choose_language(void);
static void ro_gui_icon_bar_create(void);
static void ro_gui_signal(int sig);
static void ro_gui_cleanup(void);
static void ro_gui_handle_event(wimp_event_no event, wimp_block *block);
static void ro_gui_null_reason_code(void);
-static void ro_gui_redraw_window_request(wimp_draw *redraw);
static void ro_gui_close_window_request(wimp_close *close);
static void ro_gui_pointer_leaving_window(wimp_leaving *leaving);
static void ro_gui_pointer_entering_window(wimp_entering *entering);
-static void ro_gui_mouse_click(wimp_pointer *pointer);
static bool ro_gui_icon_bar_click(wimp_pointer *pointer);
static void ro_gui_check_resolvers(void);
static void ro_gui_drag_end(wimp_dragged *drag);
@@ -475,8 +468,8 @@ void gui_init(int argc, char** argv)
*/
void ro_gui_create_dirs(void)
{
- char *path;
char buf[256];
+ char *path;
/* Choices */
path = getenv("NetSurf$ChoicesSave");
@@ -484,58 +477,46 @@ void ro_gui_create_dirs(void)
die("Failed to find NetSurf Choices save path");
snprintf(buf, sizeof(buf), "%s", path);
- path = buf;
-
- /* Given a path x.y.z, this will try to create x, x.y */
- while ((path = strchr(path, '.'))) {
- *path = '\0';
- xosfile_create_dir(buf, 0);
- *path++ = '.';
- }
+ ro_gui_create_dir(buf);
/* URL */
snprintf(buf, sizeof(buf), "%s", option_url_save);
- path = buf;
-
- while ((path = strchr(path, '.'))) {
- *path = '\0';
- xosfile_create_dir(buf, 0);
- *path++ = '.';
- }
+ ro_gui_create_dir(buf);
/* Hotlist */
snprintf(buf, sizeof(buf), "%s", option_hotlist_save);
- path = buf;
-
- while ((path = strchr(path, '.'))) {
- *path = '\0';
- xosfile_create_dir(buf, 0);
- *path++ = '.';
- }
+ ro_gui_create_dir(buf);
/* Recent */
snprintf(buf, sizeof(buf), "%s", option_recent_save);
- path = buf;
-
- while ((path = strchr(path, '.'))) {
- *path = '\0';
- xosfile_create_dir(buf, 0);
- *path++ = '.';
- }
+ ro_gui_create_dir(buf);
/* Theme */
snprintf(buf, sizeof(buf), "%s", option_theme_save);
- path = buf;
-
- while ((path = strchr(path, '.'))) {
- *path = '\0';
- xosfile_create_dir(buf, 0);
- *path++ = '.';
- }
+ ro_gui_create_dir(buf);
/* and the final directory part (as theme_save is a directory) */
xosfile_create_dir(buf, 0);
}
+
+/**
+ * Create directory structure for a path
+ *
+ * Given a path of x.y.z directories x and x.y will be created
+ *
+ * \param path the directory path to create
+ */
+void ro_gui_create_dir(char *path)
+{
+ char *cur = path;
+ while ((cur = strchr(cur, '.'))) {
+ *cur = '\0';
+ xosfile_create_dir(path, 0);
+ *cur++ = '.';
+ }
+}
+
+
/**
* Choose the language to use.
*/
@@ -618,7 +599,6 @@ const char *ro_gui_default_language(void) {
void ro_gui_icon_bar_create(void)
{
-#ifndef ncos
os_error *error;
wimp_icon_create icon = {
@@ -635,7 +615,6 @@ void ro_gui_icon_bar_create(void)
}
ro_gui_wimp_event_register_mouse_click(wimp_ICON_BAR,
ro_gui_icon_bar_click);
-#endif
}
@@ -904,7 +883,7 @@ void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
break;
case wimp_REDRAW_WINDOW_REQUEST:
- ro_gui_redraw_window_request(&block->redraw);
+ ro_gui_wimp_event_redraw_window(&block->redraw);
break;
case wimp_OPEN_WINDOW_REQUEST:
@@ -924,7 +903,7 @@ void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
break;
case wimp_MOUSE_CLICK:
- ro_gui_mouse_click(&block->pointer);
+ ro_gui_wimp_event_mouse_click(&block->pointer);
break;
case wimp_USER_DRAG_BOX:
@@ -1026,49 +1005,22 @@ void ro_gui_null_reason_code(void)
/**
- * Handle Redraw_Window_Request events.
- */
-
-void ro_gui_redraw_window_request(wimp_draw *redraw)
-{
- struct gui_window *g;
-
- if (ro_gui_wimp_event_redraw_window(redraw))
- return;
-
- g = ro_gui_window_lookup(redraw->w);
- if (g)
- ro_gui_window_redraw(g, redraw);
-}
-
-
-/**
* Handle Open_Window_Request events.
*/
void ro_gui_open_window_request(wimp_open *open)
{
- struct gui_window *g;
os_error *error;
if (ro_gui_wimp_event_open_window(open))
return;
- g = ro_gui_window_lookup(open->w);
- if (g) {
- ro_gui_window_open(g, open);
- } else {
- error = xwimp_open_window(open);
- if (error) {
- LOG(("xwimp_open_window: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
- }
-
- g = ro_gui_status_lookup(open->w);
- if (g && g->toolbar)
- ro_gui_theme_resize_toolbar_status(g->toolbar);
+ error = xwimp_open_window(open);
+ if (error) {
+ LOG(("xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return;
}
}
@@ -1079,70 +1031,9 @@ void ro_gui_open_window_request(wimp_open *open)
void ro_gui_close_window_request(wimp_close *close)
{
- struct gui_window *g;
- struct gui_download_window *dw;
- wimp_pointer pointer;
- os_error *error;
- char *temp_name, *r;
- char *filename;
- struct content *content = NULL;
-
- if ((g = ro_gui_window_lookup(close->w)) != NULL) {
- error = xwimp_get_pointer_info(&pointer);
- if (error) {
- LOG(("xwimp_get_pointer_info: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
- }
- if (g->bw)
- content = g->bw->current_content;
- if (pointer.buttons & wimp_CLICK_ADJUST) {
- filename = url_to_path(content->url);
- if (filename) {
- temp_name = malloc(strlen(filename) + 32);
- if (temp_name) {
- sprintf(temp_name, "Filer_OpenDir %s", filename);
- r = temp_name + strlen(temp_name);
- while (r > temp_name) {
- if (*r == '.') {
- *r = '\0';
- break;
- }
- *r--;
- }
- error = xos_cli(temp_name);
- if (error) {
- LOG(("xos_cli: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("MiscError", error->errmess);
- return;
- }
- free(temp_name);
- }
- free(filename);
- } else {
- /* this is pointless if we are about to close the window */
- if (ro_gui_shift_pressed())
- ro_gui_menu_handle_action(close->w, BROWSER_NAVIGATE_UP, true);
- }
- }
- if (ro_gui_shift_pressed())
- return;
- ro_gui_url_complete_close(NULL, 0);
-
- /* search must be closed before the main window so that
- the content still exists */
- ro_gui_dialog_close_persistent(close->w);
- browser_window_destroy(g->bw);
+ if (ro_gui_wimp_event_close_window(close->w))
return;
-
- } else if ((dw = ro_gui_download_window_lookup(close->w)) != NULL) {
- ro_gui_download_window_destroy(dw, false);
- } else {
- ro_gui_dialog_close(close->w);
- }
- ro_gui_dialog_close_persistent(close->w);
+ ro_gui_dialog_close(close->w);
}
@@ -1152,14 +1043,8 @@ void ro_gui_close_window_request(wimp_close *close)
void ro_gui_pointer_leaving_window(wimp_leaving *leaving)
{
- if (gui_track_wimp_w == history_window) {
- os_error *error = xwimp_close_window(dialog_tooltip);
- if (error) {
- LOG(("xwimp_close_window: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
- }
+ if (gui_track_wimp_w == history_window)
+ ro_gui_dialog_close(dialog_tooltip);
switch (gui_current_drag_type) {
case GUI_DRAG_SELECTION:
@@ -1202,24 +1087,6 @@ void ro_gui_pointer_entering_window(wimp_entering *entering)
/**
- * Handle Mouse_Click events.
- */
-
-void ro_gui_mouse_click(wimp_pointer *pointer)
-{
- struct gui_download_window *dw;
- struct gui_query_window *qw;
-
- if (ro_gui_wimp_event_mouse_click(pointer))
- return;
- else if ((dw = ro_gui_download_window_lookup(pointer->w)) != NULL)
- ro_gui_download_window_click(dw, pointer);
- else if ((qw = ro_gui_query_window_lookup(pointer->w)) != NULL)
- ro_gui_query_window_click(qw, pointer);
-}
-
-
-/**
* Handle Mouse_Click events on the iconbar icon.
*/
@@ -1309,19 +1176,9 @@ void ro_gui_drag_end(wimp_dragged *drag)
void ro_gui_keypress(wimp_key *key)
{
- struct gui_download_window *dw;
- struct gui_query_window *qw;
- bool handled = false;
os_error *error;
- if (ro_gui_wimp_event_keypress(key))
- handled = true;
- else if ((qw = ro_gui_query_window_lookup(key->w)) != NULL)
- handled = ro_gui_query_window_keypress(qw, key);
- else if ((dw = ro_gui_download_window_lookup(key->w)) != NULL)
- handled = ro_gui_download_window_keypress(dw, key);
-
- if (!handled) {
+ if (!ro_gui_wimp_event_keypress(key)) {
error = xwimp_process_key(key->c);
if (error) {
LOG(("xwimp_process_key: 0x%x: %s",
diff --git a/riscos/gui.h b/riscos/gui.h
index de4866f3b..b40335f16 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -119,15 +119,9 @@ const char *ro_gui_default_language(void);
/* in download.c */
void ro_gui_download_init(void);
-struct gui_download_window * ro_gui_download_window_lookup(wimp_w w);
-void ro_gui_download_window_click(struct gui_download_window *dw,
- wimp_pointer *pointer);
void ro_gui_download_drag_end(wimp_dragged *drag);
void ro_gui_download_datasave_ack(wimp_message *message);
-bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit);
bool ro_gui_download_prequit(void);
-bool ro_gui_download_window_keypress(struct gui_download_window *dw,
- wimp_key *key);
/* in 401login.c */
#ifdef WITH_AUTH
@@ -144,8 +138,6 @@ void ro_gui_cert_open(struct tree *tree, struct node *node);
void ro_gui_window_quit(void);
void ro_gui_window_update_theme(void);
void ro_gui_window_update_dimensions(struct gui_window *g, int yscroll);
-void ro_gui_window_open(struct gui_window *g, wimp_open *open);
-void ro_gui_window_redraw(struct gui_window *g, wimp_draw *redraw);
void ro_gui_window_mouse_at(struct gui_window *g, wimp_pointer *pointer);
bool ro_gui_toolbar_click(wimp_pointer *pointer);
bool ro_gui_status_click(wimp_pointer *pointer);
@@ -232,20 +224,6 @@ bool ro_gui_theme_install_apply(wimp_w w);
#define ICON_STATUS_RESIZE 0
#define ICON_STATUS_TEXT 1
-#define ICON_DOWNLOAD_ICON 0
-#define ICON_DOWNLOAD_URL 1
-#define ICON_DOWNLOAD_PATH 2
-#define ICON_DOWNLOAD_DESTINATION 3
-#define ICON_DOWNLOAD_PROGRESS 5
-#define ICON_DOWNLOAD_STATUS 6
-
-#define ICON_401LOGIN_LOGIN 0
-#define ICON_401LOGIN_CANCEL 1
-#define ICON_401LOGIN_HOST 2
-#define ICON_401LOGIN_REALM 3
-#define ICON_401LOGIN_USERNAME 4
-#define ICON_401LOGIN_PASSWORD 5
-
#define ICON_ZOOM_VALUE 1
#define ICON_ZOOM_DEC 2
#define ICON_ZOOM_INC 3
@@ -276,11 +254,6 @@ bool ro_gui_theme_install_apply(wimp_w w);
#define ICON_WARNING_CONTINUE 1
#define ICON_WARNING_HELP 2
-#define ICON_QUERY_MESSAGE 0
-#define ICON_QUERY_YES 1
-#define ICON_QUERY_NO 2
-#define ICON_QUERY_HELP 3
-
#define ICON_SEARCH_TEXT 0
#define ICON_SEARCH_CASE_SENSITIVE 1
#define ICON_SEARCH_FIND_NEXT 2
diff --git a/riscos/query.c b/riscos/query.c
index 846a24a01..9320c4c0c 100644
--- a/riscos/query.c
+++ b/riscos/query.c
@@ -11,10 +11,15 @@
#include "netsurf/riscos/dialog.h"
#include "netsurf/riscos/query.h"
#include "netsurf/riscos/wimp.h"
+#include "netsurf/riscos/wimp_event.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/utils.h"
+#define ICON_QUERY_MESSAGE 0
+#define ICON_QUERY_YES 1
+#define ICON_QUERY_NO 2
+#define ICON_QUERY_HELP 3
/** Data for a query window */
struct gui_query_window
@@ -45,9 +50,12 @@ static struct wimp_window *query_template;
static int query_yes_width = 0;
static int query_no_width = 0;
-static void ro_gui_query_window_destroy(struct gui_query_window *qw);
static struct gui_query_window *ro_gui_query_window_lookup_id(query_id id);
+static bool ro_gui_query_click(wimp_pointer *pointer);
+static void ro_gui_query_close(wimp_w w);
+static bool ro_gui_query_apply(wimp_w w);
+
void ro_gui_query_init(void)
{
@@ -56,22 +64,6 @@ void ro_gui_query_init(void)
/**
- * Lookup a query window using its RISC OS window handle
- *
- * \param w RISC OS window handle
- * \return pointer to query window or NULL
- */
-
-struct gui_query_window *ro_gui_query_window_lookup(wimp_w w)
-{
- struct gui_query_window *qw = gui_query_window_list;
- while (qw && qw->window != w)
- qw = qw->next;
- return qw;
-}
-
-
-/**
* Lookup a query window using its ID number
*
* \param id id to search for
@@ -128,10 +120,10 @@ query_id query_user(const char *query, const char *detail,
if (!yes) yes = messages_get("Yes");
if (!no) no = messages_get("No");
- /* set the text of the 'No' button and size accordingly */
- icn = &query_template->icons[ICON_QUERY_NO];
- len = strnlen(no, icn->data.indirected_text.size - 1);
- memcpy(icn->data.indirected_text.text, no, len);
+ /* set the text of the 'Yes' button and size accordingly */
+ icn = &query_template->icons[ICON_QUERY_YES];
+ len = strnlen(yes, icn->data.indirected_text.size - 1);
+ memcpy(icn->data.indirected_text.text, yes, len);
icn->data.indirected_text.text[len] = '\0';
error = xwimptextop_string_width(icn->data.indirected_text.text, len, &width);
@@ -140,20 +132,20 @@ query_id query_user(const char *query, const char *detail,
error->errnum, error->errmess));
width = len * 16;
}
- if (!query_no_width) query_no_width = icn->extent.x1 - icn->extent.x0;
- if (width < query_no_width)
- width = query_no_width;
+ if (!query_yes_width) query_yes_width = icn->extent.x1 - icn->extent.x0;
+ if (width < query_yes_width)
+ width = query_yes_width;
else
width += 44;
icn->extent.x0 = x = icn->extent.x1 - width;
- /* set the text of the 'Yes' button and size accordingly */
- icn = &query_template->icons[ICON_QUERY_YES];
- len = strnlen(yes, icn->data.indirected_text.size - 1);
- memcpy(icn->data.indirected_text.text, yes, len);
+ /* set the text of the 'No' button and size accordingly */
+ icn = &query_template->icons[ICON_QUERY_NO];
+ len = strnlen(no, icn->data.indirected_text.size - 1);
+ memcpy(icn->data.indirected_text.text, no, len);
icn->data.indirected_text.text[len] = '\0';
- if (!query_yes_width) query_yes_width = icn->extent.x1 - icn->extent.x0;
+ if (!query_no_width) query_no_width = icn->extent.x1 - icn->extent.x0;
icn->extent.x1 = x - 16;
error = xwimptextop_string_width(icn->data.indirected_text.text, len, &width);
if (error) {
@@ -161,8 +153,8 @@ query_id query_user(const char *query, const char *detail,
error->errnum, error->errmess));
width = len * 16;
}
- if (width < query_yes_width)
- width = query_yes_width;
+ if (width < query_no_width)
+ width = query_no_width;
else
width += 28;
icn->extent.x0 = icn->extent.x1 - width;
@@ -185,6 +177,12 @@ query_id query_user(const char *query, const char *detail,
ro_gui_dialog_open(qw->window);
+ ro_gui_wimp_event_set_user_data(qw->window, qw);
+ ro_gui_wimp_event_register_mouse_click(qw->window, ro_gui_query_click);
+ ro_gui_wimp_event_register_cancel(qw->window, ICON_QUERY_NO);
+ ro_gui_wimp_event_register_ok(qw->window, ICON_QUERY_YES, ro_gui_query_apply);
+ ro_gui_wimp_event_register_close_window(qw->window, ro_gui_query_close);
+
error = xwimp_set_caret_position(qw->window, (wimp_i)-1, 0, 0, 1 << 25, -1);
if (error) {
LOG(("xwimp_get_caret_position: 0x%x : %s",
@@ -205,34 +203,6 @@ query_id query_user(const char *query, const char *detail,
/**
- * Close and destroy a query window, releasing all resources
- *
- * \param qw query window
- */
-
-void ro_gui_query_window_destroy(struct gui_query_window *qw)
-{
- os_error *error = xwimp_delete_window(qw->window);
- if (error) {
- LOG(("xwimp_delete_window: 0x%x:%s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- }
-
- /* remove from linked-list of query windows and release memory */
- if (qw->prev)
- qw->prev->next = qw->next;
- else
- gui_query_window_list = qw->next;
-
- if (qw->next)
- qw->next->prev = qw->prev;
-
- free(qw);
-}
-
-
-/**
* Close a query window without waiting for a response from the user.
* (should normally only be called if the user has responded in some other
* way of which the query window in unaware.)
@@ -243,7 +213,10 @@ void ro_gui_query_window_destroy(struct gui_query_window *qw)
void query_close(query_id id)
{
struct gui_query_window *qw = ro_gui_query_window_lookup_id(id);
- if (qw) ro_gui_query_window_destroy(qw);
+ if (!qw)
+ return;
+ ro_gui_query_close(qw->window);
+
}
@@ -266,59 +239,68 @@ void ro_gui_query_window_bring_to_front(query_id id)
/**
- * Handle mouse clicks in a query window.
- *
- * \param qw query window
- * \param key key press info from the Wimp
+ * Handle closing of query dialog
*/
-
-void ro_gui_query_window_click(struct gui_query_window *qw, wimp_pointer *pointer)
+void ro_gui_query_close(wimp_w w)
{
- const query_callback *cb = qw->cb;
- switch (pointer->i) {
- case ICON_QUERY_YES:
- cb->confirm(qw->id, QUERY_YES, qw->pw);
- ro_gui_query_window_destroy(qw);
- break;
+ struct gui_query_window *qw;
+ os_error *error;
- case ICON_QUERY_NO:
- cb->cancel(qw->id, QUERY_NO, qw->pw);
- ro_gui_query_window_destroy(qw);
- break;
+ qw = (struct gui_query_window *)ro_gui_wimp_event_get_user_data(w);
- case ICON_QUERY_HELP:
- /* \todo */
- break;
+ ro_gui_dialog_close(w);
+ error = xwimp_delete_window(qw->window);
+ if (error) {
+ LOG(("xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
}
+ ro_gui_wimp_event_finalise(w);
+
+ /* remove from linked-list of query windows and release memory */
+ if (qw->prev)
+ qw->prev->next = qw->next;
+ else
+ gui_query_window_list = qw->next;
+
+ if (qw->next)
+ qw->next->prev = qw->prev;
+ free(qw);
}
/**
- * Handle keypresses in a query window.
- *
- * \param qw query window
- * \param pointer mouse pointer state from Wimp.
- * \return true iff the key press is the key press has been handled
+ * Handle acceptance of query dialog
*/
+bool ro_gui_query_apply(wimp_w w)
+{
+ struct gui_query_window *qw;
+ const query_callback *cb;
+
+ qw = (struct gui_query_window *)ro_gui_wimp_event_get_user_data(w);
+ cb = qw->cb;
+ cb->confirm(qw->id, QUERY_YES, qw->pw);
+ return true;
+}
-bool ro_gui_query_window_keypress(struct gui_query_window *qw, wimp_key *key)
+
+/**
+ * Handle clicks in query dialog
+ */
+bool ro_gui_query_click(wimp_pointer *pointer)
{
- const query_callback *cb = qw->cb;
- switch (key->c) {
-
- case wimp_KEY_ESCAPE:
- cb->escape(qw->id, QUERY_ESCAPE, qw->pw);
- ro_gui_query_window_destroy(qw);
- return true;
-
- case wimp_KEY_RETURN:
- if (qw->default_confirm)
- cb->confirm(qw->id, QUERY_YES, qw->pw);
- else
- cb->cancel(qw->id, QUERY_NO, qw->pw);
- ro_gui_query_window_destroy(qw);
- return true;
- }
+ struct gui_query_window *qw;
+ const query_callback *cb;
+
+ qw = (struct gui_query_window *)ro_gui_wimp_event_get_user_data(pointer->w);
+ cb = qw->cb;
- return true;
+ switch (pointer->i) {
+ case ICON_QUERY_NO:
+ cb->cancel(qw->id, QUERY_NO, qw->pw);
+ break;
+ default:
+ return false;
+ }
+ return false;
}
diff --git a/riscos/query.h b/riscos/query.h
index 9ccebc7e2..6a4030588 100644
--- a/riscos/query.h
+++ b/riscos/query.h
@@ -14,9 +14,6 @@
struct gui_query_window;
void ro_gui_query_init(void);
-struct gui_query_window *ro_gui_query_window_lookup(wimp_w w);
void ro_gui_query_window_bring_to_front(query_id id);
-void ro_gui_query_window_click(struct gui_query_window *qw, wimp_pointer *pointer);
-bool ro_gui_query_window_keypress(struct gui_query_window *qw, wimp_key *key);
#endif
diff --git a/riscos/sslcert.c b/riscos/sslcert.c
index 43acec8b7..449f45b7d 100644
--- a/riscos/sslcert.c
+++ b/riscos/sslcert.c
@@ -373,6 +373,7 @@ void ro_gui_cert_open(struct tree *tree, struct node *node)
void ro_gui_cert_close(wimp_w w)
{
struct session_data *data;
+ os_error *error;
unsigned long i;
data = (struct session_data *)ro_gui_wimp_event_get_user_data(w);
@@ -390,12 +391,24 @@ void ro_gui_cert_close(wimp_w w)
if (data->tree) {
tree_delete_node(data->tree, data->tree->root, false);
- xwimp_delete_window((wimp_w)data->tree->handle);
+ ro_gui_dialog_close((wimp_w)data->tree->handle);
+ error = xwimp_delete_window((wimp_w)data->tree->handle);
+ if (error) {
+ LOG(("xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+ ro_gui_wimp_event_finalise((wimp_w)data->tree->handle);
free(data->tree);
}
- xwimp_delete_window(w);
- ro_gui_wimp_event_finalise(w);
+ ro_gui_dialog_close(w);
+ error = xwimp_delete_window(w);
+ if (error) {
+ LOG(("xwimp_delete_window: 0x%x:%s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
}
diff --git a/riscos/theme.c b/riscos/theme.c
index f78337319..53aee65e9 100644
--- a/riscos/theme.c
+++ b/riscos/theme.c
@@ -78,6 +78,7 @@ static void ro_gui_theme_add_toolbar_icons(struct toolbar *toolbar,
const char* icons[], const char* ident);
static void ro_gui_theme_set_help_prefix(struct toolbar *toolbar);
+static void ro_gui_theme_status_open(wimp_open *open);
/* A basic window for the toolbar and status
*/
@@ -1119,8 +1120,11 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor,
warn_user("WimpError", error->errmess);
return false;
}
+ ro_gui_wimp_event_set_user_data(toolbar->status_handle, toolbar);
ro_gui_wimp_event_register_mouse_click(toolbar->status_handle,
ro_gui_status_click);
+ ro_gui_wimp_event_register_open_window(toolbar->status_handle,
+ ro_gui_theme_status_open);
ro_gui_wimp_event_set_help_prefix(toolbar->status_handle, "HelpStatus");
/* Create the status resize icon
@@ -1298,55 +1302,6 @@ bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent) {
/**
- * Updates the toolbars status bar settings to reflect the current size
- *
- * \param toolbar the toolbar to update
- */
-void ro_gui_theme_resize_toolbar_status(struct toolbar *toolbar) {
- os_error *error;
- wimp_outline outline;
- wimp_window_state state;
- wimp_w parent = NULL;
- int parent_size, status_size;
- if ((!toolbar) || (!toolbar->parent_handle)) return;
-
- /* Get the width to scale to
- */
- parent = toolbar->parent_handle;
- outline.w = toolbar->parent_handle;
- error = xwimp_get_window_outline(&outline);
- if (error) {
- LOG(("xwimp_get_window_outline: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
- }
- parent_size = outline.outline.x1 - outline.outline.x0 -
- ro_get_vscroll_width(parent) - 2;
-
- /* Get the current size
- */
- state.w = toolbar->status_handle;
- error = xwimp_get_window_state(&state);
- if (error) {
- LOG(("xwimp_get_window_state: 0x%x: %s",
- error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
- }
- status_size = state.visible.x1 - state.visible.x0;
- if (status_size <= 12)
- status_size = 0;
-
- /* Store the new size
- */
- toolbar->status_width = (10000 * status_size) / parent_size;
- if (toolbar->status_width > 10000) toolbar->status_width = 10000;
- ro_gui_theme_process_toolbar(toolbar, -1);
-}
-
-
-/**
* Updates the toolbar to reflect changes to the icon flags and any reformatting
* required due to the change in parent window size.
*
@@ -1375,7 +1330,7 @@ bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width) {
int xeig, yeig;
os_coord pixel = {1, 1};
int top, bottom, right;
- bool parent_hscroll;
+ bool parent_hscroll = false;
/* calculate 1px in OS units */
ro_convert_pixels_to_os_units(&pixel, (os_mode)-1);
@@ -2431,3 +2386,43 @@ void ro_gui_theme_set_help_prefix(struct toolbar *toolbar) {
break;
}
}
+
+void ro_gui_theme_status_open(wimp_open *open) {
+ struct toolbar *toolbar = (struct toolbar *)ro_gui_wimp_event_get_user_data(open->w);
+ os_error *error;
+ wimp_outline outline;
+ wimp_w parent = NULL;
+ int parent_size, status_size;
+
+ /* update the window size */
+ error = xwimp_open_window(open);
+ if (error) {
+ LOG(("xwimp_open_window: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ }
+
+ /* get the width to scale to */
+ parent = toolbar->parent_handle;
+ outline.w = toolbar->parent_handle;
+ error = xwimp_get_window_outline(&outline);
+ if (error) {
+ LOG(("xwimp_get_window_outline: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return;
+ }
+ parent_size = outline.outline.x1 - outline.outline.x0 -
+ ro_get_vscroll_width(parent) - 2;
+
+ /* get the current size */
+ status_size = open->visible.x1 - open->visible.x0;
+ if (status_size <= 12)
+ status_size = 0;
+
+ /* Store the new size
+ */
+ toolbar->status_width = (10000 * status_size) / parent_size;
+ if (toolbar->status_width > 10000) toolbar->status_width = 10000;
+ ro_gui_theme_process_toolbar(toolbar, -1);
+}
diff --git a/riscos/theme.h b/riscos/theme.h
index 7b7d209b7..687430c5d 100644
--- a/riscos/theme.h
+++ b/riscos/theme.h
@@ -154,7 +154,6 @@ void ro_gui_theme_close(struct theme_descriptor *descriptor, bool list);
struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor, toolbar_type type);
bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor, struct toolbar *toolbar);
bool ro_gui_theme_attach_toolbar(struct toolbar *toolbar, wimp_w parent);
-void ro_gui_theme_resize_toolbar_status(struct toolbar *toolbar);
bool ro_gui_theme_process_toolbar(struct toolbar *toolbar, int width);
void ro_gui_theme_destroy_toolbar(struct toolbar *toolbar);
diff --git a/riscos/window.c b/riscos/window.c
index 1b7a3b316..ccc29ad55 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -79,6 +79,9 @@ static float scale_snap_to[] = {0.10, 0.125, 0.25, 0.333, 0.5, 0.75,
1.5, 2.0, 3.0, 4.0, 6.0, 8.0, 12.0, 16.0};
#define SCALE_SNAP_TO_SIZE (sizeof scale_snap_to) / (sizeof(float))
+static void ro_gui_window_open(wimp_open *open);
+static void ro_gui_window_close(wimp_w w);
+static void ro_gui_window_redraw(wimp_draw *redraw);
static bool ro_gui_window_click(wimp_pointer *mouse);
static bool ro_gui_window_keypress(wimp_key *key);
static void ro_gui_window_launch_url(struct gui_window *g, const char *url);
@@ -137,10 +140,9 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->throbtime = 0;
g->iconise_icon = -1;
- /* Set the window position
- */
+ /* Set the window position */
if (bw->parent) {
- /* fill the parent window until it's reformatted */
+ /* Open as a small window until we are reformatted */
state.w = clone->window->window;
error = xwimp_get_window_state(&state);
if (error) {
@@ -169,8 +171,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
} else {
ro_gui_screen_size(&screen_width, &screen_height);
- /* Check if we have a preferred position
- */
+ /* Check if we have a preferred position */
if ((option_window_screen_width != 0) &&
(option_window_screen_height != 0)) {
win_width = (option_window_width * screen_width) /
@@ -193,7 +194,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
} else {
/* Base how we define the window height/width
- on the compile time options set */
+ on the compile time options set */
win_width = screen_width * 3 / 4;
if (1600 < win_width)
win_width = 1600;
@@ -207,13 +208,10 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
window.visible.y1 = window.visible.y0 + win_height;
}
- /* Set the general window characteristics
- */
+ /* General flags for a non-movable, non-resizable, no-title bar window */
window.xscroll = 0;
window.yscroll = 0;
window.next = wimp_TOP;
-
- /* General flags for a non-movable, non-resizable, no-title bar window */
window.flags = wimp_WINDOW_MOVEABLE |
wimp_WINDOW_NEW_FORMAT |
wimp_WINDOW_VSCROLL |
@@ -293,6 +291,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
return 0;
}
+ /* Link into window list */
g->prev = 0;
g->next = window_list;
if (window_list)
@@ -300,8 +299,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
window_list = g;
window_count++;
- /* Add in a toolbar
- */
+ /* Add in a toolbar */
if (bw->browser_window_type == BROWSER_WINDOW_NORMAL) {
g->toolbar = ro_gui_theme_create_toolbar(NULL, THEME_BROWSER_TOOLBAR);
ro_gui_theme_attach_toolbar(g->toolbar, g->window);
@@ -309,14 +307,23 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
g->toolbar = NULL;
}
- /* Set the window options
- */
+ /* Set the window options */
bw->window = g;
ro_gui_window_clone_options(bw, clone);
ro_gui_prepare_navigate(g);
- /* Open the window
- */
+ /* Register event handlers */
+ ro_gui_wimp_event_set_user_data(g->window, g);
+ ro_gui_wimp_event_register_open_window(g->window, ro_gui_window_open);
+ ro_gui_wimp_event_register_close_window(g->window, ro_gui_window_close);
+ ro_gui_wimp_event_register_redraw_window(g->window, ro_gui_window_redraw);
+ ro_gui_wimp_event_register_keypress(g->window, ro_gui_window_keypress);
+ if (g->toolbar)
+ ro_gui_wimp_event_register_keypress(g->toolbar->toolbar_handle,
+ ro_gui_window_keypress);
+ ro_gui_wimp_event_register_mouse_click(g->window, ro_gui_window_click);
+
+ /* Open the window at the top of the stack */
state.w = g->window;
error = xwimp_get_window_state(&state);
if (error) {
@@ -325,9 +332,6 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
warn_user("WimpError", error->errmess);
return g;
}
-
- /* Open the window at the top/back of the stack
- */
state.next = wimp_TOP;
if (bw->parent) {
top = browser_window_owner(bw);
@@ -337,18 +341,9 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
wimp_CHILD_LINKS_PARENT_WORK_AREA
<< wimp_CHILD_YORIGIN_SHIFT);
}
- ro_gui_window_open(g, (wimp_open*)&state);
-
- /* Register event handlers */
- ro_gui_wimp_event_register_keypress(g->window,
- ro_gui_window_keypress);
- if (g->toolbar)
- ro_gui_wimp_event_register_keypress(g->toolbar->toolbar_handle,
- ro_gui_window_keypress);
- ro_gui_wimp_event_register_mouse_click(g->window,
- ro_gui_window_click);
+ ro_gui_window_open((wimp_open*)&state);
- /* Claim the caret position for top-level windows */
+ /* Claim the caret for top-level windows */
if (bw->browser_window_type == BROWSER_WINDOW_NORMAL) {
if (g->toolbar && g->toolbar->display_url) {
error = xwimp_set_caret_position(
@@ -550,10 +545,11 @@ void gui_window_redraw_window(struct gui_window *g)
* Handle a Redraw_Window_Request for a browser window.
*/
-void ro_gui_window_redraw(struct gui_window *g, wimp_draw *redraw)
+void ro_gui_window_redraw(wimp_draw *redraw)
{
osbool more;
bool knockout = true;
+ struct gui_window *g = (struct gui_window *)ro_gui_wimp_event_get_user_data(redraw->w);
float scale = g->option.scale;
struct content *c = g->bw->current_content;
int clip_x0, clip_y0, clip_x1, clip_y1, clear_x1, clear_y1;
@@ -889,7 +885,7 @@ void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
state.yscroll = -sy * 2 * g->option.scale;
if (g->toolbar)
state.yscroll += ro_gui_theme_toolbar_full_height(g->toolbar);
- ro_gui_window_open(g, (wimp_open *) &state);
+ ro_gui_window_open((wimp_open *) &state);
}
@@ -960,7 +956,6 @@ void gui_window_scroll_visible(struct gui_window *g, int x0, int y0, int x1, int
cx0 -= padding_available;
}
padding_available = (height - y1 + y0) / 2;
- LOG(("Padding available: %i", padding_available));
if (padding_available > 0) {
if (padding_available > SCROLL_VISIBLE_PADDING)
padding_available = SCROLL_VISIBLE_PADDING;
@@ -974,7 +969,7 @@ void gui_window_scroll_visible(struct gui_window *g, int x0, int y0, int x1, int
state.xscroll = cx0;
state.yscroll = -cy0 + toolbar_height;
- ro_gui_window_open(g, (wimp_open *)&state);
+ ro_gui_window_open((wimp_open *)&state);
}
@@ -1065,7 +1060,7 @@ void gui_window_position_frame(struct gui_window *g, int x0, int y0, int x1, int
state.visible.y0 = py1 - y1;
state.visible.x1 = px0 + x1;
state.visible.y1 = py1 - y0 * 2;
- ro_gui_window_open(g, (wimp_open *)&state);
+ ro_gui_window_open((wimp_open *)&state);
}
@@ -1187,7 +1182,7 @@ void ro_gui_window_update_dimensions(struct gui_window *g, int yscroll) {
/* only allow a further reformat if we've gained/lost scrollbars */
flags = state.flags & (wimp_WINDOW_HSCROLL | wimp_WINDOW_VSCROLL);
update = g->reformat_pending;
- ro_gui_window_open(g, (wimp_open *)&state);
+ ro_gui_window_open((wimp_open *)&state);
state.w = g->window;
error = xwimp_get_window_state(&state);
@@ -1347,12 +1342,14 @@ void ro_gui_window_update_theme(void) {
}
}
+
/**
* Open a window using the given wimp_open, handling toolbars and resizing.
*/
-void ro_gui_window_open(struct gui_window *g, wimp_open *open)
+void ro_gui_window_open(wimp_open *open)
{
+ struct gui_window *g = (struct gui_window *)ro_gui_wimp_event_get_user_data(open->w);
int width = open->visible.x1 - open->visible.x0;
int height = open->visible.y1 - open->visible.y0;
int toolbar_height = 0;
@@ -1526,6 +1523,66 @@ void ro_gui_window_open(struct gui_window *g, wimp_open *open)
/**
+ * Handle wimp closing event
+ */
+void ro_gui_window_close(wimp_w w) {
+ struct gui_window *g = (struct gui_window *)ro_gui_wimp_event_get_user_data(w);
+ wimp_pointer pointer;
+ os_error *error;
+ char *temp_name, *r;
+ char *filename;
+ struct content *content = NULL;
+
+ error = xwimp_get_pointer_info(&pointer);
+ if (error) {
+ LOG(("xwimp_get_pointer_info: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("WimpError", error->errmess);
+ return;
+ }
+ if (g->bw)
+ content = g->bw->current_content;
+ if (pointer.buttons & wimp_CLICK_ADJUST) {
+ filename = url_to_path(content->url);
+ if (filename) {
+ temp_name = malloc(strlen(filename) + 32);
+ if (temp_name) {
+ sprintf(temp_name, "Filer_OpenDir %s", filename);
+ r = temp_name + strlen(temp_name);
+ while (r > temp_name) {
+ if (*r == '.') {
+ *r = '\0';
+ break;
+ }
+ *r--;
+ }
+ error = xos_cli(temp_name);
+ if (error) {
+ LOG(("xos_cli: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("MiscError", error->errmess);
+ return;
+ }
+ free(temp_name);
+ }
+ free(filename);
+ } else {
+ /* this is pointless if we are about to close the window */
+ if (ro_gui_shift_pressed())
+ ro_gui_menu_handle_action(w, BROWSER_NAVIGATE_UP, true);
+ }
+ }
+ if (ro_gui_shift_pressed())
+ return;
+ ro_gui_url_complete_close(NULL, 0);
+ ro_gui_dialog_close_persistent(w);
+ browser_window_destroy(g->bw);
+ return;
+
+}
+
+
+/**
* Animate the "throbbers" of all browser windows.
*/
@@ -1857,9 +1914,7 @@ bool ro_gui_window_click(wimp_pointer *pointer)
os_error *error;
int x, y;
- g = ro_gui_window_lookup(pointer->w);
- if (!g)
- return false;
+ g = (struct gui_window *)ro_gui_wimp_event_get_user_data(pointer->w);
/* try to close url-completion */
ro_gui_url_complete_close(g, pointer->i);