diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index b5b3132600..ce543f37cd 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -511,13 +511,16 @@ _ecore_evas_x_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, { Ecore_Evas *ee; Ecore_X_Event_Mouse_Button_Up *e; + Evas_Button_Flags flags = EVAS_BUTTON_NONE; e = event; ee = _ecore_evas_x_match(e->win); if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */ if (e->win != ee->engine.x.win) return 1; _ecore_evas_x_modifier_locks_update(ee, e->modifiers); - evas_event_feed_mouse_up(ee->evas, e->button, EVAS_BUTTON_NONE, e->time, NULL); + if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK; + if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK; + evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL); return 1; } diff --git a/legacy/ecore/src/lib/ecore_x/Ecore_X.h b/legacy/ecore/src/lib/ecore_x/Ecore_X.h index 3cdcee849b..b0f8d1f469 100644 --- a/legacy/ecore/src/lib/ecore_x/Ecore_X.h +++ b/legacy/ecore/src/lib/ecore_x/Ecore_X.h @@ -329,6 +329,8 @@ struct _Ecore_X_Event_Mouse_Button_Up Ecore_X_Window win; Ecore_X_Window event_win; Ecore_X_Time time; + int double_click : 1; + int triple_click : 1; }; struct _Ecore_X_Event_Mouse_Move diff --git a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c index 5eb811c4bd..6c9d1b351b 100644 --- a/legacy/ecore/src/lib/ecore_x/ecore_x_events.c +++ b/legacy/ecore/src/lib/ecore_x/ecore_x_events.c @@ -27,6 +27,15 @@ static void _ecore_x_event_free_window_prop_client_machine_change(void *data, vo static void _ecore_x_event_free_key_down(void *data, void *ev); static void _ecore_x_event_free_key_up(void *data, void *ev); +static Window _ecore_x_mouse_down_last_win = 0; +static Window _ecore_x_mouse_down_last_last_win = 0; +static Window _ecore_x_mouse_down_last_event_win = 0; +static Window _ecore_x_mouse_down_last_last_event_win = 0; +static Time _ecore_x_mouse_down_last_time = 0; +static Time _ecore_x_mouse_down_last_last_time = 0; +static int _ecore_x_mouse_up_count = 0; +static int _ecore_x_mouse_down_did_triple = 0; + EAPI void ecore_x_event_mask_set(Ecore_X_Window w, Ecore_X_Event_Mask mask) { @@ -276,13 +285,6 @@ _ecore_x_event_handle_key_release(XEvent *xevent) void _ecore_x_event_handle_button_press(XEvent *xevent) { - static Window last_win = 0; - static Window last_last_win = 0; - static Window last_event_win = 0; - static Window last_last_event_win = 0; - static Time last_time = 0; - static Time last_last_time = 0; - int did_triple = 0; int i; if ((xevent->xbutton.button > 3) && (xevent->xbutton.button < 8)) @@ -381,6 +383,16 @@ _ecore_x_event_handle_button_press(XEvent *xevent) } { Ecore_X_Event_Mouse_Button_Down *e; + + if (_ecore_x_mouse_down_did_triple) + { + _ecore_x_mouse_down_last_win = 0; + _ecore_x_mouse_down_last_last_win = 0; + _ecore_x_mouse_down_last_event_win = 0; + _ecore_x_mouse_down_last_last_event_win = 0; + _ecore_x_mouse_down_last_time = 0; + _ecore_x_mouse_down_last_last_time = 0; + } e = calloc(1, sizeof(Ecore_X_Event_Mouse_Button_Down)); if (!e) return; @@ -396,22 +408,28 @@ _ecore_x_event_handle_button_press(XEvent *xevent) e->time = xevent->xbutton.time; if (e->win == e->event_win) { - if (((int)(e->time - last_time) <= + if (((int)(e->time - _ecore_x_mouse_down_last_time) <= (int)(1000 * _ecore_x_double_click_time)) && - (e->win == last_win) - && (e->event_win == last_event_win) + (e->win == _ecore_x_mouse_down_last_win) && + (e->event_win == _ecore_x_mouse_down_last_event_win) ) e->double_click = 1; - if (((int)(e->time - last_last_time) <= + if (((int)(e->time - _ecore_x_mouse_down_last_last_time) <= (int)(2 * 1000 * _ecore_x_double_click_time)) && - (e->win == last_win) && (e->win == last_last_win) - && (e->event_win == last_event_win) && (e->event_win == last_last_event_win) + (e->win == _ecore_x_mouse_down_last_win) && + (e->win == _ecore_x_mouse_down_last_last_win) && + (e->event_win == _ecore_x_mouse_down_last_event_win) && + (e->event_win == _ecore_x_mouse_down_last_last_event_win) ) { - did_triple = 1; - e->triple_click = 1; + e->triple_click = 1; + _ecore_x_mouse_down_did_triple = 1; } + else + _ecore_x_mouse_down_did_triple = 0; } + if (!e->double_click && !e->triple_click) + _ecore_x_mouse_up_count = 0; _ecore_x_event_last_time = e->time; _ecore_x_event_last_win = e->win; _ecore_x_event_last_root_x = e->root.x; @@ -441,26 +459,17 @@ _ecore_x_event_handle_button_press(XEvent *xevent) } if (e->win == e->event_win) { - if (did_triple) + if (!_ecore_x_mouse_down_did_triple) { - last_win = 0; - last_last_win = 0; - last_event_win = 0; - last_last_event_win = 0; - last_time = 0; - last_last_time = 0; - } - else - { - last_last_win = last_win; + _ecore_x_mouse_down_last_last_win = _ecore_x_mouse_down_last_win; if (xevent->xbutton.subwindow) - last_win = xevent->xbutton.subwindow; + _ecore_x_mouse_down_last_win = xevent->xbutton.subwindow; else - last_win = xevent->xbutton.window; - last_last_event_win = last_event_win; - last_event_win = xevent->xbutton.window; - last_last_time = last_time; - last_time = xevent->xbutton.time; + _ecore_x_mouse_down_last_win = xevent->xbutton.window; + _ecore_x_mouse_down_last_last_event_win = _ecore_x_mouse_down_last_event_win; + _ecore_x_mouse_down_last_event_win = xevent->xbutton.window; + _ecore_x_mouse_down_last_last_time = _ecore_x_mouse_down_last_time; + _ecore_x_mouse_down_last_time = xevent->xbutton.time; } } } @@ -508,6 +517,26 @@ _ecore_x_event_handle_button_release(XEvent *xevent) else e->win = xevent->xbutton.window; e->event_win = xevent->xbutton.window; e->time = xevent->xbutton.time; + _ecore_x_mouse_up_count++; + if (e->win == e->event_win) + { + if ((_ecore_x_mouse_up_count >= 2) && + ((int)(e->time - _ecore_x_mouse_down_last_time) <= + (int)(1000 * _ecore_x_double_click_time)) && + (e->win == _ecore_x_mouse_down_last_win) && + (e->event_win == _ecore_x_mouse_down_last_event_win) + ) + e->double_click = 1; + if ((_ecore_x_mouse_up_count >= 3) && + ((int)(e->time - _ecore_x_mouse_down_last_last_time) <= + (int)(2 * 1000 * _ecore_x_double_click_time)) && + (e->win == _ecore_x_mouse_down_last_win) && + (e->win == _ecore_x_mouse_down_last_last_win) && + (e->event_win == _ecore_x_mouse_down_last_event_win) && + (e->event_win == _ecore_x_mouse_down_last_last_event_win) + ) + e->triple_click = 1; + } _ecore_x_event_last_time = e->time; _ecore_x_event_last_win = e->win; _ecore_x_event_last_root_x = e->root.x;