* [Ecore_X] "mouse up" events have now double/triple click flags, and

those flags are feeded to the Evas


SVN revision: 25105
This commit is contained in:
moom 2006-08-25 17:27:08 +00:00 committed by moom
parent 7837b6f53a
commit 992bf08f32
3 changed files with 67 additions and 33 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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;