summaryrefslogtreecommitdiff
path: root/framebuffer
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2012-07-26 23:14:27 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2012-07-26 23:14:27 +0100
commit382c2f2289047a920bc0cf5f1e539074457beed7 (patch)
treebfbf9d9f226287f38a843004b506c99184a3d739 /framebuffer
parent514bee5786a4506922e3e80a0e4a8672dee7daee (diff)
downloadnetsurf-382c2f2289047a920bc0cf5f1e539074457beed7.tar.gz
netsurf-382c2f2289047a920bc0cf5f1e539074457beed7.tar.bz2
Only warp pointer once for a sequence of consecutive move events. Further reduces lag when dragging scrollbar.
Diffstat (limited to 'framebuffer')
-rw-r--r--framebuffer/fbtk/event.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/framebuffer/fbtk/event.c b/framebuffer/fbtk/event.c
index ca64fd33d..0c68912c7 100644
--- a/framebuffer/fbtk/event.c
+++ b/framebuffer/fbtk/event.c
@@ -188,14 +188,31 @@ fbtk_warp_pointer(fbtk_widget_t *widget, int x, int y, bool relative)
bool
fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout)
{
+ nsfb_bbox_t cloc;
bool unused = false; /* is the event available */
+ bool move_pointer = false; /* whether pointer move events occured */
/* ensure we have the root widget */
root = fbtk_get_root_widget(root);
do {
- if (nsfb_event(root->u.root.fb, event, timeout) == false)
+ if (nsfb_event(root->u.root.fb, event, timeout) == false) {
+ if (move_pointer)
+ fbtk_warp_pointer(root, cloc.x0, cloc.y0,
+ false);
return false;
+ }
+
+ if (move_pointer && event->type != NSFB_EVENT_MOVE_RELATIVE &&
+ event->type != NSFB_EVENT_MOVE_ABSOLUTE) {
+ /* Flush the movements */
+ fbtk_warp_pointer(root, cloc.x0, cloc.y0, false);
+
+ } else if (!move_pointer &&
+ event->type == NSFB_EVENT_MOVE_RELATIVE) {
+ /* Get current pointer coords */
+ nsfb_cursor_loc_get(root->u.root.fb, &cloc);
+ }
switch (event->type) {
case NSFB_EVENT_KEY_DOWN:
@@ -213,14 +230,20 @@ fbtk_event(fbtk_widget_t *root, nsfb_event_t *event, int timeout)
break;
case NSFB_EVENT_MOVE_RELATIVE:
- fbtk_warp_pointer(root, event->value.vector.x,
- event->value.vector.y, true);
+ /* Consecutive move events are consolidated into a
+ * single pointer warp */
+ move_pointer = true;
+ cloc.x0 += event->value.vector.x;
+ cloc.y0 += event->value.vector.y;
timeout = 0;
break;
case NSFB_EVENT_MOVE_ABSOLUTE:
- fbtk_warp_pointer(root, event->value.vector.x,
- event->value.vector.y, false);
+ /* Consecutive move events are consolidated into a
+ * single pointer warp */
+ move_pointer = true;
+ cloc.x0 = event->value.vector.x;
+ cloc.y0 = event->value.vector.y;
timeout = 0;
break;