summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
authorSteve Fryatt <stevef@netsurf-browser.org>2013-09-08 11:55:21 +0100
committerSteve Fryatt <stevef@netsurf-browser.org>2013-09-08 11:55:21 +0100
commita00e0f91c7ccb27108cc396ca8afa3207935de4c (patch)
treedfe47712132b8f26f46fe319f3222b44c5e2e060 /riscos
parente87596ad1f7755c50f7a00edc85e66908ad1ba10 (diff)
downloadnetsurf-a00e0f91c7ccb27108cc396ca8afa3207935de4c.tar.gz
netsurf-a00e0f91c7ccb27108cc396ca8afa3207935de4c.tar.bz2
Move all mouse tracking into ro_mouse module.
Add Pointer Entering Window events to wimp_event module and add handlers to all modules requiring mouse tracking. Updated: Treeview, URL Complete, History and GUI Window. Delete all handling for Pointer Entering/Leaving from ro_gui.
Diffstat (limited to 'riscos')
-rw-r--r--riscos/dialog.c2
-rw-r--r--riscos/gui.c133
-rw-r--r--riscos/gui.h1
-rw-r--r--riscos/history.c38
-rw-r--r--riscos/mouse.c78
-rw-r--r--riscos/mouse.h25
-rw-r--r--riscos/treeview.c21
-rw-r--r--riscos/url_complete.c17
-rw-r--r--riscos/url_complete.h8
-rw-r--r--riscos/wimp_event.c36
-rw-r--r--riscos/wimp_event.h3
-rw-r--r--riscos/window.c34
12 files changed, 257 insertions, 139 deletions
diff --git a/riscos/dialog.c b/riscos/dialog.c
index 0726cb335..7a333e6a4 100644
--- a/riscos/dialog.c
+++ b/riscos/dialog.c
@@ -158,6 +158,8 @@ void ro_gui_dialog_init(void)
dialog_url_complete = ro_gui_dialog_create("url_suggest");
ro_gui_wimp_event_register_mouse_click(dialog_url_complete,
ro_gui_url_complete_click);
+ ro_gui_wimp_event_register_pointer_entering_window(dialog_url_complete,
+ ro_gui_url_complete_entering);
ro_gui_wimp_event_register_redraw_window(dialog_url_complete,
ro_gui_url_complete_redraw);
ro_gui_wimp_event_set_help_prefix(dialog_url_complete, "HelpAutoURL");
diff --git a/riscos/gui.c b/riscos/gui.c
index 11ed3f406..890c5ddc2 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -163,8 +163,6 @@ static const char *task_name = "NetSurf";
/** The pointer is over a window which is tracking mouse movement. */
static bool gui_track = false;
-/** Handle of window which the pointer is over. */
-static wimp_w gui_track_wimp_w;
/** Browser window which the pointer is over, or 0 if none. */
struct gui_window *gui_track_gui_window;
@@ -239,10 +237,7 @@ static void ro_gui_choose_language(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_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_check_resolvers(void);
static void ro_gui_keypress(wimp_key *key);
static void ro_gui_user_message(wimp_event_no event, wimp_message *message);
@@ -1036,7 +1031,7 @@ void gui_poll(bool active)
xhourglass_off();
if (active) {
event = wimp_poll(mask, &block, 0);
- } else if (sched_active || gui_track || browser_reformat_pending ||
+ } else if (sched_active || gui_track || TRUE || browser_reformat_pending ||
bitmap_maintenance) {
os_t t = os_read_monotonic_time();
@@ -1095,7 +1090,8 @@ void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
{
switch (event) {
case wimp_NULL_REASON_CODE:
- ro_gui_null_reason_code();
+ ro_gui_throb();
+ ro_mouse_poll();
break;
case wimp_REDRAW_WINDOW_REQUEST:
@@ -1111,11 +1107,11 @@ void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
break;
case wimp_POINTER_LEAVING_WINDOW:
- ro_gui_pointer_leaving_window(&block->leaving);
+ ro_mouse_pointer_leaving_window(&block->leaving);
break;
case wimp_POINTER_ENTERING_WINDOW:
- ro_gui_pointer_entering_window(&block->entering);
+ ro_gui_wimp_event_pointer_entering_window(&block->entering);
break;
case wimp_MOUSE_CLICK:
@@ -1153,63 +1149,6 @@ void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
/**
- * Handle Null_Reason_Code events.
- */
-
-void ro_gui_null_reason_code(void)
-{
- wimp_pointer pointer;
- os_error *error;
-
- ro_gui_throb();
-
- ro_mouse_poll();
-
- if (!gui_track)
- return;
-
- 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;
- }
-
- switch (gui_current_drag_type) {
-
- /* pointer is allowed to wander outside the initiating window
- for certain drag types */
-
- //case GUI_DRAG_SELECTION:
- case GUI_DRAG_SCROLL:
- //case GUI_DRAG_FRAME:
- assert(gui_track_gui_window);
- ro_gui_window_mouse_at(&pointer, gui_track_gui_window);
- break;
-
-// case GUI_DRAG_SAVE:
-// ro_gui_selection_send_dragging(&pointer);
-// break;
-
- default:
- if (ro_gui_global_history_check_window(gui_track_wimp_w) ||
- ro_gui_hotlist_check_window(gui_track_wimp_w) ||
- ro_gui_cookies_check_window(gui_track_wimp_w))
- ro_treeview_mouse_at(&pointer, NULL);
- if (gui_track_wimp_w == history_window)
- ro_gui_history_mouse_at(&pointer);
- if (gui_track_wimp_w == dialog_url_complete)
- ro_gui_url_complete_mouse_at(&pointer);
- else if (gui_track_gui_window)
- ro_gui_window_mouse_at(&pointer,
- gui_track_gui_window);
- break;
- }
-}
-
-
-/**
* Handle Open_Window_Request events.
*/
@@ -1247,68 +1186,6 @@ void ro_gui_close_window_request(wimp_close *close)
/**
- * Handle Pointer_Leaving_Window events.
- */
-
-void ro_gui_pointer_leaving_window(wimp_leaving *leaving)
-{
- if (gui_track_wimp_w == history_window)
- ro_gui_dialog_close(dialog_tooltip);
-
- LOG(("Leaving window 0x%x", leaving->w));
-
- switch (gui_current_drag_type) {
- case GUI_DRAG_SELECTION:
- case GUI_DRAG_SCROLL:
- case GUI_DRAG_SAVE:
- case GUI_DRAG_FRAME:
- //case GUI_DRAG_TREEVIEW:
- /* ignore Pointer_Leaving_Window event that the Wimp mysteriously
- issues when a Wimp_DragBox drag operation is started */
- break;
-
- default:
- if (gui_track_gui_window)
- gui_window_set_pointer(gui_track_gui_window, GUI_POINTER_DEFAULT);
- gui_track_wimp_w = 0;
- gui_track_gui_window = NULL;
- gui_track = false;
- break;
- }
-}
-
-
-/**
- * Handle Pointer_Entering_Window events.
- */
-
-void ro_gui_pointer_entering_window(wimp_entering *entering)
-{
- LOG(("Entering window 0x%x", entering->w));
-
- switch (gui_current_drag_type) {
- case GUI_DRAG_SELECTION:
- case GUI_DRAG_SCROLL:
- case GUI_DRAG_SAVE:
- case GUI_DRAG_FRAME:
- //case GUI_DRAG_TREEVIEW:
- /* ignore entering new windows/frames */
- break;
- default:
- gui_track_wimp_w = entering->w;
- gui_track_gui_window = ro_gui_window_lookup(entering->w);
- gui_track = gui_track_gui_window ||
- gui_track_wimp_w == history_window ||
- gui_track_wimp_w == dialog_url_complete ||
- ro_gui_hotlist_check_window(gui_track_wimp_w) ||
- ro_gui_global_history_check_window(gui_track_wimp_w) ||
- ro_gui_cookies_check_window(gui_track_wimp_w);
- break;
- }
-}
-
-
-/**
* Handle Key_Pressed events.
*/
diff --git a/riscos/gui.h b/riscos/gui.h
index 8f165c027..ea003cc3a 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -162,7 +162,6 @@ bool ro_gui_alt_pressed(void);
void ro_gui_history_init(void);
void ro_gui_history_open(struct browser_window *bw, struct history *history,
bool pointer);
-void ro_gui_history_mouse_at(wimp_pointer *pointer);
/* in filetype.c */
int ro_content_filetype(struct hlcache_handle *c);
diff --git a/riscos/history.c b/riscos/history.c
index be81e1aa4..a4aedc6b5 100644
--- a/riscos/history.c
+++ b/riscos/history.c
@@ -33,6 +33,7 @@
#include "desktop/browser_private.h"
#include "utils/nsoption.h"
#include "riscos/gui.h"
+#include "riscos/mouse.h"
#include "riscos/wimp.h"
#include "riscos/wimp_event.h"
#include "riscos/wimputils.h"
@@ -51,7 +52,9 @@ wimp_w history_window;
static void ro_gui_history_redraw(wimp_draw *redraw);
static bool ro_gui_history_click(wimp_pointer *pointer);
-
+static void ro_gui_history_pointer_entering(wimp_entering *entering);
+static void ro_gui_history_track_end(wimp_leaving *leaving, void *data);
+static void ro_gui_history_mouse_at(wimp_pointer *pointer, void *data);
/**
@@ -65,6 +68,8 @@ void ro_gui_history_init(void)
ro_gui_history_redraw);
ro_gui_wimp_event_register_mouse_click(history_window,
ro_gui_history_click);
+ ro_gui_wimp_event_register_pointer_entering_window(history_window,
+ ro_gui_history_pointer_entering);
ro_gui_wimp_event_set_help_prefix(history_window, "HelpHistory");
}
@@ -169,10 +174,37 @@ void ro_gui_history_redraw(wimp_draw *redraw)
/**
+ * Handle Pointer Entering Window events the history window.
+ *
+ * \param *entering The Wimp_PointerEnteringWindow block.
+ */
+
+void ro_gui_history_pointer_entering(wimp_entering *entering)
+{
+ ro_mouse_track_start(ro_gui_history_track_end,
+ ro_gui_history_mouse_at, NULL);
+}
+
+
+/**
+ * Handle Pointer Leaving Window events the history window. These arrive as the
+ * termination callback handler from ro_mouse's mouse tracking.
+ *
+ * \param *leaving The Wimp_PointerLeavingWindow block.
+ * \param *data NULL data pointer.
+ */
+
+void ro_gui_history_track_end(wimp_leaving *leaving, void *data)
+{
+ ro_gui_dialog_close(dialog_tooltip);
+}
+
+
+/**
* Handle mouse movements over the history window.
*/
-void ro_gui_history_mouse_at(wimp_pointer *pointer)
+void ro_gui_history_mouse_at(wimp_pointer *pointer, void *data)
{
int x, y;
int width;
@@ -181,6 +213,8 @@ void ro_gui_history_mouse_at(wimp_pointer *pointer)
wimp_icon_state ic;
os_box box = {0, 0, 0, 0};
os_error *error;
+
+ LOG(("Mouse at..."));
/* If the mouse hasn't moved, or if we don't want tooltips, exit */
if ((mouse_x == pointer->pos.x && mouse_y == pointer->pos.y) ||
diff --git a/riscos/mouse.c b/riscos/mouse.c
index 12b4e3e54..73535cae5 100644
--- a/riscos/mouse.c
+++ b/riscos/mouse.c
@@ -27,6 +27,12 @@
* - on Null Polls while the drag is active,
* - when the drag terminates with Event_DragEnd, and
* - when the drag terminates with Escape being pressed.
+ *
+ * 2. Mouse tracking support, allowing clients to track the mouse while it
+ * remains in the current window and specify callbacks to be used
+ *
+ * - on Null Polls while the pointer is in the window, and
+ * - when the pointer leaves the window.
*/
#include "oslib/wimp.h"
@@ -44,6 +50,15 @@ static void (*ro_mouse_drag_track_callback)(wimp_pointer *pointer, void *data)
static void (*ro_mouse_drag_cancel_callback)(void *data) = NULL;
static void *ro_mouse_drag_data = NULL;
+/* Data for the wimp poll handler. */
+
+static void (*ro_mouse_poll_end_callback)(wimp_leaving *leaving, void *data)
+ = NULL;
+static void (*ro_mouse_poll_track_callback)(wimp_pointer *pointer, void *data)
+ = NULL;
+static void *ro_mouse_poll_data = NULL;
+
+
/**
* Process Null polls for any drags and mouse trackers that are currently
* active.
@@ -56,7 +71,8 @@ void ro_mouse_poll(void)
/* If no trackers are active, just exit. */
- if (ro_mouse_drag_track_callback == NULL /* && no trackers */)
+ if (ro_mouse_drag_track_callback == NULL &&
+ ro_mouse_poll_track_callback == NULL)
return;
error = xwimp_get_pointer_info(&pointer);
@@ -71,6 +87,11 @@ void ro_mouse_poll(void)
if (ro_mouse_drag_track_callback != NULL)
ro_mouse_drag_track_callback(&pointer, ro_mouse_drag_data);
+
+ /* Process the window tracker, if one is active. */
+
+ if (ro_mouse_poll_track_callback != NULL)
+ ro_mouse_poll_track_callback(&pointer, ro_mouse_poll_data);
}
@@ -106,8 +127,8 @@ void ro_mouse_drag_start(void (*drag_end)(wimp_dragged *dragged, void *data),
/**
- * Process Wimp_DragEnd events by passing the details on to any registered
- * event handler.
+ * Process Wimp_DragEnd events by terminating an active drag track and passing
+ * the details on to any registered event handler.
*
* \param *dragged The Wimp_DragEnd data block.
*/
@@ -129,3 +150,54 @@ void ro_mouse_drag_end(wimp_dragged *dragged)
ro_mouse_drag_data = NULL;
}
+
+/**
+ * Start tracking the mouse in a window, providing a function to be called on
+ * null polls and optionally one to be called when it leaves the window.
+ *
+ * \param *drag_end Callback for when the pointer leaves the window, or
+ * NULL for none.
+ * \param *drag_track Callback for mouse tracking while the pointer remains
+ * in the window, or NULL for none.
+ * \param *data Data to be passed to the callback functions, or NULL.
+ */
+
+void ro_mouse_track_start(void (*poll_end)(wimp_leaving *leaving, void *data),
+ void (*poll_track)(wimp_pointer *pointer, void *data),
+ void *data)
+{
+ /* It should never be possible for the mouse to be in two windows
+ * at the same time!
+ */
+
+ assert(ro_mouse_poll_end_callback == NULL &&
+ ro_mouse_poll_track_callback == NULL &&
+ ro_mouse_poll_data == NULL);
+
+ ro_mouse_poll_end_callback = poll_end;
+ ro_mouse_poll_track_callback = poll_track;
+ ro_mouse_poll_data = data;
+}
+
+
+/**
+ * Process Wimp_PointerLeaving events by terminating an active mouse track and
+ * passing the details on to any registered event handler.
+ *
+ * \param *leaving The Wimp_PointerLeaving data block.
+ */
+
+void ro_mouse_pointer_leaving_window(wimp_leaving *leaving)
+{
+ if (ro_mouse_poll_end_callback != NULL)
+ ro_mouse_poll_end_callback(leaving, ro_mouse_poll_data);
+
+ /* Poll tracking is a one-shot event, so clear the data ready for
+ * another claimant.
+ */
+
+ ro_mouse_poll_end_callback = NULL;
+ ro_mouse_poll_track_callback = NULL;
+ ro_mouse_poll_data = NULL;
+}
+
diff --git a/riscos/mouse.h b/riscos/mouse.h
index 623c6dfaa..26fb72e5b 100644
--- a/riscos/mouse.h
+++ b/riscos/mouse.h
@@ -65,5 +65,30 @@ void ro_mouse_drag_start(void (*drag_end)(wimp_dragged *dragged, void *data),
void ro_mouse_drag_end(wimp_dragged *dragged);
+
+/**
+ * Start tracking the mouse in a window, providing a function to be called on
+ * null polls and optionally one to be called when it leaves the window.
+ *
+ * \param *drag_end Callback for when the pointer leaves the window, or
+ * NULL for none.
+ * \param *drag_track Callback for mouse tracking while the pointer remains
+ * in the window, or NULL for none.
+ * \param *data Data to be passed to the callback functions, or NULL.
+ */
+
+void ro_mouse_track_start(void (*poll_end)(wimp_leaving *leaving, void *data),
+ void (*poll_track)(wimp_pointer *pointer, void *data),
+ void *data);
+
+/**
+ * Process Wimp_PointerLeaving events by terminating an active mouse track and
+ * passing the details on to any registered event handler.
+ *
+ * \param *leaving The Wimp_PointerLeaving data block.
+ */
+
+void ro_mouse_pointer_leaving_window(wimp_leaving *leaving);
+
#endif
diff --git a/riscos/treeview.c b/riscos/treeview.c
index 4641a6d0a..4756d8c2d 100644
--- a/riscos/treeview.c
+++ b/riscos/treeview.c
@@ -100,6 +100,7 @@ static void ro_treeview_redraw_loop(wimp_draw *redraw, ro_treeview *tv,
osbool more);
static void ro_treeview_open(wimp_open *open);
static bool ro_treeview_mouse_click(wimp_pointer *pointer);
+static void ro_treeview_pointer_entering(wimp_entering *entering);
static void ro_treeview_drag_start(ro_treeview *tv, wimp_pointer *pointer,
wimp_window_state *state);
static void ro_treeview_drag_end(wimp_dragged *drag, void *data);
@@ -191,6 +192,8 @@ ro_treeview *ro_treeview_create(wimp_w window, struct toolbar *toolbar,
ro_gui_wimp_event_register_redraw_window(tv->w, ro_treeview_redraw);
ro_gui_wimp_event_register_scroll_window(tv->w, ro_treeview_scroll);
+ ro_gui_wimp_event_register_pointer_entering_window(tv->w,
+ ro_treeview_pointer_entering);
ro_gui_wimp_event_register_open_window(tv->w, ro_treeview_open);
ro_gui_wimp_event_register_mouse_click(tv->w, ro_treeview_mouse_click);
ro_gui_wimp_event_register_keypress(tv->w, ro_treeview_keypress);
@@ -413,6 +416,7 @@ void ro_treeview_scroll(wimp_scroll *scroll)
}
}
+
/**
* Redraw a treeview window, once the initial readraw block has been collected.
*
@@ -899,6 +903,23 @@ static bool ro_treeview_mouse_click(wimp_pointer *pointer)
/**
+ * Handle Pointer Entering Window events for treeview windows.
+ *
+ * \param *entering The Wimp_PointerEnteringWindow block.
+ */
+
+void ro_treeview_pointer_entering(wimp_entering *entering)
+{
+ ro_treeview *tv;
+
+ tv = (ro_treeview *) ro_gui_wimp_event_get_user_data(entering->w);
+ if (tv == NULL)
+ return;
+
+ ro_mouse_track_start(NULL, ro_treeview_mouse_at, NULL);
+}
+
+/**
* Track the mouse under Null Polls from the wimp, to support dragging.
*
* \param *pointer Pointer to a Wimp Pointer block.
diff --git a/riscos/url_complete.c b/riscos/url_complete.c
index e26cb6556..01774f62f 100644
--- a/riscos/url_complete.c
+++ b/riscos/url_complete.c
@@ -30,6 +30,7 @@
#include "utils/log.h"
#include "riscos/global_history.h"
#include "riscos/gui.h"
+#include "riscos/mouse.h"
#include "utils/nsoption.h"
#include "riscos/toolbar.h"
#include "riscos/url_complete.h"
@@ -61,6 +62,7 @@ static int mouse_y;
static bool url_complete_callback(nsurl *url,
const struct url_data *data);
+static void ro_gui_url_complete_mouse_at(wimp_pointer *pointer, void *data);
/* This is an exported interface documented in url_complete.h */
@@ -624,7 +626,20 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw)
/* This is an exported interface documented in url_complete.h */
-void ro_gui_url_complete_mouse_at(wimp_pointer *pointer)
+void ro_gui_url_complete_entering(wimp_entering *entering)
+{
+ ro_mouse_track_start(NULL, ro_gui_url_complete_mouse_at, NULL);
+}
+
+
+/**
+ * Handle mouse movement over the URL completion window.
+ *
+ * \param *pointer The pointer state
+ * \param *data NULL data pointer expected by mouse tracker
+ */
+
+void ro_gui_url_complete_mouse_at(wimp_pointer *pointer, void *data)
{
wimp_mouse_state current;
diff --git a/riscos/url_complete.h b/riscos/url_complete.h
index 12f640086..6a4660e4a 100644
--- a/riscos/url_complete.h
+++ b/riscos/url_complete.h
@@ -79,12 +79,12 @@ void ro_gui_url_complete_redraw(wimp_draw *redraw);
/**
- * Handle mouse movement over the URL completion window.
+ * Handle the pointer entering the URL completion window.
*
- * \param pointer the pointer state
- */
+ * \param *entering The pointer entering data block.
+ */
-void ro_gui_url_complete_mouse_at(wimp_pointer *pointer);
+void ro_gui_url_complete_entering(wimp_entering *entering);
/**
diff --git a/riscos/wimp_event.c b/riscos/wimp_event.c
index 7dea8ed12..e87962039 100644
--- a/riscos/wimp_event.c
+++ b/riscos/wimp_event.c
@@ -96,6 +96,7 @@ struct event_window {
void (*close_window)(wimp_w w);
void (*redraw_window)(wimp_draw *redraw);
void (*scroll_window)(wimp_scroll *scroll);
+ void (*entering_window)(wimp_entering *entering);
bool (*menu_prepare)(wimp_w w, wimp_i i, wimp_menu *m,
wimp_pointer *p);
bool (*menu_selection)(wimp_w w, wimp_i i, wimp_menu *m,
@@ -1134,6 +1135,24 @@ bool ro_gui_wimp_event_scroll_window(wimp_scroll *scroll)
/**
+ * Handle any pointer entering window requests
+ *
+ * \param entering the pointer entering window request
+ */
+bool ro_gui_wimp_event_pointer_entering_window(wimp_entering *entering)
+{
+ struct event_window *window;
+
+ window = ro_gui_wimp_event_find_window(entering->w);
+ if ((window) && (window->entering_window)) {
+ window->entering_window(entering);
+ return true;
+ }
+ return false;
+}
+
+
+/**
* Process a Menu click in a window, by checking for a registered window
* menu and opening it if one is found.
*
@@ -1491,6 +1510,22 @@ bool ro_gui_wimp_event_register_scroll_window(wimp_w w,
}
/**
+ * Register a function to be called for all pointer entering window requests.
+ */
+
+bool ro_gui_wimp_event_register_pointer_entering_window(wimp_w w,
+ void (*callback)(wimp_entering *entering))
+{
+ struct event_window *window;
+
+ window = ro_gui_wimp_event_get_window(w);
+ if (!window)
+ return false;
+ window->entering_window = callback;
+ return true;
+}
+
+/**
* Register a function to be called before a menu is (re-)opened.
*
* \param *w The window for which events should be returned.
@@ -1788,3 +1823,4 @@ void ro_gui_wimp_event_register_submenu(wimp_w w)
ro_gui_wimp_event_close_window(ro_gui_wimp_event_submenu);
ro_gui_wimp_event_submenu = w;
}
+
diff --git a/riscos/wimp_event.h b/riscos/wimp_event.h
index 650f35c91..0a54ab04d 100644
--- a/riscos/wimp_event.h
+++ b/riscos/wimp_event.h
@@ -61,6 +61,7 @@ bool ro_gui_wimp_event_open_window(wimp_open *open);
bool ro_gui_wimp_event_close_window(wimp_w w);
bool ro_gui_wimp_event_redraw_window(wimp_draw *redraw);
bool ro_gui_wimp_event_scroll_window(wimp_scroll *scroll);
+bool ro_gui_wimp_event_pointer_entering_window(wimp_entering *entering);
bool ro_gui_wimp_event_process_window_menu_click(wimp_pointer *pointer);
bool ro_gui_wimp_event_prepare_menu(wimp_w w, wimp_i i, wimp_menu *menu);
@@ -93,6 +94,8 @@ bool ro_gui_wimp_event_register_redraw_window(wimp_w w,
void (*callback)(wimp_draw *redraw));
bool ro_gui_wimp_event_register_scroll_window(wimp_w w,
void (*callback)(wimp_scroll *scroll));
+bool ro_gui_wimp_event_register_pointer_entering_window(wimp_w w,
+ void (*callback)(wimp_entering *entering));
bool ro_gui_wimp_event_register_menu_prepare(wimp_w w,
bool (*callback)(wimp_w w, wimp_i i, wimp_menu *m,
wimp_pointer *p));
diff --git a/riscos/window.c b/riscos/window.c
index dbe505eb5..f3a6f05ce 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -94,6 +94,8 @@ static void gui_window_set_extent(struct gui_window *g, int width, int height);
static void ro_gui_window_redraw(wimp_draw *redraw);
static void ro_gui_window_scroll(wimp_scroll *scroll);
+static void ro_gui_window_pointer_entering(wimp_entering *entering);
+static void ro_gui_window_track_end(wimp_leaving *leaving, void *data);
static void ro_gui_window_open(wimp_open *open);
static void ro_gui_window_close(wimp_w w);
static bool ro_gui_window_click(wimp_pointer *mouse);
@@ -546,6 +548,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
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_scroll_window(g->window, ro_gui_window_scroll);
+ ro_gui_wimp_event_register_pointer_entering_window(g->window, ro_gui_window_pointer_entering);
ro_gui_wimp_event_register_keypress(g->window, ro_gui_window_keypress);
ro_gui_wimp_event_register_mouse_click(g->window, ro_gui_window_click);
ro_gui_wimp_event_register_menu(g->window, ro_gui_browser_window_menu,
@@ -3134,6 +3137,37 @@ void ro_gui_window_scroll(wimp_scroll *scroll)
}
}
+/**
+ * Process Pointer Entering Window events in a browser window.
+ *
+ * \param *entering The wimp pointer entering event data block.
+ */
+
+static void ro_gui_window_pointer_entering(wimp_entering *entering)
+{
+ struct gui_window *g = ro_gui_window_lookup(entering->w);
+
+ if (g != NULL)
+ ro_mouse_track_start(ro_gui_window_track_end,
+ ro_gui_window_mouse_at, g);
+}
+
+/**
+ * Process Pointer Leaving Window events in a browser window. These arrive via
+ * the termination callback handler from ro_mouse's mouse tracking.
+ *
+ * \param *leaving The wimp pointer leaving event data block.
+ * \param *data The GUI window that the pointer is leaving.
+ */
+
+static void ro_gui_window_track_end(wimp_leaving *leaving, void *data)
+{
+ struct gui_window *g = (struct gui_window *) data;
+
+ if (g != NULL)
+ gui_window_set_pointer(g, GUI_POINTER_DEFAULT);
+}
+
/**
* Scroll a browser window, either via the core or directly using the