From 382c2f2289047a920bc0cf5f1e539074457beed7 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Thu, 26 Jul 2012 23:14:27 +0100 Subject: Only warp pointer once for a sequence of consecutive move events. Further reduces lag when dragging scrollbar. --- framebuffer/fbtk/event.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'framebuffer/fbtk/event.c') 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; -- cgit v1.2.3