summaryrefslogtreecommitdiff
path: root/riscos/gui.c
diff options
context:
space:
mode:
authorAdrian Lees <adrian@aemulor.com>2005-04-15 05:54:44 +0000
committerAdrian Lees <adrian@aemulor.com>2005-04-15 05:54:44 +0000
commit89993a5bf2e2a326af47cf5c34c75d7f39ae34a3 (patch)
tree30e1418e677aa7b1eb53cb94d02dd441531e22e6 /riscos/gui.c
parentedfcfad31d9626faaa7d5f212435e27a31dcad7a (diff)
downloadnetsurf-89993a5bf2e2a326af47cf5c34c75d7f39ae34a3.tar.gz
netsurf-89993a5bf2e2a326af47cf5c34c75d7f39ae34a3.tar.bz2
[project @ 2005-04-15 05:54:44 by adrianl]
Text selection, page drag scrolling, drag-saving images and a few SaveAs improvements svn path=/import/netsurf/; revision=1640
Diffstat (limited to 'riscos/gui.c')
-rw-r--r--riscos/gui.c97
1 files changed, 75 insertions, 22 deletions
diff --git a/riscos/gui.c b/riscos/gui.c
index 881443277..59589040f 100644
--- a/riscos/gui.c
+++ b/riscos/gui.c
@@ -133,7 +133,7 @@ static clock_t gui_last_poll; /**< Time of last wimp_poll. */
osspriteop_area *gui_sprites; /**< Sprite area containing pointer and hotlist sprites */
/** Accepted wimp user messages. */
-static wimp_MESSAGE_LIST(34) task_messages = { {
+static wimp_MESSAGE_LIST(36) task_messages = { {
message_HELP_REQUEST,
message_DATA_SAVE,
message_DATA_SAVE_ACK,
@@ -143,6 +143,8 @@ static wimp_MESSAGE_LIST(34) task_messages = { {
message_MENU_WARNING,
message_MENUS_DELETED,
message_MODE_CHANGE,
+ message_CLAIM_ENTITY,
+ message_DATA_REQUEST,
#ifdef WITH_URI
message_URI_PROCESS,
message_URI_RETURN_RESULT,
@@ -635,16 +637,27 @@ void gui_poll(bool active)
xhourglass_off();
if (active) {
event = wimp_poll(mask, &block, 0);
- } else if (sched_active && (gui_track || gui_reformat_pending)) {
- os_t t = os_read_monotonic_time() + 10;
- if (sched_time < t)
+ } else if (sched_active || gui_track || gui_reformat_pending) {
+ os_t t = os_read_monotonic_time();
+
+ if (gui_track)
+ switch (gui_current_drag_type) {
+ case GUI_DRAG_SELECTION:
+ case GUI_DRAG_SCROLL:
+ t += 4; /* for smoother update */
+ break;
+
+ default:
+ t += 10;
+ break;
+ }
+ else
+ t += 10;
+
+ if (sched_active && (sched_time - t) < 0)
t = sched_time;
+
event = wimp_poll_idle(mask, &block, t, 0);
- } else if (sched_active) {
- event = wimp_poll_idle(mask, &block, sched_time, 0);
- } else if (gui_track || 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);
}
@@ -814,17 +827,31 @@ void ro_gui_null_reason_code(void)
error = xwimp_get_pointer_info(&pointer);
if (error) {
LOG(("xwimp_get_pointer_info: 0x%x: %s",
- error->errnum, error->errmess));
+ error->errnum, error->errmess));
warn_user("WimpError", error->errmess);
return;
}
- 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, false);
- else if (gui_track_gui_window)
- ro_gui_window_mouse_at(gui_track_gui_window, &pointer);
+ 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:
+ assert(gui_track_gui_window);
+ ro_gui_window_mouse_at(gui_track_gui_window, &pointer);
+ break;
+
+ default:
+ 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, false);
+ else if (gui_track_gui_window)
+ ro_gui_window_mouse_at(gui_track_gui_window, &pointer);
+ break;
+ }
}
@@ -938,10 +965,8 @@ void ro_gui_close_window_request(wimp_close *close)
void ro_gui_pointer_leaving_window(wimp_leaving *leaving)
{
- os_error *error;
-
if (gui_track_wimp_w == history_window) {
- error = xwimp_close_window(dialog_tooltip);
+ os_error *error = xwimp_close_window(dialog_tooltip);
if (error) {
LOG(("xwimp_close_window: 0x%x: %s",
error->errnum, error->errmess));
@@ -949,8 +974,18 @@ void ro_gui_pointer_leaving_window(wimp_leaving *leaving)
}
}
- gui_track = false;
- gui_window_set_pointer(GUI_POINTER_DEFAULT);
+ switch (gui_current_drag_type) {
+ case GUI_DRAG_SELECTION:
+ case GUI_DRAG_SCROLL:
+ /* ignore Pointer_Leaving_Window event that the Wimp mysteriously
+ issues when a Wimp_DragBox drag operations is started */
+ break;
+
+ default:
+ gui_track = false;
+ gui_window_set_pointer(GUI_POINTER_DEFAULT);
+ break;
+ }
}
@@ -1057,7 +1092,11 @@ void ro_gui_drag_end(wimp_dragged *drag)
{
switch (gui_current_drag_type) {
case GUI_DRAG_SELECTION:
- ro_gui_selection_drag_end(drag);
+ ro_gui_selection_drag_end(gui_track_gui_window, drag);
+ break;
+
+ case GUI_DRAG_SCROLL:
+ ro_gui_window_scroll_end(gui_track_gui_window, drag);
break;
case GUI_DRAG_DOWNLOAD_SAVE:
@@ -1082,6 +1121,10 @@ void ro_gui_drag_end(wimp_dragged *drag)
case GUI_DRAG_TOOLBAR_CONFIG:
ro_gui_theme_toolbar_editor_drag_end(drag);
break;
+
+ default:
+ assert(gui_current_drag_type == GUI_DRAG_NONE);
+ break;
}
}
@@ -1163,14 +1206,24 @@ void ro_gui_user_message(wimp_event_no event, wimp_message *message)
ro_gui_menu_warning((wimp_message_menu_warning *)
&message->data);
break;
+
case message_MENUS_DELETED:
ro_gui_menu_closed();
break;
+
case message_MODE_CHANGE:
ro_gui_history_mode_change();
rufl_invalidate_cache();
break;
+ case message_CLAIM_ENTITY:
+ ro_gui_selection_claim_entity((wimp_full_message_claim_entity*)message);
+ break;
+
+ case message_DATA_REQUEST:
+ ro_gui_selection_data_request((wimp_full_message_data_request*)message);
+ break;
+
#ifdef WITH_URI
case message_URI_PROCESS:
if (event != wimp_USER_MESSAGE_ACKNOWLEDGE)