From c2584d3f8bffdfea0e67c2ec2d5dd9587d5da4db Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Tue, 12 Feb 2013 14:22:09 +0000 Subject: Add support for double and triple clicks. --- framebuffer/gui.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/framebuffer/gui.c b/framebuffer/gui.c index 0f3f7b921..899be1351 100644 --- a/framebuffer/gui.c +++ b/framebuffer/gui.c @@ -599,9 +599,15 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) { struct gui_window *gw = cbi->context; struct browser_widget_s *bwidget = fbtk_get_userpw(widget); + browser_mouse_state mouse; float scale = gw->bw->scale; int x = (cbi->x + bwidget->scrollx) / scale; int y = (cbi->y + bwidget->scrolly) / scale; + unsigned int time_now; + static struct { + enum { CLICK_SINGLE, CLICK_DOUBLE, CLICK_TRIPLE } type; + unsigned int time; + } last_click; if (cbi->event->type != NSFB_EVENT_KEY_DOWN && cbi->event->type != NSFB_EVENT_KEY_UP) @@ -651,6 +657,10 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) break; case NSFB_EVENT_KEY_UP: + + mouse = 0; + time_now = wallclock(); + switch (cbi->event->value.keycode) { case NSFB_KEY_MOUSE_1: if (gui_drag.state == GUI_DRAG_DRAG) { @@ -671,8 +681,7 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) /* This is a click; * clear PRESSED state and pass to core */ gui_drag.state = GUI_DRAG_NONE; - browser_window_mouse_click(gw->bw, - BROWSER_MOUSE_CLICK_1, x, y); + mouse = BROWSER_MOUSE_CLICK_1; break; case NSFB_KEY_MOUSE_3: @@ -693,8 +702,7 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) /* This is a click; * clear PRESSED state and pass to core */ gui_drag.state = GUI_DRAG_NONE; - browser_window_mouse_click(gw->bw, - BROWSER_MOUSE_CLICK_2, x, y); + mouse = BROWSER_MOUSE_CLICK_2; break; default: @@ -702,6 +710,31 @@ fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) } + /* Determine if it's a double or triple click, allowing + * 0.5 seconds (50cs) between clicks */ + if (time_now < last_click.time + 50) { + if (last_click.type == CLICK_SINGLE) { + /* Set double click */ + mouse |= BROWSER_MOUSE_DOUBLE_CLICK; + last_click.type = CLICK_DOUBLE; + + } else if (last_click.type == CLICK_DOUBLE) { + /* Set triple click */ + mouse |= BROWSER_MOUSE_TRIPLE_CLICK; + last_click.type = CLICK_TRIPLE; + } else { + /* Set normal click */ + last_click.type = CLICK_SINGLE; + } + } else { + last_click.type = CLICK_SINGLE; + } + + if (mouse) + browser_window_mouse_click(gw->bw, mouse, x, y); + + last_click.time = time_now; + break; default: break; -- cgit v1.2.3