summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Dilly <bdilly@profusion.mobi>2016-12-02 09:58:18 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-12-02 09:58:18 -0200
commit5fdc93c02e0743c8750cd1a03d2f3a6b4df61278 (patch)
treea4f7c69bc5ae42787f10774088d459339750fd23
parent2ce2a6514899e1c47c4a58f2c5305d62cddf1a7c (diff)
parentad1d160bb62f568940ab6702a559e5b108b0cac0 (diff)
downloadefl-5fdc93c02e0743c8750cd1a03d2f3a6b4df61278.tar.gz
Merge branch 'devs/iscaro/locks_and_mods'
This series add support to setting mode and properties of mouse pointer, enabling key locks and modifiers per device on Evas. Also it fixes Ecore Input Evas keeping an evas device on Ecore_Input_Last struct to separate event sources and add support to lock / modifiers per seat. With that, multiseat support should be complete up to Evas layer. Patches by Guilherme Iscaro <iscaro@profusion.mobi> Differential Revision: https://phab.enlightenment.org/D4415 @feature
-rw-r--r--src/lib/ecore_input_evas/Ecore_Input_Evas.h3
-rw-r--r--src/lib/ecore_input_evas/ecore_input_evas.c80
-rw-r--r--src/lib/evas/Evas_Common.h55
-rw-r--r--src/lib/evas/canvas/efl_canvas_object.eo33
-rw-r--r--src/lib/evas/canvas/efl_input_key.c11
-rw-r--r--src/lib/evas/canvas/efl_input_pointer.c12
-rw-r--r--src/lib/evas/canvas/evas_canvas.eo145
-rw-r--r--src/lib/evas/canvas/evas_clip.c26
-rw-r--r--src/lib/evas/canvas/evas_device.c32
-rw-r--r--src/lib/evas/canvas/evas_events.c1136
-rw-r--r--src/lib/evas/canvas/evas_events_legacy.c10
-rw-r--r--src/lib/evas/canvas/evas_key.c164
-rw-r--r--src/lib/evas/canvas/evas_layer.c15
-rw-r--r--src/lib/evas/canvas/evas_main.c164
-rw-r--r--src/lib/evas/canvas/evas_map.c14
-rw-r--r--src/lib/evas/canvas/evas_object_line.c32
-rw-r--r--src/lib/evas/canvas/evas_object_main.c149
-rw-r--r--src/lib/evas/canvas/evas_object_polygon.c51
-rw-r--r--src/lib/evas/canvas/evas_object_text.c63
-rw-r--r--src/lib/evas/canvas/evas_object_textgrid.c27
-rw-r--r--src/lib/evas/canvas/evas_stack.c64
-rw-r--r--src/lib/evas/include/evas_private.h74
-rw-r--r--src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c5
-rw-r--r--src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c36
24 files changed, 1663 insertions, 738 deletions
diff --git a/src/lib/ecore_input_evas/Ecore_Input_Evas.h b/src/lib/ecore_input_evas/Ecore_Input_Evas.h
index c9b0c053fd..e126e45805 100644
--- a/src/lib/ecore_input_evas/Ecore_Input_Evas.h
+++ b/src/lib/ecore_input_evas/Ecore_Input_Evas.h
@@ -59,6 +59,9 @@ EAPI void ecore_event_window_ignore_events(Ecore_Window id, int ignore_even
EAPI void ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers);
+EAPI void ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
+ Evas_Device *seat); /**< @since 1.19 */
+
#ifdef ECORE_EVAS_INTERNAL
typedef Eina_Bool (*Ecore_Event_Direct_Input_Cb)(void *window, int type, const void *info);
EAPI void _ecore_event_window_direct_cb_set(Ecore_Window id, Ecore_Event_Direct_Input_Cb fptr);
diff --git a/src/lib/ecore_input_evas/ecore_input_evas.c b/src/lib/ecore_input_evas/ecore_input_evas.c
index 1cef2daa08..735ad27b0f 100644
--- a/src/lib/ecore_input_evas/ecore_input_evas.c
+++ b/src/lib/ecore_input_evas/ecore_input_evas.c
@@ -47,6 +47,7 @@ struct _Ecore_Input_Last
{
Ecore_Event_Mouse_Button *ev;
Ecore_Timer *timer;
+ Evas_Device *evas_device;
unsigned int device;
unsigned int buttons;
@@ -122,14 +123,16 @@ _ecore_event_last_check(Ecore_Event_Last *eel, Ecore_Event_Press press)
}
static Ecore_Event_Last *
-_ecore_event_evas_lookup(unsigned int device, unsigned int buttons, Ecore_Window win, Eina_Bool create_new)
+_ecore_event_evas_lookup(Evas_Device *evas_device, unsigned int device,
+ unsigned int buttons, Ecore_Window win,
+ Eina_Bool create_new)
{
Ecore_Event_Last *eel;
Eina_List *l;
//the number of last event is small, simple check is ok.
EINA_LIST_FOREACH(_last_events, l, eel)
- if ((eel->device == device) && (eel->buttons == buttons))
+ if ((eel->device == device) && (eel->buttons == buttons) && (eel->evas_device == evas_device))
return eel;
if (!create_new) return NULL;
eel = malloc(sizeof (Ecore_Event_Last));
@@ -142,6 +145,7 @@ _ecore_event_evas_lookup(unsigned int device, unsigned int buttons, Ecore_Window
eel->state = ECORE_INPUT_NONE;
eel->faked = EINA_FALSE;
eel->win = win;
+ eel->evas_device = evas_device;
_last_events = eina_list_append(_last_events, eel);
return eel;
@@ -182,7 +186,7 @@ _ecore_event_evas_push_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Pre
Ecore_Input_Action action = ECORE_INPUT_CONTINUE;
//_ecore_event_evas_mouse_button already check press or cancel without history
- eel = _ecore_event_evas_lookup(e->multi.device, e->buttons, e->window, EINA_TRUE);
+ eel = _ecore_event_evas_lookup(e->dev, e->multi.device, e->buttons, e->window, EINA_TRUE);
if (!eel) return EINA_FALSE;
INF("dev(%d), button(%d), last_press(%d), press(%d)", e->multi.device, e->buttons, eel->state, press);
@@ -274,50 +278,57 @@ _ecore_event_evas_push_mouse_move(Ecore_Event_Mouse_Move *e)
}
EAPI void
-ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
+ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers,
+ Evas_Device *seat)
{
if (modifiers & ECORE_EVENT_MODIFIER_SHIFT)
- evas_key_modifier_on(e, "Shift");
- else evas_key_modifier_off(e, "Shift");
+ evas_seat_key_modifier_on(e, "Shift", seat);
+ else evas_seat_key_modifier_off(e, "Shift", seat);
if (modifiers & ECORE_EVENT_MODIFIER_CTRL)
- evas_key_modifier_on(e, "Control");
- else evas_key_modifier_off(e, "Control");
+ evas_seat_key_modifier_on(e, "Control", seat);
+ else evas_seat_key_modifier_off(e, "Control", seat);
if (modifiers & ECORE_EVENT_MODIFIER_ALT)
- evas_key_modifier_on(e, "Alt");
- else evas_key_modifier_off(e, "Alt");
+ evas_seat_key_modifier_on(e, "Alt", seat);
+ else evas_seat_key_modifier_off(e, "Alt", seat);
if (modifiers & ECORE_EVENT_MODIFIER_WIN)
{
- evas_key_modifier_on(e, "Super");
- evas_key_modifier_on(e, "Hyper");
+ evas_seat_key_modifier_on(e, "Super", seat);
+ evas_seat_key_modifier_on(e, "Hyper", seat);
}
else
{
- evas_key_modifier_off(e, "Super");
- evas_key_modifier_off(e, "Hyper");
+ evas_seat_key_modifier_off(e, "Super", seat);
+ evas_seat_key_modifier_off(e, "Hyper", seat);
}
if (modifiers & ECORE_EVENT_MODIFIER_ALTGR)
- evas_key_modifier_on(e, "AltGr");
- else evas_key_modifier_off(e, "AltGr");
+ evas_seat_key_modifier_on(e, "AltGr", seat);
+ else evas_seat_key_modifier_off(e, "AltGr", seat);
if (modifiers & ECORE_EVENT_LOCK_SCROLL)
- evas_key_lock_on(e, "Scroll_Lock");
- else evas_key_lock_off(e, "Scroll_Lock");
+ evas_seat_key_lock_on(e, "Scroll_Lock", seat);
+ else evas_seat_key_lock_off(e, "Scroll_Lock", seat);
if (modifiers & ECORE_EVENT_LOCK_NUM)
- evas_key_lock_on(e, "Num_Lock");
- else evas_key_lock_off(e, "Num_Lock");
+ evas_seat_key_lock_on(e, "Num_Lock", seat);
+ else evas_seat_key_lock_off(e, "Num_Lock", seat);
if (modifiers & ECORE_EVENT_LOCK_CAPS)
- evas_key_lock_on(e, "Caps_Lock");
- else evas_key_lock_off(e, "Caps_Lock");
+ evas_seat_key_lock_on(e, "Caps_Lock", seat);
+ else evas_seat_key_lock_off(e, "Caps_Lock", seat);
if (modifiers & ECORE_EVENT_LOCK_SHIFT)
- evas_key_lock_on(e, "Shift_Lock");
- else evas_key_lock_off(e, "Shift_Lock");
+ evas_seat_key_lock_on(e, "Shift_Lock", seat);
+ else evas_seat_key_lock_off(e, "Shift_Lock", seat);
+}
+
+EAPI void
+ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers)
+{
+ ecore_event_evas_seat_modifier_lock_update(e, modifiers, NULL);
}
EAPI void
@@ -408,7 +419,9 @@ _ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press)
lookup = _ecore_event_window_match(e->event_window);
if (!lookup) return ECORE_CALLBACK_PASS_ON;
- ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(lookup->evas,
+ e->modifiers,
+ efl_input_device_seat_get(e->dev));
if (press == ECORE_DOWN)
{
if (!lookup->direct ||
@@ -491,7 +504,7 @@ _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press pr
if (press != ECORE_DOWN)
{
//ECORE_UP or ECORE_CANCEL
- eel = _ecore_event_evas_lookup(e->multi.device, e->buttons, e->window, EINA_FALSE);
+ eel = _ecore_event_evas_lookup(e->dev, e->multi.device, e->buttons, e->window, EINA_FALSE);
if (!eel)
{
WRN("ButtonEvent has no history.");
@@ -517,7 +530,9 @@ _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press pr
if (e->multi.device == 0)
{
- ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(lookup->evas,
+ e->modifiers,
+ efl_input_device_seat_get(e->dev));
if (press == ECORE_DOWN)
{
if (!lookup->direct ||
@@ -597,7 +612,9 @@ ecore_event_evas_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *
if (e->multi.device == 0)
{
_ecore_event_evas_push_mouse_move(e);
- ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(lookup->evas,
+ e->modifiers,
+ efl_input_device_seat_get(e->dev));
if (!lookup->direct ||
!lookup->direct(lookup->window, ECORE_EVENT_MOUSE_MOVE, e))
{
@@ -656,7 +673,9 @@ _ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io)
lookup = _ecore_event_window_match(e->event_window);
if (!lookup) return ECORE_CALLBACK_PASS_ON;
- ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(lookup->evas,
+ e->modifiers,
+ efl_input_device_seat_get(e->dev));
switch (io)
{
case ECORE_IN:
@@ -702,7 +721,8 @@ ecore_event_evas_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void
e = event;
lookup = _ecore_event_window_match(e->event_window);
if (!lookup) return ECORE_CALLBACK_PASS_ON;
- ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(lookup->evas, e->modifiers,
+ efl_input_device_seat_get(e->dev));
if (!lookup->direct ||
!lookup->direct(lookup->window, ECORE_EVENT_MOUSE_WHEEL, e))
{
diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h
index 5ae1626c44..2f54174121 100644
--- a/src/lib/evas/Evas_Common.h
+++ b/src/lib/evas/Evas_Common.h
@@ -3449,7 +3449,7 @@ EAPI void evas_language_reinit(void);
* @{
*/
/**
- * Checks the state of a given modifier key, at the time of the
+ * Checks the state of a given modifier of the default seat, at the time of the
* call. If the modifier is set, such as shift being pressed, this
* function returns @c Eina_True.
*
@@ -3465,11 +3465,35 @@ EAPI void evas_language_reinit(void);
* @see evas_key_modifier_get
* @see evas_key_modifier_on
* @see evas_key_modifier_off
+ * @see evas_seat_key_modifier_is_set
*/
EAPI Eina_Bool evas_key_modifier_is_set(const Evas_Modifier *m, const char *keyname) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2);
-
/**
- * Checks the state of a given lock key, at the time of the call. If
+ * Checks the state of a given modifier key of a given seat, at the time of the
+ * call. If the modifier is set, such as shift being pressed, this
+ * function returns @c Eina_True.
+ *
+ * @param m The current modifiers set, as returned by
+ * evas_key_modifier_get().
+ * @param keyname The name of the modifier key to check status for.
+ * @param seat The seat to check if the lock is set. Use @c NULL for the default seat.
+ *
+ * @return @c Eina_True if the modifier key named @p keyname is on, @c
+ * Eina_False otherwise.
+ *
+ * @see evas_key_modifier_add
+ * @see evas_key_modifier_del
+ * @see evas_key_modifier_get
+ * @see evas_key_modifier_on
+ * @see evas_key_modifier_off
+ * @see evas_seat_key_modifier_on
+ * @see evas_seat_key_modifier_off
+ * @see evas_key_modifier_is_set
+ * @since 1.19
+ */
+EAPI Eina_Bool evas_seat_key_modifier_is_set(const Evas_Modifier *m, const char *keyname, const Evas_Device *seat) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2);
+/**
+ * Checks the state of a given lock key of the default seat, at the time of the call. If
* the lock is set, such as caps lock, this function returns @c
* Eina_True.
*
@@ -3484,10 +3508,35 @@ EAPI Eina_Bool evas_key_modifier_is_set(const Evas_Modifier *m, const
* @see evas_key_lock_del
* @see evas_key_lock_on
* @see evas_key_lock_off
+ * @see evas_seat_key_lock_on
+ * @see evas_seat_key_lock_off
+ * @see evas_seat_key_lock_is_set
*/
EAPI Eina_Bool evas_key_lock_is_set(const Evas_Lock *l, const char *keyname) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2);
/**
+ * Checks the state of a given lock key of a given seat, at the time of the call. If
+ * the lock is set, such as caps lock, this function returns @c
+ * Eina_True.
+ *
+ * @param l The current locks set, as returned by evas_key_lock_get().
+ * @param keyname The name of the lock key to check status for.
+ * @param seat The seat to check if the lock is set. Use @c NULL for the default seat.
+ *
+ * @return @c Eina_True if the @p keyname lock key is set, @c
+ * Eina_False otherwise.
+ *
+ * @see evas_key_lock_get
+ * @see evas_key_lock_add
+ * @see evas_key_lock_del
+ * @see evas_key_lock_on
+ * @see evas_key_lock_off
+ * @see evas_key_lock_is_set
+ * @since 1.19
+ */
+EAPI Eina_Bool evas_seat_key_lock_is_set(const Evas_Lock *l, const char *keyname, const Evas_Device *seat) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1, 2);
+
+/**
* @}
*/
diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo
index 4b8a8d43fd..606dd45213 100644
--- a/src/lib/evas/canvas/efl_canvas_object.eo
+++ b/src/lib/evas/canvas/efl_canvas_object.eo
@@ -21,6 +21,18 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
type: string; [[The type of the object.]]
}
}
+ @property pointer_mode_by_device {
+ [[Low-level pointer behaviour by device.
+ See @.pointer_mode.get and @.pointer_mode.set for more explanation.
+ @since 1.19
+ ]]
+ keys {
+ dev: Efl.Input.Device; [[The pointer device to set/get the mode. Use $null for the default pointer.]]
+ }
+ values {
+ pointer_mode: Efl.Input.Object_Pointer_Mode; [[The pointer mode]]
+ }
+ }
@property pointer_mode {
[[Low-level pointer behaviour.
@@ -37,6 +49,8 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
will be emitted just when inside this object area.
The default value is @Efl.Input.Object_Pointer_Mode.auto_grab.
+ See also: @.pointer_mode_by_device.get and @.pointer_mode_by_device.set
+ Note: This function will only set/get the mode for the default pointer.
]]
values {
pointer_mode: Efl.Input.Object_Pointer_Mode; [[Input pointer mode]]
@@ -47,7 +61,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
This shall be true between pointer,in and pointer,out events (coming
in matching numbers). Note that group objects may receive multiple
- pointer,in in a row.
+ pointer,in in a row. See algo @.pointer_device_in.get
@since 1.19
]]
@@ -56,6 +70,23 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
in: bool; [[If $true the main pointer has entered this object.]]
}
}
+ @property pointer_device_in {
+ [[Read-only value indicating whether a pointer is in the object.
+
+ This shall be true between pointer,in and pointer,out events (coming
+ in matching numbers). Note that group objects may receive multiple
+ pointer,in in a row.
+
+ @since 1.19
+ ]]
+ get {}
+ keys {
+ pointer: Efl.Input.Device; [[The pointer. Use $null for the defaul pointer]]
+ }
+ values {
+ in: bool; [[If $true the pointer has entered this object.]]
+ }
+ }
@property render_op {
[[Render mode to be used for compositing the Evas object.
diff --git a/src/lib/evas/canvas/efl_input_key.c b/src/lib/evas/canvas/efl_input_key.c
index 387723b9c6..685b6b3b12 100644
--- a/src/lib/evas/canvas/efl_input_key.c
+++ b/src/lib/evas/canvas/efl_input_key.c
@@ -242,15 +242,22 @@ _efl_input_key_efl_input_event_device_get(Eo *obj EINA_UNUSED, Efl_Input_Key_Dat
EOLIAN static Eina_Bool
_efl_input_key_efl_input_state_modifier_enabled_get(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, const char * name)
{
+ Efl_Input_Device *seat;
+
if (!pd->modifiers) return EINA_FALSE;
- return evas_key_modifier_is_set(pd->modifiers, name);
+ seat = efl_input_device_seat_get(pd->device);
+ if (!seat) return EINA_FALSE;
+ return evas_seat_key_modifier_is_set(pd->modifiers, name, seat);
}
EOLIAN static Eina_Bool
_efl_input_key_efl_input_state_lock_enabled_get(Eo *obj EINA_UNUSED, Efl_Input_Key_Data *pd, const char * name)
{
+ Efl_Input_Device *seat;
if (!pd->locks) return EINA_FALSE;
- return evas_key_lock_is_set(pd->locks, name);
+ seat = efl_input_device_seat_get(pd->device);
+ if (!seat) return EINA_FALSE;
+ return evas_seat_key_lock_is_set(pd->locks, name, seat);
}
EOLIAN static Eina_Bool
diff --git a/src/lib/evas/canvas/efl_input_pointer.c b/src/lib/evas/canvas/efl_input_pointer.c
index 9b068d7730..4ec9af04e7 100644
--- a/src/lib/evas/canvas/efl_input_pointer.c
+++ b/src/lib/evas/canvas/efl_input_pointer.c
@@ -325,15 +325,23 @@ _efl_input_pointer_tool_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int
EOLIAN static Eina_Bool
_efl_input_pointer_efl_input_state_modifier_enabled_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, const char *name)
{
+ Efl_Input_Device *seat;
+
if (!pd->modifiers) return EINA_FALSE;
- return evas_key_modifier_is_set(pd->modifiers, name);
+ seat = efl_input_device_seat_get(pd->device);
+ if (!seat) return EINA_FALSE;
+ return evas_seat_key_modifier_is_set(pd->modifiers, name, seat);
}
EOLIAN static Eina_Bool
_efl_input_pointer_efl_input_state_lock_enabled_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, const char *name)
{
+ Efl_Input_Device *seat;
+
if (!pd->locks) return EINA_FALSE;
- return evas_key_lock_is_set(pd->locks, name);
+ seat = efl_input_device_seat_get(pd->device);
+ if (!seat) return EINA_FALSE;
+ return evas_seat_key_lock_is_set(pd->locks, name, seat);
}
EOLIAN static void
diff --git a/src/lib/evas/canvas/evas_canvas.eo b/src/lib/evas/canvas/evas_canvas.eo
index 91eb4135df..9a2d62b934 100644
--- a/src/lib/evas/canvas/evas_canvas.eo
+++ b/src/lib/evas/canvas/evas_canvas.eo
@@ -207,13 +207,24 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
]]
return: ptr(const(Evas.Lock)) @warn_unused; [[
An Evas_Lock handle to query Evas' keys subsystem with
- \@ref evas_key_lock_is_set, or $null on error.
+ \@ref evas_key_lock_is_set or \@ref evas_seat_key_lock_is_set, or $null on error.
]]
}
}
+ @property pointer_canvas_xy_by_device {
+ [[This function returns the current known default pointer coordinates. @since 1.19]]
+ get {}
+ keys {
+ dev: Efl.Input.Device; [[The pointer device.]]
+ }
+ values {
+ x: Evas.Coord; [[The pointer to a Evas_Coord to be filled in.]]
+ y: Evas.Coord; [[The pointer to a Evas_Coord to be filled in.]]
+ }
+ }
@property pointer_canvas_xy {
get {
- [[This function returns the current known pointer coordinates
+ [[This function returns the current known default pointer coordinates
This function returns the current known canvas unit
coordinates of the mouse pointer and sets the contents of
@@ -291,9 +302,20 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
return: bool; [[$true if changed, $false otherwise]]
}
}
+ @property pointer_output_xy_by_device {
+ [[This function returns the current known pointer coordinates. @since 1.19]]
+ get {}
+ keys {
+ dev: Efl.Input.Device; [[The mouse device.]]
+ }
+ values {
+ x: int; [[The pointer to an integer to be filled in.]]
+ y: int; [[The pointer to an integer to be filled in.]]
+ }
+ }
@property pointer_output_xy {
get {
- [[This function returns the current known pointer coordinates.
+ [[This function returns the current known default pointer coordinates.
This function returns the current known screen/output
coordinates of the mouse pointer and sets the contents of
@@ -317,9 +339,20 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
y: int; [[The pointer to an integer to be filled in.]]
}
}
+ @property pointer_inside_by_device {
+ [[Returns whether the mouse pointer is logically inside the
+ canvas. @since 1.19]]
+ keys {
+ dev: Efl.Input.Device; [[The pointer device.]]
+ }
+ get {}
+ values {
+ in: bool; [[$true if the pointer is inside, $false otherwise.]]
+ }
+ }
@property pointer_inside {
get {
- [[Returns whether the mouse pointer is logically inside the
+ [[Returns whether the default mouse pointer is logically inside the
canvas.
When this function is called it will return a value of either
@@ -397,17 +430,29 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
given time with the \@ref evas_key_modifier_is_set function.
See also @.key_modifier_add, @.key_modifier_del,
- @.key_modifier_on, @.key_modifier_off.
+ @.key_modifier_on, @.key_modifier_off, @.seat_key_modifier_on,
+ @.seat_key_modifier_off.
]]
return: ptr(const(Evas.Modifier)) @warn_unused; [[
An Evas_Modifier handle to query Evas' keys subsystem
- with \@ref evas_key_modifier_is_set, or $null on error.
+ with \@ref evas_key_modifier_is_set or \@ref evas_seat_key_modifier_is_set, or $null on error.
]]
}
}
+ @property pointer_button_down_mask_by_device {
+ [[Returns a bitmask with the mouse buttons currently pressed,
+ set to 1.]]
+ keys {
+ dev: Efl.Input.Device; [[The mouse device.]]
+ }
+ get {}
+ values {
+ mask: uint; [[A bitmask of the currently depressed buttons on the canvas.]]
+ }
+ }
@property pointer_button_down_mask {
get {
- [[Returns a bitmask with the mouse buttons currently pressed,
+ [[Returns a bitmask with the default mouse buttons currently pressed,
set to 1.
Calling this function will return a 32-bit integer with the
@@ -463,16 +508,47 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
}
key_lock_on {
[[Enables or turns on programmatically the lock key with name
- $keyname.
+ $keyname for the default seat.
+
+ The effect will be as if the key was put on its active state
+ after this call.
+
+ See also @.key_lock_add, @.key_lock_del, @.key_lock_del,
+ @.key_lock_off, @.seat_key_lock_on, @.seat_key_lock_off.
+ ]]
+ params {
+ @in keyname: string @nonull; [[The name of the lock to enable.]]
+ }
+ }
+ seat_key_lock_on {
+ [[Enables or turns on programmatically the lock key with name
+ $keyname for a give seat.
The effect will be as if the key was put on its active state
after this call.
- See also @.key_lock_add, @.key_lock_del, @.key_lock_del,
- @.key_lock_off.
+ See also @.key_lock_add, @.key_lock_del, @.key_lock_del,
+ @.key_lock_off, @.key_lock_on, @.seat_key_lock_off.
+ @since 1.19
]]
params {
@in keyname: string @nonull; [[The name of the lock to enable.]]
+ @in seat: Efl.Input.Device; [[The seat to enable the keylock. A $null seat repesents the default seat.]]
+ }
+ }
+ seat_key_lock_off {
+ [[Disables or turns off programmatically the lock key with name
+ $keyname for a given seat.
+
+ The effect will be as if the key was put on its inactive state
+ after this call.
+
+ See also @.key_lock_on, @.seat_key_lock_on, @.key_lock_off.
+ @since 1.19
+ ]]
+ params {
+ @in keyname: string @nonull; [[The name of the lock to enable.]]
+ @in seat: Efl.Input.Device; [[The seat to disable the keylock. A $null seat repesents the default seat.]]
}
}
key_modifier_mask_get @const {
@@ -485,8 +561,8 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
Go check their documentation for more information.
See also @.key_modifier_add, \@ref evas_key_modifier_get,
- @.key_modifier_on, @.key_modifier_off,
- \@ref evas_key_modifier_is_set.
+ @.key_modifier_on, @.key_modifier_off, @.seat_key_modifier_on, @.seat_key_modifier_off,
+ \@ref evas_key_modifier_is_set, \@ref evas_seat_key_modifier_is_set..
]]
return: Evas.Modifier_Mask @warn_unused; [[
The bit mask or 0 if the $keyname key wasn't registered as a
@@ -524,11 +600,11 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
}
key_modifier_off {
[[Disables or turns off programmatically the modifier key with
- name $keyname.
+ name $keyname for the default seat.
See also @.key_modifier_add, \@ref evas_key_modifier_get,
- @.key_modifier_on, @.key_modifier_mask_get,
- \@ref evas_key_modifier_is_set.
+ @.key_modifier_on, @.key_modifier_mask_get, @.seat_key_modifier_off,
+ @.seat_key_modifier_off, \@ref evas_key_modifier_is_set, \@ref evas_seat_key_modifier_is_set.
]]
params {
@in keyname: string @nonull; [[The name of the modifier to disable.]]
@@ -644,12 +720,12 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
}
key_lock_off {
[[Disables or turns off programmatically the lock key with name
- $keyname.
+ $keyname for the default seat.
The effect will be as if the key was put on its inactive state
after this call.
- See also @.key_lock_on.
+ See also @.key_lock_on, @.seat_key_lock_on, @.seat_key_lock_off.
]]
params {
@in keyname: string @nonull; [[The name of the lock to disable.]]
@@ -709,17 +785,48 @@ class Evas.Canvas (Efl.Object, Efl.Canvas, Efl.Animator, Efl.Input.Interface)
}
key_modifier_on {
[[Enables or turns on programmatically the modifier key with name
- $keyname.
+ $keyname for the default seat.
The effect will be as if the key was pressed for the whole time
between this call and a matching evas_key_modifier_off().
- See also @.key_modifier_off.
+ See also @.key_modifier_off, @.seat_key_modifier_on,
+ @.seat_key_modifier_off.
]]
params {
@in keyname: string @nonull; [[The name of the modifier to enable.]]
}
}
+ seat_key_modifier_on {
+ [[Enables or turns on programmatically the modifier key with name
+ $keyname for a given seat.
+
+ The effect will be as if the key was pressed for the whole time
+ between this call and a matching @.seat_key_modifier_off.
+
+ See also @.key_modifier_off, @.seat_key_modifier_on,
+ @.seat_key_modifier_off.
+ @since 1.19
+ ]]
+ params {
+ @in keyname: string @nonull; [[The name of the lock to enable.]]
+ @in seat: Efl.Input.Device; [[The seat to enable the modifier. A $null seat repesents the default seat.]]
+ }
+ }
+ seat_key_modifier_off {
+ [[Disables or turns off programmatically the modifier key with
+ name $keyname for a given seat.
+
+ See also @.key_modifier_add, \@ref evas_key_modifier_get,
+ @.key_modifier_on, @.key_modifier_mask_get, @.seat_key_modifier_off,
+ @.seat_key_modifier_off, \@ref evas_key_modifier_is_set, \@ref evas_seat_key_modifier_is_set.
+ @since 1.19
+ ]]
+ params {
+ @in keyname: string @nonull; [[The name of the lock to enable.]]
+ @in seat: Efl.Input.Device; [[The seat to disable the modifier. A $null seat repesents the default seat.]]
+ }
+ }
font_available_list @const {
[[List of available font descriptions known or found by this evas.
diff --git a/src/lib/evas/canvas/evas_clip.c b/src/lib/evas/canvas/evas_clip.c
index 0f7be1b0fb..11d7c8e394 100644
--- a/src/lib/evas/canvas/evas_clip.c
+++ b/src/lib/evas/canvas/evas_clip.c
@@ -396,14 +396,11 @@ _efl_canvas_object_clip_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Ob
if ((!obj->is_smart) &&
(!((obj->map->cur.map) && (obj->map->cur.usemap))))
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1))
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
evas_object_clip_across_check(eo_obj, obj);
}
@@ -447,14 +444,11 @@ _clip_unset(Eo *eo_obj, Evas_Object_Protected_Data *obj)
if ((!obj->is_smart) &&
(!((obj->map->cur.map) && (obj->map->cur.usemap))))
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1))
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
evas_object_clip_across_check(eo_obj, obj);
}
diff --git a/src/lib/evas/canvas/evas_device.c b/src/lib/evas/canvas/evas_device.c
index 14ebfe3216..4ab6d1532a 100644
--- a/src/lib/evas/canvas/evas_device.c
+++ b/src/lib/evas/canvas/evas_device.c
@@ -29,8 +29,9 @@ _is_pointer(Evas_Device_Class clas)
{
if (clas == EVAS_DEVICE_CLASS_MOUSE ||
clas == EVAS_DEVICE_CLASS_TOUCH ||
- clas == EVAS_DEVICE_CLASS_WAND ||
- clas == EVAS_DEVICE_CLASS_PEN)
+ clas == EVAS_DEVICE_CLASS_PEN ||
+ clas == EVAS_DEVICE_CLASS_POINTER ||
+ clas == EVAS_DEVICE_CLASS_WAND)
return EINA_TRUE;
return EINA_FALSE;
}
@@ -86,6 +87,9 @@ _del_cb(void *data, const Efl_Event *ev)
else if (e->default_keyboard == ev->object)
e->default_keyboard = _new_default_device_find(e, ev->object);
+ _evas_pointer_data_remove(e, ev->object);
+ eina_hash_del_by_key(e->locks.masks, &ev->object);
+ eina_hash_del_by_key(e->modifiers.masks, &ev->object);
efl_event_callback_call(e->evas, EFL_CANVAS_EVENT_DEVICE_REMOVED,
ev->object);
}
@@ -128,8 +132,17 @@ evas_device_add_full(Evas *eo_e, const char *name, const char *desc,
e->default_seat = dev;
else if (!e->default_keyboard && clas == EVAS_DEVICE_CLASS_KEYBOARD)
e->default_keyboard = dev;
- else if (!e->default_mouse && _is_pointer(clas))
- e->default_mouse = dev;
+ else if (_is_pointer(clas))
+ {
+ if (!_evas_pointer_data_add(e, dev))
+ {
+ efl_del(dev);
+ return NULL;
+ }
+
+ if (!e->default_mouse)
+ e->default_mouse = dev;
+ }
e->devices = eina_list_append(e->devices, dev);
efl_event_callback_add(dev, EFL_EVENT_DEL, _del_cb, e);
@@ -255,8 +268,19 @@ evas_device_class_set(Evas_Device *dev, Evas_Device_Class clas)
SAFETY_CHECK(dev, EFL_INPUT_DEVICE_CLASS);
Efl_Input_Device_Data *d = efl_data_scope_get(dev, EFL_INPUT_DEVICE_CLASS);
+ Evas_Public_Data *edata = efl_data_scope_get(d->evas, EVAS_CANVAS_CLASS);
+
+ if (d->klass == clas)
+ return;
+
+ if (_is_pointer(d->klass))
+ _evas_pointer_data_remove(edata, dev);
efl_input_device_type_set(dev, clas);
+
+ if (_is_pointer(clas))
+ _evas_pointer_data_add(edata, dev);
+
evas_event_callback_call(d->evas, EVAS_CALLBACK_DEVICE_CHANGED, dev);
}
diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c
index 0a55fa88c2..9958f3b103 100644
--- a/src/lib/evas/canvas/evas_events.c
+++ b/src/lib/evas/canvas/evas_events.c
@@ -386,7 +386,9 @@ _evas_event_legacy_device_get(Eo *evas, Eina_Bool mouse)
static void
_evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
- Efl_Input_Pointer *parent_ev, int event_id)
+ Efl_Input_Pointer *parent_ev,
+ Evas_Pointer_Data *pdata,
+ int event_id)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
@@ -429,20 +431,29 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
}
EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
- if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
+ if (pdata->downs > 1) addgrab = pdata->downs - 1;
EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
+
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
- if ((child->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
- (child->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
+ (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
{
- child->mouse_grabbed += (addgrab + 1);
- e->pointer.mouse_grabbed += (addgrab + 1);
- if (child->pointer_mode ==
+ obj_pdata->mouse_grabbed += (addgrab + 1);
+ pdata->mouse_grabbed += (addgrab + 1);
+ if (obj_pdata->pointer_mode ==
EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
{
- e->pointer.nogrep++;
+ pdata->nogrep++;
break;
}
}
@@ -451,13 +462,24 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
copy = evas_event_list_copy(src->proxy->src_event_in);
EINA_LIST_FOREACH(copy, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
+ Evas_Object_Pointer_Mode pointer_mode;
+
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ pointer_mode = obj_pdata->pointer_mode;
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_DOWN, evt,
event_id, EFL_EVENT_POINTER_DOWN);
if (e->delete_me) break;
- if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
break;
}
eina_list_free(copy);
@@ -467,7 +489,9 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
static void
_evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
- Efl_Input_Pointer *parent_ev, int event_id)
+ Efl_Input_Pointer *parent_ev,
+ Evas_Pointer_Data *pdata,
+ int event_id)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
@@ -479,6 +503,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Vector2 curpt, curpt_real, prevpt;
+ Evas_Object_Pointer_Data *obj_pdata;
if (obj->delete_me || src->delete_me || e->is_frozen) return;
@@ -494,7 +519,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
ev->source = eo_obj;
ev->tool = 0;
- if (e->pointer.mouse_grabbed)
+ if (pdata->mouse_grabbed)
{
Eina_List *outs = NULL;
Eina_List *copy = evas_event_list_copy(src->proxy->src_event_in);
@@ -502,17 +527,24 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
EINA_LIST_FOREACH(copy, l, eo_child)
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
if ((evas_object_clippers_is_visible(eo_child, child) ||
- child->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!evas_event_passes_through(eo_child, child)) &&
(!evas_event_freezes_through(eo_child, child)) &&
(!child->clip.clipees))
{
ev->cur = curpt;
ev->prev = prevpt;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
- _evas_event_havemap_adjust_f(eo_child, child, &ev->prev, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->prev, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_MOVE;
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, evt,
@@ -528,13 +560,21 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
EINA_LIST_FREE(outs, eo_child)
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
- if ((child->mouse_grabbed == 0) && (!e->delete_me))
+ if (child->delete_me) continue;
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if ((obj_pdata->mouse_grabbed == 0) && (!e->delete_me))
{
- if (child->mouse_in) continue; /* FIXME: dubious logic! */
- child->mouse_in = 0;
- if (child->delete_me || e->is_frozen) continue;
+ if (obj_pdata->mouse_in) continue; /* FIXME: dubious logic! */
+ obj_pdata->mouse_in = 0;
+ if (e->is_frozen) continue;
ev->cur = curpt_real;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
proxy_write->src_event_in = eina_list_remove(proxy_write->src_event_in, eo_child);
EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
@@ -563,11 +603,18 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
ev->cur = curpt;
if (evas_object_is_in_output_rect(eo_child, child,
ev->cur.x, ev->cur.y, 1, 1) &&
(evas_object_clippers_is_visible(eo_child, child) ||
- child->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
eina_list_data_find(ins, eo_child) &&
(!evas_event_passes_through(eo_child, child)) &&
(!evas_event_freezes_through(eo_child, child)) &&
@@ -576,16 +623,16 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
evas_object_is_inside(eo_child, child, ev->cur.x, ev->cur.y)))
{
ev->action = EFL_POINTER_ACTION_MOVE;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, evt,
event_id, EFL_EVENT_POINTER_MOVE);
}
- else if (child->mouse_in)
+ else if (obj_pdata->mouse_in)
{
- child->mouse_in = 0;
+ obj_pdata->mouse_in = 0;
if (e->is_frozen) continue;
ev->cur = curpt;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_OUT;
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_OUT, evt,
event_id, EFL_EVENT_POINTER_OUT);
@@ -599,15 +646,22 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
int event_id2 = _evas_object_event_new();
EINA_LIST_FOREACH(ins, l, eo_child)
{
- child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
if (!eina_list_data_find(src->proxy->src_event_in, eo_child))
{
- if (!child->mouse_in)
+ if (!obj_pdata->mouse_in)
{
- child->mouse_in = 1;
+ obj_pdata->mouse_in = 1;
if (e->is_frozen) continue;
ev->cur = curpt;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_IN;
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_IN, evt,
event_id2, EFL_EVENT_POINTER_IN);
@@ -616,7 +670,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
}
}
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
{
@@ -636,7 +690,9 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
static void
_evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e,
- Efl_Input_Pointer *parent_ev, int event_id)
+ Efl_Input_Pointer *parent_ev,
+ Evas_Pointer_Data *pdata,
+ int event_id)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
@@ -663,25 +719,35 @@ _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e,
copy = evas_event_list_copy(src->proxy->src_event_in);
EINA_LIST_FOREACH(copy, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
+ Evas_Object_Pointer_Mode pointer_mode;
+
if (src->delete_me) break;
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
- if (((child->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
- (child->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) ||
- (child->mouse_grabbed > 0))
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
+ (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) ||
+ (obj_pdata->mouse_grabbed > 0))
{
- child->mouse_grabbed--;
- e->pointer.mouse_grabbed--;
+ obj_pdata->mouse_grabbed--;
+ pdata->mouse_grabbed--;
}
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ pointer_mode = obj_pdata->pointer_mode;
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_UP, evt,
event_id, EFL_EVENT_POINTER_UP);
if (e->delete_me) break;
- if (obj->pointer_mode ==
- EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
{
- if (e->pointer.nogrep > 0) e->pointer.nogrep--;
+ if (pdata->nogrep > 0) pdata->nogrep--;
break;
}
}
@@ -727,6 +793,7 @@ _evas_event_source_wheel_events(Evas_Object *eo_obj, Evas *eo_e,
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Vector2 point;
+ Evas_Pointer_Data *pdata;
if (obj->delete_me || src->delete_me || obj->layer->evas->is_frozen) return;
@@ -734,6 +801,9 @@ _evas_event_source_wheel_events(Evas_Object *eo_obj, Evas *eo_e,
ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
if (!ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
_transform_to_src_space_f(obj, src, &ev->cur);
point = ev->cur;
ev->source = eo_obj;
@@ -741,10 +811,19 @@ _evas_event_source_wheel_events(Evas_Object *eo_obj, Evas *eo_e,
copy = evas_event_list_copy(src->proxy->src_event_in);
EINA_LIST_FOREACH(copy, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
+
if (src->delete_me) return;
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_WHEEL, evt,
event_id, EFL_EVENT_POINTER_WHEEL);
if (e->delete_me) break;
@@ -756,7 +835,8 @@ _evas_event_source_wheel_events(Evas_Object *eo_obj, Evas *eo_e,
static void
_evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Public_Data *e,
- Efl_Input_Pointer *parent_ev, int event_id)
+ Efl_Input_Pointer *parent_ev, Evas_Pointer_Data *pdata,
+ int event_id)
{
Evas_Object *eo_src = _evas_object_image_source_get(obj->object);
Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
@@ -766,6 +846,7 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Vector2 point;
+ Evas_Object_Pointer_Data *obj_pdata;
int addgrab = 0;
if (obj->delete_me || src->delete_me || obj->layer->evas->is_frozen) return;
@@ -779,15 +860,22 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi
ev->source = obj->object;
ev->action = EFL_POINTER_ACTION_DOWN;
- if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
+ if (pdata->downs > 1) addgrab = pdata->downs - 1;
EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
- if (child->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
{
- child->mouse_grabbed += (addgrab + 1);
- e->pointer.mouse_grabbed += (addgrab + 1);
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (obj_pdata->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
+ {
+ obj_pdata->mouse_grabbed += (addgrab + 1);
+ pdata->mouse_grabbed += (addgrab + 1);
}
}
@@ -795,8 +883,15 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi
EINA_LIST_FOREACH(copy, l, eo_child)
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_DOWN, evt,
event_id, EFL_EVENT_FINGER_DOWN);
if (e->delete_me) break;
@@ -808,7 +903,8 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi
static void
_evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_Data *e,
- Efl_Input_Pointer *parent_ev, int event_id)
+ Efl_Input_Pointer *parent_ev, Evas_Pointer_Data *pdata,
+ int event_id)
{
Evas_Object *eo_src = _evas_object_image_source_get(obj->object);
Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
@@ -833,16 +929,27 @@ _evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_
copy = evas_event_list_copy(src->proxy->src_event_in);
EINA_LIST_FOREACH(copy, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
+
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
- if (((child->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
- (child->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) ||
- (child->mouse_grabbed > 0))
+
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
{
- child->mouse_grabbed--;
- e->pointer.mouse_grabbed--;
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+
+ if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
+ (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) ||
+ (obj_pdata->mouse_grabbed > 0))
+ {
+ obj_pdata->mouse_grabbed--;
+ pdata->mouse_grabbed--;
}
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_UP, evt,
event_id, EFL_EVENT_FINGER_UP);
if (e->delete_me || e->is_frozen) break;
@@ -854,7 +961,8 @@ _evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_
static void
_evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Public_Data *e,
- Efl_Input_Pointer *parent_ev, int event_id)
+ Efl_Input_Pointer *parent_ev, Evas_Pointer_Data *pdata,
+ int event_id)
{
Evas_Object *eo_src = _evas_object_image_source_get(obj->object);
Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
@@ -864,6 +972,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Vector2 point;
+ Evas_Object_Pointer_Data *obj_pdata;
Evas *eo_e = e->evas;
if (obj->delete_me || src->delete_me || e->is_frozen) return;
@@ -880,21 +989,27 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi
/* Why a new event id here? Other 'source' events keep the same id. */
event_id = _evas_object_event_new();
- if (e->pointer.mouse_grabbed > 0)
+ if (pdata->mouse_grabbed > 0)
{
copy = evas_event_list_copy(src->proxy->src_event_in);
EINA_LIST_FOREACH(copy, l, eo_child)
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
if (((evas_object_clippers_is_visible(eo_child, child)) ||
- ((child->mouse_grabbed) &&
+ ((obj_pdata->mouse_grabbed) &&
(!evas_event_passes_through(eo_child, child)) &&
(!evas_event_freezes_through(eo_child, child)) &&
(!child->clip.clipees))))
{
- child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
event_id, EFL_EVENT_FINGER_MOVE);
if (e->delete_me || e->is_frozen) break;
@@ -921,10 +1036,17 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi
{
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
ev->cur = point;
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
if (evas_object_is_in_output_rect(eo_child, child, ev->cur.x, ev->cur.y, 1, 1) &&
(evas_object_clippers_is_visible(eo_child, child) ||
- child->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
eina_list_data_find(ins, eo_child) &&
(!evas_event_passes_through(eo_child, child)) &&
(!evas_event_freezes_through(eo_child, child)) &&
@@ -932,14 +1054,14 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi
((!child->precise_is_inside) ||
evas_object_is_inside(eo_child, child, ev->cur.x, ev->cur.y)))
{
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
event_id, EFL_EVENT_FINGER_MOVE);
if (e->delete_me || e->is_frozen) break;
}
}
eina_list_free(copy);
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
{
@@ -969,13 +1091,17 @@ _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e,
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Vector2 point;
+ Evas_Pointer_Data *pdata;
if (obj->delete_me || src->delete_me || e->is_frozen) return;
-
evt = efl_input_dup(parent_ev);
+
ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
if (!ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
_transform_to_src_space_f(obj, src, &ev->cur);
point = ev->cur;
ev->source = eo_obj;
@@ -993,13 +1119,23 @@ _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e,
EINA_LIST_FOREACH(ins, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
+
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+
if (!eina_list_data_find(src->proxy->src_event_in, eo_child))
{
- if (child->mouse_in) continue;
- child->mouse_in = 1;
+ if (obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 1;
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_IN, evt,
event_id, EFL_EVENT_POINTER_IN);
if (e->delete_me || e->is_frozen) break;
@@ -1030,6 +1166,7 @@ _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e,
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Vector2 point;
+ Evas_Pointer_Data *pdata;
if (obj->delete_me || src->delete_me || e->is_frozen) return;
@@ -1037,6 +1174,8 @@ _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e,
ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
if (!ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
_transform_to_src_space_f(obj, src, &ev->cur);
point = ev->cur;
ev->source = eo_obj;
@@ -1045,13 +1184,22 @@ _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e,
copy = evas_event_list_copy(src->proxy->src_event_in);
EINA_LIST_FOREACH(copy, l, eo_child)
{
+ Evas_Object_Pointer_Data *obj_pdata;
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
- if (!child->mouse_in) continue;
- child->mouse_in = 0;
+ obj_pdata = _evas_object_pointer_data_get(pdata, child, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+
+ if (!obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 0;
if (child->delete_me) continue;
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
event_id, EFL_EVENT_POINTER_OUT);
if (e->is_frozen) continue;
@@ -1140,7 +1288,9 @@ _evas_canvas_event_default_flags_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
static inline void
_canvas_event_thaw_eval_internal(Eo *eo_e, Evas_Public_Data *e)
{
- _canvas_event_feed_mouse_move_legacy(eo_e, e, e->pointer.x, e->pointer.y,
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, NULL);
+ if (!pdata) return;
+ _canvas_event_feed_mouse_move_legacy(eo_e, e, pdata->x, pdata->y,
e->last_timestamp, NULL);
}
@@ -1215,6 +1365,8 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
int event_id, b;
Evas *eo_e;
int addgrab = 0;
+ Evas_Pointer_Data *pdata;
+ Evas_Object_Pointer_Data *obj_pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -1225,13 +1377,16 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if (!e || !ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
b = ev->button;
DBG("ButtonEvent:down time=%u x=%d y=%d button=%d downs=%d",
- ev->timestamp, e->pointer.x, e->pointer.y, b, e->pointer.downs);
+ ev->timestamp, pdata->x, pdata->y, b, pdata->downs);
if ((b < 1) || (b > 32)) return;
- e->pointer.button |= (1u << (b - 1));
- e->pointer.downs++;
+ pdata->button |= (1u << (b - 1));
+ pdata->downs++;
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
@@ -1240,8 +1395,8 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
event_id = _evas_object_event_new();
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
ev->modifiers = &(e->modifiers);
ev->locks = &(e->locks);
ev->event_flags = e->default_event_flags;
@@ -1252,35 +1407,43 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
_evas_walk(e);
/* append new touch point to the touch point list */
- _evas_touch_point_append(e->evas, 0, e->pointer.x, e->pointer.y);
+ _evas_touch_point_append(e->evas, 0, pdata->x, pdata->y);
/* If this is the first finger down, i.e no other fingers pressed,
* get a new event list, otherwise, keep the current grabbed list. */
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
Eina_List *ins = evas_event_objects_event_list(eo_e,
NULL,
- e->pointer.x,
- e->pointer.y);
+ pdata->x,
+ pdata->y);
/* free our old list of ins */
- e->pointer.object.in = eina_list_free(e->pointer.object.in);
+ pdata->object.in = eina_list_free(pdata->object.in);
/* and set up the new one */
- e->pointer.object.in = ins;
+ pdata->object.in = ins;
/* adjust grabbed count by the nuymber of currently held down
* fingers/buttons */
- if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
+ if (pdata->downs > 1) addgrab = pdata->downs - 1;
}
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
- (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+
+ if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
+ (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
{
- obj->mouse_grabbed += addgrab + 1;
- e->pointer.mouse_grabbed += addgrab + 1;
- if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ obj_pdata->mouse_grabbed += addgrab + 1;
+ pdata->mouse_grabbed += addgrab + 1;
+ if (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
{
- e->pointer.nogrep++;
+ pdata->nogrep++;
break;
}
}
@@ -1288,30 +1451,40 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Pointer_Mode pointer_mode;
if (obj->delete_me) continue;
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ pointer_mode = obj_pdata->pointer_mode;
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, evt,
event_id, EFL_EVENT_POINTER_DOWN);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
- _evas_event_source_mouse_down_events(eo_obj, eo_e, evt, event_id);
+ _evas_event_source_mouse_down_events(eo_obj, eo_e, evt, pdata, event_id);
if (e->is_frozen || e->delete_me) break;
- if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
break;
}
if (copy) eina_list_free(copy);
e->last_mouse_down_counter++;
_evas_post_event_callback_call(eo_e, e);
/* update touch point's state to EVAS_TOUCH_POINT_STILL */
- _evas_touch_point_update(eo_e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
+ _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_STILL);
_evas_unwalk(e);
if (ev->device) efl_unref(ev->device);
}
static int
-_post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev)
+_post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
+ Evas_Pointer_Data *pdata)
{
Eina_List *l, *copy, *ins, *ll;
Efl_Input_Pointer_Data *ev;
@@ -1319,6 +1492,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev)
Evas_Object *eo_obj;
Evas *eo_e = e->evas;
int post_called = 0;
+ Evas_Object_Pointer_Data *obj_pdata;
int event_id;
event_id = _evas_object_event_new();
@@ -1332,21 +1506,28 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev)
ev->action = EFL_POINTER_ACTION_OUT;
/* get new list of ins */
- ins = evas_event_objects_event_list(eo_e, NULL, e->pointer.x, e->pointer.y);
+ ins = evas_event_objects_event_list(eo_e, NULL, pdata->x, pdata->y);
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, ll, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if ((!eina_list_data_find(ins, eo_obj)) || (!e->pointer.inside))
+ if ((!eina_list_data_find(ins, eo_obj)) || (!pdata->inside))
{
- if (!obj->mouse_in) continue;
- obj->mouse_in = 0;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (!obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 0;
if (!e->is_frozen)
{
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
event_id, EFL_EVENT_POINTER_OUT);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
@@ -1359,7 +1540,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev)
eina_list_free(copy);
- if (e->pointer.inside)
+ if (pdata->inside)
{
Evas_Object *eo_obj_itr;
@@ -1369,14 +1550,21 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev)
EINA_LIST_FOREACH(ins, l, eo_obj_itr)
{
Evas_Object_Protected_Data *obj_itr = efl_data_scope_get(eo_obj_itr, EFL_CANVAS_OBJECT_CLASS);
- if (!eina_list_data_find(e->pointer.object.in, eo_obj_itr))
+ if (!eina_list_data_find(pdata->object.in, eo_obj_itr))
{
- if (obj_itr->mouse_in) continue;
- obj_itr->mouse_in = 1;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj_itr, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 1;
if (e->is_frozen) continue;
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj_itr, obj_itr, &ev->cur, obj_itr->mouse_grabbed);
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ _evas_event_havemap_adjust_f(eo_obj_itr, obj_itr, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj_itr, obj_itr, EVAS_CALLBACK_MOUSE_IN, evt,
event_id, EFL_EVENT_POINTER_IN);
if ((obj_itr->proxy->is_proxy) &&
@@ -1393,20 +1581,20 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev)
ins = eina_list_free(ins);
}
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
/* free our old list of ins */
- eina_list_free(e->pointer.object.in);
+ eina_list_free(pdata->object.in);
/* and set up the new one */
- e->pointer.object.in = ins;
+ pdata->object.in = ins;
}
else
{
/* free our cur ins */
eina_list_free(ins);
}
- if (e->pointer.inside)
- _canvas_event_feed_mouse_move_legacy(eo_e, e, e->pointer.x, e->pointer.y, ev->timestamp, ev->data);
+ if (pdata->inside)
+ _evas_canvas_event_pointer_move_event_dispatch(e, pdata, ev->data);
efl_del(evt);
@@ -1421,6 +1609,7 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
Evas_Object *eo_obj;
int event_id, b;
Evas *eo_e;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -1431,14 +1620,17 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
if (!e || !ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
b = ev->button;
DBG("ButtonEvent:up time=%u x=%d y=%d button=%d downs=%d",
- ev->timestamp, e->pointer.x, e->pointer.y, b, e->pointer.downs);
+ ev->timestamp, pdata->x, pdata->y, b, pdata->downs);
if ((b < 1) || (b > 32)) return;
- if (e->pointer.downs <= 0) return;
+ if (pdata->downs <= 0) return;
- e->pointer.button &= ~(1u << (b - 1));
- e->pointer.downs--;
+ pdata->button &= ~(1u << (b - 1));
+ pdata->downs--;
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
@@ -1447,8 +1639,8 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
event_id = _evas_object_event_new();
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
ev->modifiers = &(e->modifiers);
ev->locks = &(e->locks);
ev->event_flags = e->default_event_flags;
@@ -1458,36 +1650,45 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
_evas_walk(e);
/* update released touch point */
- _evas_touch_point_update(eo_e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
- copy = evas_event_list_copy(e->pointer.object.in);
+ _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_UP);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
+ Evas_Object_Pointer_Mode pointer_mode;
+ Evas_Object_Pointer_Data *obj_pdata;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if (((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
- (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
- (obj->mouse_grabbed > 0))
+
+ if (obj->delete_me) continue;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
{
- obj->mouse_grabbed--;
- e->pointer.mouse_grabbed--;
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
}
- if (!obj->delete_me)
+ if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
+ (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
+ (obj_pdata->mouse_grabbed > 0))
{
- if ((!e->is_frozen) &&
- (!evas_event_freezes_through(eo_obj, obj)))
- {
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
- evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, evt,
- event_id, EFL_EVENT_POINTER_UP);
- if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
- _evas_event_source_mouse_up_events(eo_obj, eo_e, evt, event_id);
- if (e->delete_me) break;
- }
+ obj_pdata->mouse_grabbed--;
+ pdata->mouse_grabbed--;
}
- if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ pointer_mode = obj_pdata->pointer_mode;
+ if ((!e->is_frozen) &&
+ (!evas_event_freezes_through(eo_obj, obj)))
{
- if (e->pointer.nogrep > 0) e->pointer.nogrep--;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
+ evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, evt,
+ event_id, EFL_EVENT_POINTER_UP);
+ if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
+ _evas_event_source_mouse_up_events(eo_obj, eo_e, evt, pdata, event_id);
+ if (e->delete_me) break;
+ }
+ if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ {
+ if (pdata->nogrep > 0) pdata->nogrep--;
break;
}
}
@@ -1495,13 +1696,13 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
e->last_mouse_up_counter++;
_evas_post_event_callback_call(eo_e, e);
- if (e->pointer.mouse_grabbed == 0)
- _post_up_handle(e, evt);
+ if (pdata->mouse_grabbed == 0)
+ _post_up_handle(e, evt, pdata);
- if (e->pointer.mouse_grabbed < 0)
+ if (pdata->mouse_grabbed < 0)
{
- ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
- e->pointer.mouse_grabbed);
+ ERR("BUG? pdata->mouse_grabbed (=%d) < 0!",
+ pdata->mouse_grabbed);
}
/* remove released touch point from the touch point list */
_evas_touch_point_remove(eo_e, 0);
@@ -1511,9 +1712,9 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
}
static void
-_canvas_event_feed_mouse_updown_legacy(Eo *eo_e, int b, Evas_Button_Flags flags,
- unsigned int timestamp, const void *data,
- Eina_Bool down)
+_canvas_event_feed_mouse_updown(Eo *eo_e, int b, Evas_Button_Flags flags,
+ unsigned int timestamp, const void *data,
+ Eina_Bool down, Efl_Input_Device *device)
{
Efl_Input_Pointer_Data *ev = NULL;
Efl_Input_Pointer *evt;
@@ -1527,7 +1728,7 @@ _canvas_event_feed_mouse_updown_legacy(Eo *eo_e, int b, Evas_Button_Flags flags,
ev->data = (void *) data;
ev->timestamp = timestamp;
- ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
+ ev->device = efl_ref(device ? device : _evas_event_legacy_device_get(eo_e, EINA_TRUE));
ev->action = down ? EFL_POINTER_ACTION_DOWN : EFL_POINTER_ACTION_UP;
ev->button = b;
ev->button_flags = flags;
@@ -1547,6 +1748,14 @@ _canvas_event_feed_mouse_updown_legacy(Eo *eo_e, int b, Evas_Button_Flags flags,
efl_del(evt);
}
+static void
+_canvas_event_feed_mouse_updown_legacy(Eo *eo_e, int b, Evas_Button_Flags flags,
+ unsigned int timestamp, const void *data,
+ Eina_Bool down)
+{
+ _canvas_event_feed_mouse_updown(eo_e, b, flags, timestamp, data, down, NULL);
+}
+
EAPI void
evas_event_feed_mouse_down(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
{
@@ -1570,6 +1779,7 @@ _canvas_event_feed_mouse_cancel_internal(Evas_Public_Data *e, Efl_Input_Pointer_
Evas_Event_Flags flags;
Evas *eo_e;
int i;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -1580,6 +1790,9 @@ _canvas_event_feed_mouse_cancel_internal(Evas_Public_Data *e, Efl_Input_Pointer_
if (!e || !ev) return;
if (e->is_frozen) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
save = *ev;
eo_e = e->evas;
_evas_walk(e);
@@ -1589,8 +1802,8 @@ _canvas_event_feed_mouse_cancel_internal(Evas_Public_Data *e, Efl_Input_Pointer_
for (i = 0; i < 32; i++)
{
- if ((e->pointer.button & (1u << i)))
- _canvas_event_feed_mouse_updown_legacy(eo_e, i + 1, 0, ev->timestamp, ev->data, 0);
+ if ((pdata->button & (1u << i)))
+ _canvas_event_feed_mouse_updown(eo_e, i + 1, 0, ev->timestamp, ev->data, 0, ev->device);
}
ev->action = EFL_POINTER_ACTION_CANCEL;
@@ -1643,6 +1856,7 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe)
Eina_List *l, *copy;
Evas_Object *eo_obj;
int event_id = 0;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -1652,6 +1866,9 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe)
_efl_input_value_mask(EFL_INPUT_VALUE_WHEEL_DIRECTION);
if (e->is_frozen) return;
+
+ pdata = _evas_pointer_data_by_device_get(e, pe->device);
+ if (!pdata) return;
e->last_timestamp = pe->timestamp;
event_id = _evas_object_event_new();
@@ -1661,8 +1878,8 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe)
if (!ev) return;
// adjust missing data based on evas state
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
ev->modifiers = &(e->modifiers);
ev->locks = &(e->locks);
ev->event_flags = e->default_event_flags;
@@ -1670,16 +1887,24 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe)
ev->value_flags |= value_flags;
_evas_walk(e);
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
+ Evas_Object_Pointer_Data *obj_pdata;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
if (!evas_event_freezes_through(eo_obj, obj))
{
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_WHEEL, evt,
event_id, EFL_EVENT_POINTER_WHEEL);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
@@ -1725,6 +1950,8 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
Evas *eo_e;
int event_id;
int x, y, px, py;
+ Evas_Pointer_Data *pdata;
+ Evas_Object_Pointer_Data *obj_pdata;
// inform which values are valid
static const int value_flags =
@@ -1741,27 +1968,30 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if (!e || !ev) return;
if (e->is_frozen) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
eo_e = e->evas;
e->last_timestamp = ev->timestamp;
// prev pos
- e->pointer.prev.x = e->pointer.x;
- e->pointer.prev.y = e->pointer.y;
- px = ev->prev.x = e->pointer.x;
- py = ev->prev.y = e->pointer.y;
+ pdata->prev.x = pdata->x;
+ pdata->prev.y = pdata->y;
+ px = ev->prev.x = pdata->x;
+ py = ev->prev.y = pdata->y;
// new pos
- x = e->pointer.x = ev->cur.x;
- y = e->pointer.y = ev->cur.y;
+ x = pdata->x = ev->cur.x;
+ y = pdata->y = ev->cur.y;
point = ev->cur;
- if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
+ if ((!pdata->inside) && (pdata->mouse_grabbed == 0)) return;
evt = ev->eo;
ev->modifiers = &(e->modifiers);
ev->locks = &(e->locks);
ev->event_flags = e->default_event_flags;
- ev->pressed_buttons = e->pointer.button;
+ ev->pressed_buttons = pdata->button;
ev->tool = 0;
ev->value_flags |= value_flags;
if (ev->device) efl_ref(ev->device);
@@ -1769,9 +1999,9 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
_evas_walk(e);
/* update moved touch point */
if ((px != x) || (py != y))
- _evas_touch_point_update(eo_e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
+ _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_MOVE);
/* if our mouse button is grabbed to any objects */
- if (e->pointer.mouse_grabbed > 0)
+ if (pdata->mouse_grabbed > 0)
{
Eina_List *outs = NULL;
@@ -1781,33 +2011,40 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
event_id = _evas_object_event_new();
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
if ((!e->is_frozen) &&
(evas_object_clippers_is_visible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!evas_event_passes_through(eo_obj, obj)) &&
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!obj->clip.clipees))
{
if ((px != x) || (py != y))
{
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
event_id, EFL_EVENT_POINTER_MOVE);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
- _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id);
+ _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, pdata, event_id);
}
}
else
outs = eina_list_append(outs, eo_obj);
- if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
- (e->pointer.nogrep > 0))
+ if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
+ (pdata->nogrep > 0))
{
eina_list_free(copy);
eina_list_free(outs);
@@ -1828,14 +2065,21 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
EINA_LIST_FREE(outs, eo_obj)
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if ((obj->mouse_grabbed == 0) && (!e->delete_me))
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if ((obj_pdata->mouse_grabbed == 0) && (!e->delete_me))
{
- if (!obj->mouse_in) continue;
- obj->mouse_in = 0;
+ if (!obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 0;
if (obj->delete_me || e->is_frozen) continue;
- e->pointer.object.in = eina_list_remove(e->pointer.object.in, eo_obj);
+ pdata->object.in = eina_list_remove(pdata->object.in, eo_obj);
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
event_id, EFL_EVENT_POINTER_OUT);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
@@ -1853,11 +2097,18 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
/* get all new in objects */
ins = evas_event_objects_event_list(eo_e, NULL, x, y);
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
if (!obj) continue;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
/* if its under the pointer and its visible and its in the new */
/* in list */
@@ -1866,12 +2117,12 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if ((!e->is_frozen) &&
evas_object_is_in_output_rect(eo_obj, obj, x, y, 1, 1) &&
(evas_object_clippers_is_visible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
eina_list_data_find(ins, eo_obj) &&
(!evas_event_passes_through(eo_obj, obj)) &&
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!obj->clip.clipees) &&
((!obj->precise_is_inside) || evas_object_is_inside(eo_obj, obj, x, y))
)
@@ -1879,21 +2130,21 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if ((px != x) || (py != y))
{
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_MOVE;
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
event_id, EFL_EVENT_POINTER_MOVE);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
- _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id);
+ _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, pdata, event_id);
}
}
/* otherwise it has left the object */
- else if (obj->mouse_in)
+ else if (obj_pdata->mouse_in)
{
- obj->mouse_in = 0;
+ obj_pdata->mouse_in = 0;
if (e->is_frozen) continue;
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_OUT;
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
event_id, EFL_EVENT_POINTER_OUT);
@@ -1913,14 +2164,21 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
/* if its not in the old list of ins send an enter event */
- if (!eina_list_data_find(e->pointer.object.in, eo_obj))
+ if (!eina_list_data_find(pdata->object.in, eo_obj))
{
- if (!obj->mouse_in)
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
{
- obj->mouse_in = 1;
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (!obj_pdata->mouse_in)
+ {
+ obj_pdata->mouse_in = 1;
if (e->is_frozen) continue;
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_IN;
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt,
event_id, EFL_EVENT_POINTER_IN);
@@ -1931,12 +2189,12 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
}
}
}
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
/* free our old list of ins */
- eina_list_free(e->pointer.object.in);
+ eina_list_free(pdata->object.in);
/* and set up the new one */
- e->pointer.object.in = ins;
+ pdata->object.in = ins;
}
else
{
@@ -1955,7 +2213,7 @@ nogrep:
event_id = _evas_object_event_new();
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
if (eo_obj == nogrep_obj)
@@ -1973,7 +2231,7 @@ nogrep:
int norep = 0;
ins = _evas_event_object_list_raw_in_get(eo_e, NULL,
EINA_INLIST_GET(below_obj), NULL,
- e->pointer.x, e->pointer.y,
+ pdata->x, pdata->y,
&norep, EINA_FALSE);
}
@@ -1989,6 +2247,13 @@ nogrep:
EINA_LIST_FOREACH(lst, l, eo_obj)
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
/* if its under the pointer and its visible and its in the new */
/* in list */
// FIXME: i don't think we need this
@@ -1996,12 +2261,12 @@ nogrep:
if ((!e->is_frozen) &&
evas_object_is_in_output_rect(eo_obj, obj, x, y, 1, 1) &&
(evas_object_clippers_is_visible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
eina_list_data_find(newin, eo_obj) &&
(!evas_event_passes_through(eo_obj, obj)) &&
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!obj->clip.clipees) &&
((!obj->precise_is_inside) || evas_object_is_inside(eo_obj, obj, x, y))
)
@@ -2009,22 +2274,22 @@ nogrep:
if ((px != x) || (py != y))
{
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_MOVE;
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
event_id, EFL_EVENT_POINTER_MOVE);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
- _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id);
+ _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, pdata, event_id);
}
}
else
{
/* otherwise it has left the object */
- if (!obj->mouse_in) continue;
- obj->mouse_in = 0;
+ if (!obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 0;
if (e->is_frozen) continue;
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_OUT;
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
event_id, EFL_EVENT_POINTER_OUT);
@@ -2043,13 +2308,20 @@ nogrep:
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
/* if its not in the old list of ins send an enter event */
- if (!eina_list_data_find(e->pointer.object.in, eo_obj))
+ if (!eina_list_data_find(pdata->object.in, eo_obj))
{
- if (obj->mouse_in) continue;
- obj->mouse_in = 1;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 1;
if (e->is_frozen) continue;
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_IN;
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt,
event_id, EFL_EVENT_POINTER_IN);
@@ -2059,9 +2331,9 @@ nogrep:
}
}
/* free our old list of ins */
- eina_list_free(e->pointer.object.in);
+ eina_list_free(pdata->object.in);
/* and set up the new one */
- e->pointer.object.in = newin;
+ pdata->object.in = newin;
_evas_post_event_callback_call(eo_e, e);
}
@@ -2116,6 +2388,7 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
Eina_List *l;
Evas_Object *eo_obj;
int event_id;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -2126,17 +2399,20 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
if (!e || !ev) return;
- e->pointer.inside = 1;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
+ pdata->inside = 1;
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
- if (e->pointer.mouse_grabbed != 0) return;
+ if (pdata->mouse_grabbed != 0) return;
evt = ev->eo;
ev->action = EFL_POINTER_ACTION_IN;
- ev->pressed_buttons = e->pointer.button;
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
+ ev->pressed_buttons = pdata->button;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
ev->modifiers = &(e->modifiers);
ev->locks = &(e->locks);
ev->event_flags = e->default_event_flags;
@@ -2147,17 +2423,25 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
_evas_walk(e);
/* get new list of ins */
- ins = evas_event_objects_event_list(eo_e, NULL, e->pointer.x, e->pointer.y);
+ ins = evas_event_objects_event_list(eo_e, NULL, pdata->x, pdata->y);
EINA_LIST_FOREACH(ins, l, eo_obj)
{
+ Evas_Object_Pointer_Data *obj_pdata;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if (!eina_list_data_find(e->pointer.object.in, eo_obj))
+ if (!eina_list_data_find(pdata->object.in, eo_obj))
{
- if (obj->mouse_in) continue;
- obj->mouse_in = 1;
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 1;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt,
event_id, EFL_EVENT_POINTER_IN);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
@@ -2166,9 +2450,9 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
}
}
/* free our old list of ins */
- e->pointer.object.in = eina_list_free(e->pointer.object.in);
+ pdata->object.in = eina_list_free(pdata->object.in);
/* and set up the new one */
- e->pointer.object.in = ins;
+ pdata->object.in = ins;
_evas_post_event_callback_call(eo_e, e);
_canvas_event_feed_mouse_move_internal(e, ev);
_evas_unwalk(e);
@@ -2184,6 +2468,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
Eina_List *l, *copy;
Evas_Object *eo_obj;
int event_id;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -2193,7 +2478,9 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
_efl_input_value_mask(EFL_INPUT_VALUE_TOOL);
if (!e || !ev) return;
- e->pointer.inside = 0;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+ pdata->inside = 0;
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
@@ -2202,9 +2489,9 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
evt = ev->eo;
ev->action = EFL_POINTER_ACTION_OUT;
- ev->pressed_buttons = e->pointer.button;
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
+ ev->pressed_buttons = pdata->button;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
ev->modifiers = &(e->modifiers);
ev->locks = &(e->locks);
ev->event_flags = e->default_event_flags;
@@ -2214,30 +2501,36 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
_evas_walk(e);
/* if our mouse button is inside any objects */
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
+ Evas_Object_Pointer_Data *obj_pdata;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if (!obj->mouse_in) continue;
- obj->mouse_in = 0;
- if (!obj->delete_me)
- {
- ev->cur.x = e->pointer.x;
- ev->cur.y = e->pointer.y;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
- evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
- event_id, EFL_EVENT_POINTER_OUT);
- if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
- _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
- if (e->delete_me || e->is_frozen) break;
+ if (!obj->delete_me) continue;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
}
- obj->mouse_grabbed = 0;
+ if (!obj_pdata->mouse_in) continue;
+ obj_pdata->mouse_in = 0;
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
+ evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
+ event_id, EFL_EVENT_POINTER_OUT);
+ if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
+ _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
+ if (e->delete_me || e->is_frozen) break;
+ obj_pdata->mouse_grabbed = 0;
}
eina_list_free(copy);
/* free our old list of ins */
- e->pointer.object.in = eina_list_free(e->pointer.object.in);
- e->pointer.mouse_grabbed = 0;
+ pdata->object.in = eina_list_free(pdata->object.in);
+ pdata->mouse_grabbed = 0;
_evas_post_event_callback_call(eo_e, e);
_evas_unwalk(e);
@@ -2290,6 +2583,8 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
Evas *eo_e;
int event_id;
int addgrab = 0;
+ Evas_Pointer_Data *pdata;
+ Evas_Object_Pointer_Data *obj_pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -2300,10 +2595,12 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if (!e || !ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
eo_e = e->evas;
DBG("ButtonEvent:multi down time=%u x=%.1f y=%.1f button=%d downs=%d",
- ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, e->pointer.downs);
- e->pointer.downs++;
+ ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, pdata->downs);
+ pdata->downs++;
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
@@ -2321,29 +2618,43 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
_evas_walk(e);
/* append new touch point to the touch point list */
_evas_touch_point_append(eo_e, ev->tool, ev->cur.x, ev->cur.y);
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
- if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
+ if (pdata->downs > 1) addgrab = pdata->downs - 1;
}
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
{
- obj->mouse_grabbed += addgrab + 1;
- e->pointer.mouse_grabbed += addgrab + 1;
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
+ if (obj_pdata->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
+ {
+ obj_pdata->mouse_grabbed += addgrab + 1;
+ pdata->mouse_grabbed += addgrab + 1;
}
}
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_DOWN, evt,
event_id, EFL_EVENT_FINGER_DOWN);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
- _evas_event_source_multi_down_events(obj, e, evt, event_id);
+ _evas_event_source_multi_down_events(obj, e, evt, pdata, event_id);
if (e->delete_me || e->is_frozen) break;
}
eina_list_free(copy);
@@ -2365,6 +2676,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
Eina_Vector2 point;
Evas *eo_e;
int event_id;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
@@ -2374,11 +2686,13 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
if (!e || !ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
eo_e = e->evas;
DBG("ButtonEvent:multi up time=%u x=%.1f y=%.1f device=%d downs=%d",
- ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, e->pointer.downs);
- if (e->pointer.downs <= 0) return;
- e->pointer.downs--;
+ ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, pdata->downs);
+ if (pdata->downs <= 0) return;
+ pdata->downs--;
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
@@ -2396,27 +2710,35 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data
_evas_walk(e);
/* update released touch point */
_evas_touch_point_update(eo_e, ev->tool, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_UP);
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
+ Evas_Object_Pointer_Data *obj_pdata;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
- if (((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
- (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
- (obj->mouse_grabbed > 0))
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
+ if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
+ (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
+ (obj_pdata->mouse_grabbed > 0))
{
- obj->mouse_grabbed--;
- e->pointer.mouse_grabbed--;
+ obj_pdata->mouse_grabbed--;
+ pdata->mouse_grabbed--;
}
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, evt,
event_id, EFL_EVENT_FINGER_UP);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
- _evas_event_source_multi_up_events(obj, e, evt, event_id);
+ _evas_event_source_multi_up_events(obj, e, evt, pdata, event_id);
if (e->delete_me || e->is_frozen) break;
}
eina_list_free(copy);
- if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, evt))
+ if ((pdata->mouse_grabbed == 0) && !_post_up_handle(e, evt, pdata))
_evas_post_event_callback_call(eo_e, e);
/* remove released touch point from the touch point list */
_evas_touch_point_remove(eo_e, ev->tool);
@@ -2527,6 +2849,8 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
Eina_Vector2 point;
Evas *eo_e;
int event_id;
+ Evas_Pointer_Data *pdata;
+ Evas_Object_Pointer_Data *obj_pdata;
/* FIXME: Add previous x,y information (from evas touch point list) */
static const int value_flags =
@@ -2537,13 +2861,15 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if (!e || !ev) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
eo_e = e->evas;
event_id = _evas_object_event_new();
if (e->is_frozen) return;
e->last_timestamp = ev->timestamp;
- if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
+ if ((!pdata->inside) && (pdata->mouse_grabbed == 0)) return;
evt = ev->eo;
ev->modifiers = &(e->modifiers);
@@ -2559,27 +2885,34 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
/* update moved touch point */
_evas_touch_point_update(eo_e, ev->tool, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_MOVE);
/* if our mouse button is grabbed to any objects */
- if (e->pointer.mouse_grabbed > 0)
+ if (pdata->mouse_grabbed > 0)
{
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
if ((evas_object_clippers_is_visible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!evas_event_passes_through(eo_obj, obj)) &&
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!obj->clip.clipees))
{
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
event_id, EFL_EVENT_FINGER_MOVE);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
- _evas_event_source_multi_move_events(obj, e, evt, event_id);
+ _evas_event_source_multi_move_events(obj, e, evt, pdata, event_id);
if (e->delete_me || e->is_frozen) break;
}
@@ -2594,42 +2927,49 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
/* get all new in objects */
ins = evas_event_objects_event_list(eo_e, NULL, ev->cur.x, ev->cur.y);
/* go thru old list of in objects */
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, ev->device);
+ if (!obj_pdata)
+ {
+ ERR("Could not find the object pointer data for device %p",
+ ev->device);
+ continue;
+ }
/* if its under the pointer and its visible and its in the new */
/* in list */
// FIXME: i don't think we need this
// evas_object_clip_recalc(eo_obj);
if (evas_object_is_in_output_rect(eo_obj, obj, ev->cur.x, ev->cur.y, 1, 1) &&
(evas_object_clippers_is_visible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
eina_list_data_find(ins, eo_obj) &&
(!evas_event_passes_through(eo_obj, obj)) &&
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj) ||
- obj->mouse_grabbed) &&
+ obj_pdata->mouse_grabbed) &&
(!obj->clip.clipees) &&
((!obj->precise_is_inside) || evas_object_is_inside(eo_obj, obj, ev->cur.x, ev->cur.y))
)
{
ev->cur = point;
- _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed);
+ _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
event_id, EFL_EVENT_FINGER_MOVE);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
- _evas_event_source_multi_move_events(obj, e, evt, event_id);
+ _evas_event_source_multi_move_events(obj, e, evt, pdata, event_id);
}
if (e->delete_me || e->is_frozen) break;
}
eina_list_free(copy);
- if (e->pointer.mouse_grabbed == 0)
+ if (pdata->mouse_grabbed == 0)
{
/* free our old list of ins */
- eina_list_free(e->pointer.object.in);
+ eina_list_free(pdata->object.in);
/* and set up the new one */
- e->pointer.object.in = ins;
+ pdata->object.in = ins;
}
else
{
@@ -2730,8 +3070,11 @@ _canvas_event_feed_key_down_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev
{
Eina_List *l;
Evas_Key_Grab *g;
+ Evas_Modifier_Mask *seat_mask, modifier_mask;
e->walking_grabs++;
+ seat_mask = eina_hash_find(e->modifiers.masks, &ev->device);
+ modifier_mask = seat_mask ? *seat_mask : 0;
EINA_LIST_FOREACH(e->grabs, l, g)
{
if (g->just_added)
@@ -2742,11 +3085,11 @@ _canvas_event_feed_key_down_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev
if (g->delete_me) continue;
if (!g->object) continue;
if (!g->is_active) continue;
- if (((e->modifiers.mask & g->modifiers) ||
- (g->modifiers == e->modifiers.mask)) &&
+ if (((modifier_mask & g->modifiers) ||
+ (g->modifiers == modifier_mask)) &&
(!strcmp(ev->keyname, g->keyname)))
{
- if (!(e->modifiers.mask & g->not_modifiers))
+ if (!(modifier_mask & g->not_modifiers))
{
Evas_Object_Protected_Data *object_obj = efl_data_scope_get(g->object, EFL_CANVAS_OBJECT_CLASS);
if (!e->is_frozen &&
@@ -2813,8 +3156,11 @@ _canvas_event_feed_key_up_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev)
{
Eina_List *l;
Evas_Key_Grab *g;
+ Evas_Modifier_Mask *seat_mask, modifier_mask;
e->walking_grabs++;
+ seat_mask = eina_hash_find(e->modifiers.masks, &ev->device);
+ modifier_mask = seat_mask ? *seat_mask : 0;
EINA_LIST_FOREACH(e->grabs, l, g)
{
if (g->just_added)
@@ -2825,9 +3171,9 @@ _canvas_event_feed_key_up_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev)
if (g->delete_me) continue;
if (!g->object) continue;
if (!g->is_active) continue;
- if (((e->modifiers.mask & g->modifiers) ||
- (g->modifiers == e->modifiers.mask)) &&
- (!(e->modifiers.mask & g->not_modifiers)) &&
+ if (((modifier_mask & g->modifiers) ||
+ (g->modifiers == modifier_mask)) &&
+ (!(modifier_mask & g->not_modifiers)) &&
(!strcmp(ev->keyname, g->keyname)))
{
Evas_Object_Protected_Data *object_obj = efl_data_scope_get(g->object, EFL_CANVAS_OBJECT_CLASS);
@@ -2951,6 +3297,7 @@ evas_event_feed_hold(Eo *eo_e, int hold, unsigned int timestamp, const void *dat
Eina_List *l, *copy;
Evas_Object *eo_obj;
int event_id = 0;
+ Evas_Pointer_Data *pdata;
if (e->is_frozen) return;
e->last_timestamp = timestamp;
@@ -2966,8 +3313,12 @@ evas_event_feed_hold(Eo *eo_e, int hold, unsigned int timestamp, const void *dat
ev->event_flags = e->default_event_flags;
ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
+
+
_evas_walk(e);
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
@@ -2996,6 +3347,7 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D
Evas_Object *eo_obj;
int event_id = 0;
Evas *eo_e;
+ Evas_Pointer_Data *pdata;
static const int value_flags =
_efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP);
@@ -3003,6 +3355,8 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D
if (!e || !ev) return;
if (e->is_frozen) return;
+ pdata = _evas_pointer_data_by_device_get(e, ev->device);
+ if (!pdata) return;
eo_e = e->evas;
e->last_timestamp = ev->timestamp;
@@ -3014,7 +3368,7 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D
if (ev->device) efl_ref(ev->device);
_evas_walk(e);
- copy = evas_event_list_copy(e->pointer.object.in);
+ copy = evas_event_list_copy(pdata->object.in);
EINA_LIST_FOREACH(copy, l, eo_obj)
{
@@ -3155,15 +3509,18 @@ _feed_mouse_move_eval_internal(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{
Evas_Public_Data *evas = obj->layer->evas;
Eina_Bool in_output_rect;
- in_output_rect = evas_object_is_in_output_rect(eo_obj, obj, evas->pointer.x,
- evas->pointer.y, 1, 1);
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(evas, NULL);
+
+ if (!pdata) return;
+ in_output_rect = evas_object_is_in_output_rect(eo_obj, obj, pdata->x,
+ pdata->y, 1, 1);
if ((in_output_rect) &&
((!obj->precise_is_inside) || (evas_object_is_inside(eo_obj, obj,
- evas->pointer.x,
- evas->pointer.y))))
+ pdata->x,
+ pdata->y))))
{
_canvas_event_feed_mouse_move_legacy(evas->evas, evas,
- evas->pointer.x, evas->pointer.y,
+ pdata->x, pdata->y,
evas->last_timestamp, NULL);
}
}
@@ -3230,32 +3587,40 @@ _efl_canvas_object_propagate_events_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Prot
}
EOLIAN void
-_efl_canvas_object_pointer_mode_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object_Pointer_Mode setting)
+_efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Efl_Input_Device *dev, Evas_Object_Pointer_Mode setting)
{
int addgrab;
Evas_Object *cobj;
const Eina_List *l;
+ Evas_Pointer_Data *pdata;
+ Evas_Object_Pointer_Data *obj_pdata;
+
+ pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev);
+ if (!pdata) return;
+
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, pdata->pointer);
+ EINA_SAFETY_ON_NULL_RETURN(obj_pdata);
/* ignore no-ops */
- if (obj->pointer_mode == setting) return;
+ if (obj_pdata->pointer_mode == setting) return;
/* adjust by number of pointer down events */
- addgrab = obj->layer->evas->pointer.downs;
- switch (obj->pointer_mode)
+ addgrab = pdata->downs;
+ switch (obj_pdata->pointer_mode)
{
/* nothing needed */
case EVAS_OBJECT_POINTER_MODE_NOGRAB: break;
/* decrement canvas nogrep (NO Grab/REPeat) counter */
case EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN:
- if (obj->mouse_grabbed)
- obj->layer->evas->pointer.nogrep--;
+ if (obj_pdata->mouse_grabbed)
+ pdata->nogrep--;
/* fall through */
/* remove related grabs from canvas and object */
case EVAS_OBJECT_POINTER_MODE_AUTOGRAB:
- if (obj->mouse_grabbed)
+ if (obj_pdata->mouse_grabbed)
{
- obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed;
- obj->mouse_grabbed = 0;
+ pdata->mouse_grabbed -= obj_pdata->mouse_grabbed;
+ obj_pdata->mouse_grabbed = 0;
}
}
/* adjustments for new mode */
@@ -3265,13 +3630,13 @@ _efl_canvas_object_pointer_mode_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
case EVAS_OBJECT_POINTER_MODE_NOGRAB: break;
/* increment canvas nogrep (NO Grab/REPeat) counter */
case EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN:
- obj->layer->evas->pointer.nogrep++;
+ pdata->nogrep++;
/* having nogrep set indicates that any object following it in
* the pointer.object.in list will not be receiving events, meaning
* that they will fail to unset any existing grabs/flags. unset them
* now to avoid breaking the canvas
*/
- EINA_LIST_FOREACH(obj->layer->evas->pointer.object.in, l, cobj)
+ EINA_LIST_FOREACH(pdata->object.in, l, cobj)
{
Evas_Object_Protected_Data *cobj_data;
@@ -3280,45 +3645,88 @@ _efl_canvas_object_pointer_mode_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
/* only change objects past it */
EINA_LIST_FOREACH(l->next, l, cobj)
{
+ Evas_Object_Pointer_Data *cobj_pdata;
cobj_data = efl_data_scope_get(cobj, EFL_CANVAS_OBJECT_CLASS);
- if (!cobj_data->mouse_grabbed) continue;
- cobj_data->mouse_grabbed -= addgrab;
- cobj_data->layer->evas->pointer.mouse_grabbed -= addgrab;
- if (cobj_data->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
- cobj_data->layer->evas->pointer.nogrep--;
+
+ cobj_pdata = _evas_object_pointer_data_get(pdata, cobj_data, dev);
+ if (cobj_pdata) continue;
+ if (!cobj_pdata->mouse_grabbed) continue;
+ cobj_pdata->mouse_grabbed -= addgrab;
+ pdata->mouse_grabbed -= addgrab;
+ if (cobj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
+ pdata->nogrep--;
}
break;
}
/* fall through */
/* add all button grabs to this object */
case EVAS_OBJECT_POINTER_MODE_AUTOGRAB:
- obj->mouse_grabbed += addgrab;
- obj->layer->evas->pointer.mouse_grabbed += addgrab;
+ obj_pdata->mouse_grabbed += addgrab;
+ pdata->mouse_grabbed += addgrab;
}
- obj->pointer_mode = setting;
+ obj_pdata->pointer_mode = setting;
}
EOLIAN Evas_Object_Pointer_Mode
-_efl_canvas_object_pointer_mode_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
+_efl_canvas_object_pointer_mode_by_device_get(Eo *eo_obj EINA_UNUSED,
+ Evas_Object_Protected_Data *obj,
+ Efl_Input_Device *dev)
{
- return obj->pointer_mode;
+
+ Evas_Pointer_Data *pdata;
+ Evas_Object_Pointer_Data *obj_pdata;
+
+ pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, EVAS_OBJECT_POINTER_MODE_AUTOGRAB);
+
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, pdata->pointer);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(obj_pdata, EVAS_OBJECT_POINTER_MODE_AUTOGRAB);
+ return obj_pdata->pointer_mode;
+}
+
+EOLIAN void
+_efl_canvas_object_pointer_mode_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
+ Evas_Object_Pointer_Mode setting)
+{
+ return _efl_canvas_object_pointer_mode_by_device_set(eo_obj, obj, NULL, setting);
+}
+
+EOLIAN Evas_Object_Pointer_Mode
+_efl_canvas_object_pointer_mode_get(Eo *eo_obj, Evas_Object_Protected_Data *obj)
+{
+ return _efl_canvas_object_pointer_mode_by_device_get(eo_obj, obj, NULL);
}
EOLIAN Eina_Bool
-_efl_canvas_object_pointer_in_get(Eo *eo_obj, Evas_Object_Protected_Data *obj)
+_efl_canvas_object_pointer_device_in_get(Eo *eo_obj,
+ Evas_Object_Protected_Data *obj,
+ Efl_Input_Device *pointer)
{
Evas_Object_Protected_Data *in, *parent;
Eo *eo_in, *eo_parent;
Eina_List *l;
+ Evas_Object_Pointer_Data *obj_pdata;
+ Evas_Pointer_Data *pdata;
EVAS_OBJECT_DATA_ALIVE_CHECK(obj, EINA_FALSE);
+
+
+ if (!pointer)
+ pointer = obj->layer->evas->default_mouse;
+
+ if (!pointer) return EINA_FALSE;
+
+ pdata = _evas_pointer_data_by_device_get(obj->layer->evas, pointer);
+ if (!pdata) return EINA_FALSE;
+ obj_pdata = _evas_object_pointer_data_get(pdata, obj, pointer);
+ if (!obj_pdata) return EINA_FALSE;
if (!obj->is_smart)
- return obj->mouse_in;
+ return obj_pdata->mouse_in;
/* For smart objects, this is a bit expensive obj->mouse_in will not be set.
* Alternatively we could count the number of in and out events propagated
* to the smart object, assuming they always match. */
- EINA_LIST_FOREACH(obj->layer->evas->pointer.object.in, l, eo_in)
+ EINA_LIST_FOREACH(pdata->object.in, l, eo_in)
{
if (EINA_UNLIKELY(eo_in == eo_obj))
return EINA_TRUE;
@@ -3339,6 +3747,12 @@ _efl_canvas_object_pointer_in_get(Eo *eo_obj, Evas_Object_Protected_Data *obj)
return EINA_FALSE;
}
+EOLIAN Eina_Bool
+_efl_canvas_object_pointer_in_get(Eo *eo_obj, Evas_Object_Protected_Data *obj)
+{
+ return _efl_canvas_object_pointer_device_in_get(eo_obj, obj, NULL);
+}
+
EAPI void
evas_event_refeed_event(Eo *eo_e, void *event_copy, Evas_Callback_Type event_type)
{
@@ -3424,10 +3838,20 @@ evas_event_refeed_event(Eo *eo_e, void *event_copy, Evas_Callback_Type event_typ
}
}
+
+EOLIAN int
+_evas_canvas_event_down_count_by_device_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e,
+ Efl_Input_Device *dev)
+{
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, 0);
+ return pdata->downs;
+}
+
EOLIAN int
_evas_canvas_event_down_count_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
{
- return e->pointer.downs;
+ return _evas_canvas_event_down_count_by_device_get(eo_e, e, NULL);
}
static void
@@ -3579,3 +4003,71 @@ _evas_canvas_event_shutdown(Evas *eo_e, Evas_Public_Data *e)
{
efl_event_callback_array_del(eo_e, _evas_canvas_event_pointer_callbacks(), e);
}
+
+void
+_evas_canvas_event_pointer_move_event_dispatch(Evas_Public_Data *edata,
+ Evas_Pointer_Data *pdata,
+ void *data)
+{
+ Efl_Input_Pointer_Data *ev = NULL;
+ Efl_Input_Pointer *evt;
+
+ evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, edata->evas,
+ (void **) &ev);
+ if (!evt) return;
+
+ ev->data = (void *) data;
+ ev->timestamp = edata->last_timestamp;
+ ev->device = efl_ref(pdata->pointer);
+ ev->cur.x = pdata->x;
+ ev->cur.y = pdata->y;
+
+ _canvas_event_feed_mouse_move_internal(edata, ev);
+
+ efl_del(evt);
+}
+
+void
+_evas_canvas_event_pointer_in_rect_mouse_move_feed(Evas_Public_Data *edata,
+ Evas_Object *obj,
+ Evas_Object_Protected_Data *obj_data,
+ int w, int h,
+ Eina_Bool in_objects_list,
+ void *data)
+{
+ Eina_List *l;
+ Evas_Pointer_Data *pdata;
+
+ EINA_LIST_FOREACH(edata->pointers, l, pdata)
+ {
+ if (!evas_object_is_in_output_rect(obj, obj_data, pdata->x,
+ pdata->y, w, h))
+ continue;
+ if ((in_objects_list && eina_list_data_find(pdata->object.in, obj)) || !in_objects_list)
+ _evas_canvas_event_pointer_move_event_dispatch(edata, pdata, data);
+ }
+}
+
+void
+_evas_canvas_event_pointer_in_list_mouse_move_feed(Evas_Public_Data *edata,
+ Eina_List *was,
+ Evas_Object *obj,
+ Evas_Object_Protected_Data *obj_data,
+ int w, int h,
+ Eina_Bool xor_rule,
+ void *data)
+{
+ Eina_List *l;
+ Evas_Pointer_Data *pdata;
+
+ EINA_LIST_FOREACH(edata->pointers, l, pdata)
+ {
+ int in = evas_object_is_in_output_rect(obj, obj_data, pdata->x,
+ pdata->y, w, h);
+ Evas_Pointer_Data *found = eina_list_data_find(was, pdata);
+
+ if ((xor_rule && ((in && !found) || (!in && found))) ||
+ (!xor_rule && (in || found)))
+ _evas_canvas_event_pointer_move_event_dispatch(edata, pdata, data);
+ }
+}
diff --git a/src/lib/evas/canvas/evas_events_legacy.c b/src/lib/evas/canvas/evas_events_legacy.c
index aa7b1b752b..aa1e0eb9ac 100644
--- a/src/lib/evas/canvas/evas_events_legacy.c
+++ b/src/lib/evas/canvas/evas_events_legacy.c
@@ -37,12 +37,16 @@ efl_input_pointer_legacy_info_fill(Evas *eo_evas, Efl_Input_Key *eo_ev, Evas_Cal
{
Efl_Input_Pointer_Data *ev = efl_data_scope_get(eo_ev, EFL_INPUT_POINTER_CLASS);
Evas_Public_Data *evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
+ Evas_Pointer_Data *pdata;
if (!ev || !evas) return NULL;
-#define COORD_DUP(e) do { (e)->output.x = evas->pointer.x; (e)->output.y = evas->pointer.y; } while (0)
-#define COORD_DUP_CUR(e) do { (e)->cur.output.x = evas->pointer.x; (e)->cur.output.y = evas->pointer.y; } while (0)
-#define COORD_DUP_PREV(e) do { (e)->prev.output.x = evas->pointer.prev.x; (e)->prev.output.y = evas->pointer.prev.y; } while (0)
+ pdata = _evas_pointer_data_by_device_get(evas, ev->device);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL);
+
+#define COORD_DUP(e) do { (e)->output.x = pdata->x; (e)->output.y = pdata->y; } while (0)
+#define COORD_DUP_CUR(e) do { (e)->cur.output.x = pdata->x; (e)->cur.output.y = pdata->y; } while (0)
+#define COORD_DUP_PREV(e) do { (e)->prev.output.x = pdata->prev.x; (e)->prev.output.y = pdata->prev.y; } while (0)
#define TYPE_CHK(typ) do { if (type != EVAS_CALLBACK_ ## typ) return NULL; } while (0)
switch (ev->action)
diff --git a/src/lib/evas/canvas/evas_key.c b/src/lib/evas/canvas/evas_key.c
index 82041f2eb9..8f098e0a62 100644
--- a/src/lib/evas/canvas/evas_key.c
+++ b/src/lib/evas/canvas/evas_key.c
@@ -43,38 +43,55 @@ _evas_canvas_key_lock_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
return &(e->locks);
}
-EAPI Eina_Bool
-evas_key_modifier_is_set(const Evas_Modifier *m, const char *keyname)
+static Eina_Bool
+_key_is_set(int n, Eina_Hash *masks, const Evas_Device *seat)
{
- Evas_Modifier_Mask num;
- int n;
+ Evas_Modifier_Mask num, *seat_mask;
- if (!m) return 0;
- if (!keyname) return 0;
- n = evas_key_modifier_number(m, keyname);
if (n < 0) return 0;
else if (n >= 64) return 0;
num = (Evas_Modifier_Mask)n;
num = 1ULL << num;
- if (m->mask & num) return 1;
+ seat_mask = eina_hash_find(masks, &seat);
+ if (!seat_mask) return 0;
+ if (*seat_mask & num) return 1;
return 0;
}
EAPI Eina_Bool
+evas_seat_key_modifier_is_set(const Evas_Modifier *m, const char *keyname,
+ const Evas_Device *seat)
+{
+ if (!seat)
+ seat = m->e->default_seat;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(seat, 0);
+ if (!m) return 0;
+ if (!keyname) return 0;
+ return _key_is_set(evas_key_modifier_number(m, keyname), m->masks, seat);
+}
+
+EAPI Eina_Bool
+evas_key_modifier_is_set(const Evas_Modifier *m, const char *keyname)
+{
+ return evas_seat_key_modifier_is_set(m, keyname, NULL);
+}
+
+EAPI Eina_Bool
evas_key_lock_is_set(const Evas_Lock *l, const char *keyname)
{
- Evas_Modifier_Mask num;
- int n;
+ return evas_seat_key_lock_is_set(l, keyname, NULL);
+}
+EAPI Eina_Bool
+evas_seat_key_lock_is_set(const Evas_Lock *l, const char *keyname,
+ const Evas_Device *seat)
+{
+ if (!seat)
+ seat = l->e->default_seat;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(seat, 0);
if (!l) return 0;
if (!keyname) return 0;
- n = evas_key_lock_number(l, keyname);
- if (n < 0) return 0;
- else if (n >= 64) return 0;
- num = (Evas_Modifier_Mask)n;
- num = 1ULL << num;
- if (l->mask & num) return 1;
- return 0;
+ return _key_is_set(evas_key_lock_number(l, keyname), l->masks, seat);
}
EOLIAN void
@@ -86,7 +103,7 @@ _evas_canvas_key_modifier_add(Eo *eo_e, Evas_Public_Data *e, const char *keyname
e->modifiers.mod.count++;
e->modifiers.mod.list = realloc(e->modifiers.mod.list, e->modifiers.mod.count * sizeof(char *));
e->modifiers.mod.list[e->modifiers.mod.count - 1] = strdup(keyname);
- e->modifiers.mask = 0;
+ eina_hash_free_buckets(e->modifiers.masks);
}
EOLIAN void
@@ -105,7 +122,7 @@ _evas_canvas_key_modifier_del(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const c
e->modifiers.mod.count--;
for (j = i; j < e->modifiers.mod.count; j++)
e->modifiers.mod.list[j] = e->modifiers.mod.list[j + 1];
- e->modifiers.mask = 0;
+ eina_hash_free_buckets(e->modifiers.masks);
return;
}
}
@@ -120,7 +137,7 @@ _evas_canvas_key_lock_add(Eo *eo_e, Evas_Public_Data *e, const char *keyname)
e->locks.lock.count++;
e->locks.lock.list = realloc(e->locks.lock.list, e->locks.lock.count * sizeof(char *));
e->locks.lock.list[e->locks.lock.count - 1] = strdup(keyname);
- e->locks.mask = 0;
+ eina_hash_free_buckets(e->locks.masks);
}
EOLIAN void
@@ -128,7 +145,6 @@ _evas_canvas_key_lock_del(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char
{
int i;
if (!keyname) return;
- e->locks.mask = 0;
for (i = 0; i < e->locks.lock.count; i++)
{
if (!strcmp(e->locks.lock.list[i], keyname))
@@ -139,58 +155,110 @@ _evas_canvas_key_lock_del(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char
e->locks.lock.count--;
for (j = i; j < e->locks.lock.count; j++)
e->locks.lock.list[j] = e->locks.lock.list[j + 1];
- e->locks.mask = 0;
+ eina_hash_free_buckets(e->locks.masks);
return;
}
}
}
-EOLIAN void
-_evas_canvas_key_modifier_on(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char *keyname)
+static void
+_mask_set(int n, Eina_Hash *masks, Efl_Input_Device *seat, Eina_Bool add)
{
+ Evas_Modifier_Mask *current_mask;
Evas_Modifier_Mask num;
- int n;
- n = (Evas_Modifier_Mask)evas_key_modifier_number(&(e->modifiers), keyname);
if (n < 0 || n > 63) return;
num = 1ULL << n;
- e->modifiers.mask |= num;
+
+ current_mask = eina_hash_find(masks, &seat);
+ if (add)
+ {
+ if (!current_mask)
+ {
+ current_mask = calloc(1, sizeof(Evas_Modifier_Mask));
+ EINA_SAFETY_ON_NULL_RETURN(current_mask);
+ eina_hash_add(masks, &seat, current_mask);
+ }
+ *current_mask |= num;
+ }
+ else
+ {
+ if (!current_mask) return;
+ *current_mask &= ~num;
+ if (!(*current_mask))
+ eina_hash_del_by_key(masks, &seat);
+ }
}
EOLIAN void
-_evas_canvas_key_modifier_off(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char *keyname)
+_evas_canvas_seat_key_modifier_on(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e,
+ const char *keyname, Efl_Input_Device *seat)
{
- Evas_Modifier_Mask num;
- int n;
+ if (!seat)
+ seat = e->default_seat;
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ if (efl_input_device_type_get(seat) != EFL_INPUT_DEVICE_CLASS_SEAT) return;
+ _mask_set(evas_key_modifier_number(&(e->modifiers), keyname),
+ e->modifiers.masks, seat, EINA_TRUE);
+}
- n = evas_key_modifier_number(&(e->modifiers), keyname);
- if (n < 0 || n > 63) return;
- num = 1ULL << n;
- e->modifiers.mask &= ~num;
+EOLIAN void
+_evas_canvas_seat_key_modifier_off(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e,
+ const char *keyname, Efl_Input_Device *seat)
+{
+ if (!seat)
+ seat = e->default_seat;
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ _mask_set(evas_key_modifier_number(&(e->modifiers), keyname),
+ e->modifiers.masks, seat, EINA_FALSE);
}
EOLIAN void
-_evas_canvas_key_lock_on(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char *keyname)
+_evas_canvas_key_modifier_on(Eo *eo_e, Evas_Public_Data *e, const char *keyname)
{
- Evas_Modifier_Mask num;
- int n;
+ _evas_canvas_seat_key_modifier_on(eo_e, e, keyname, NULL);
+}
- n = evas_key_lock_number(&(e->locks), keyname);
- if (n < 0 || n > 63) return;
- num = 1ULL << n;
- e->locks.mask |= num;
+EOLIAN void
+_evas_canvas_key_modifier_off(Eo *eo_e, Evas_Public_Data *e,
+ const char *keyname)
+{
+ _evas_canvas_seat_key_modifier_off(eo_e, e, keyname, NULL);
}
EOLIAN void
-_evas_canvas_key_lock_off(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, const char *keyname)
+_evas_canvas_seat_key_lock_on(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e,
+ const char *keyname, Efl_Input_Device *seat)
{
- Evas_Modifier_Mask num;
- int n;
+ if (!seat)
+ seat = e->default_seat;
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ if (efl_input_device_type_get(seat) != EFL_INPUT_DEVICE_CLASS_SEAT) return;
+ _mask_set(evas_key_lock_number(&(e->locks), keyname), e->locks.masks,
+ seat, EINA_TRUE);
+}
- n = evas_key_lock_number(&(e->locks), keyname);
- if (n < 0 || n > 63) return;
- num = 1ULL << n;
- e->locks.mask &= ~num;
+EOLIAN void
+_evas_canvas_seat_key_lock_off(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e,
+ const char *keyname, Efl_Input_Device *seat)
+{
+ if (!seat)
+ seat = e->default_seat;
+ EINA_SAFETY_ON_NULL_RETURN(seat);
+ _mask_set(evas_key_lock_number(&(e->locks), keyname), e->locks.masks,
+ seat, EINA_FALSE);
+}
+
+EOLIAN void
+_evas_canvas_key_lock_on(Eo *eo_e, Evas_Public_Data *e, const char *keyname)
+{
+ _evas_canvas_seat_key_lock_on(eo_e, e, keyname, NULL);
+}
+
+EOLIAN void
+_evas_canvas_key_lock_off(Eo *eo_e, Evas_Public_Data *e, const char *keyname)
+{
+ _evas_canvas_seat_key_lock_off(eo_e, e, keyname, NULL);
}
/* errr need to add key grabbing/ungrabbing calls - missing modifier stuff. */
diff --git a/src/lib/evas/canvas/evas_layer.c b/src/lib/evas/canvas/evas_layer.c
index 3504012ac6..3c0a23ecc0 100644
--- a/src/lib/evas/canvas/evas_layer.c
+++ b/src/lib/evas/canvas/evas_layer.c
@@ -248,18 +248,11 @@ _efl_canvas_object_efl_gfx_stack_layer_set(Eo *eo_obj,
return;
}
evas_object_change(eo_obj, obj);
- if (!obj->is_smart)
+ if (!obj->is_smart && obj->cur->visible)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1) &&
- obj->cur->visible)
- if (eina_list_data_find(obj->layer->evas->pointer.object.in, obj))
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas, eo_obj, obj,
+ 1, 1, EINA_TRUE,
+ NULL);
}
else
{
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index 22f4fa357a..580101c2f6 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -191,6 +191,12 @@ evas_new(void)
return eo_obj;
}
+static void
+_evas_key_mask_free(void *data)
+{
+ free(data);
+}
+
EOLIAN static Eo *
_evas_canvas_efl_object_constructor(Eo *eo_obj, Evas_Public_Data *e)
{
@@ -239,6 +245,9 @@ _evas_canvas_efl_object_constructor(Eo *eo_obj, Evas_Public_Data *e)
_evas_canvas_event_init(eo_obj, e);
e->focused_objects = eina_hash_pointer_new(NULL);
+ e->locks.masks = eina_hash_pointer_new(_evas_key_mask_free);
+ e->modifiers.masks = eina_hash_pointer_new(_evas_key_mask_free);
+ e->locks.e = e->modifiers.e = e;
return eo_obj;
}
@@ -262,6 +271,7 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e)
Evas_Out *evo;
int i;
Eina_Bool del;
+ Evas_Pointer_Data *pdata;
evas_canvas_async_block(e);
if (e->walking_list == 0) evas_render_idle_flush(eo_e);
@@ -320,7 +330,6 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e)
e->walking_list--;
evas_font_path_clear(eo_e);
- e->pointer.object.in = eina_list_free(e->pointer.object.in);
if (e->name_hash) eina_hash_free(e->name_hash);
e->name_hash = NULL;
@@ -378,8 +387,16 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e)
_evas_device_cleanup(eo_e);
e->focused_by = eina_list_free(e->focused_by);
+ EINA_LIST_FREE(e->pointers, pdata)
+ {
+ eina_list_free(pdata->object.in);
+ free(pdata);
+ }
+
eina_lock_free(&(e->lock_objects));
eina_spinlock_free(&(e->render.lock));
+ eina_hash_free(e->locks.masks);
+ eina_hash_free(e->modifiers.masks);
e->magic = 0;
efl_destructor(efl_super(eo_e, MY_CLASS));
@@ -501,29 +518,88 @@ evas_object_image_extension_can_load_fast_get(const char *file)
}
EOLIAN static void
-_evas_canvas_pointer_output_xy_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, int *x, int *y)
+_evas_canvas_pointer_output_xy_by_device_get(Eo *eo_e EINA_UNUSED,
+ Evas_Public_Data *e,
+ Efl_Input_Device *dev,
+ int *x, int *y)
+{
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev);
+
+ if (!pdata)
+ {
+ if (x) *x = 0;
+ if (y) *y = 0;
+ }
+ else
+ {
+ if (x) *x = pdata->x;
+ if (y) *y = pdata->y;
+ }
+
+}
+
+EOLIAN static void
+_evas_canvas_pointer_canvas_xy_by_device_get(Eo *eo_e EINA_UNUSED,
+ Evas_Public_Data *e,
+ Efl_Input_Device *dev,
+ int *x, int *y)
+{
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev);
+
+ if (!pdata)
+ {
+ if (x) *x = 0;
+ if (y) *y = 0;
+ }
+ else
+ {
+ if (x) *x = pdata->x;
+ if (y) *y = pdata->y;
+ }
+}
+
+EOLIAN static unsigned int
+_evas_canvas_pointer_button_down_mask_by_device_get(Eo *eo_e EINA_UNUSED,
+ Evas_Public_Data *e,
+ Efl_Input_Device *dev)
+{
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev);
+ if (!pdata) return 0;
+ return pdata->button;
+}
+
+EOLIAN static Eina_Bool
+_evas_canvas_pointer_inside_by_device_get(Eo *eo_e EINA_UNUSED,
+ Evas_Public_Data *e,
+ Efl_Input_Device *dev)
+{
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev);
+ if (!pdata) return EINA_FALSE;
+ return pdata->inside;
+}
+
+EOLIAN static void
+_evas_canvas_pointer_output_xy_get(Eo *eo_e, Evas_Public_Data *e, int *x, int *y)
{
- if (x) *x = e->pointer.x;
- if (y) *y = e->pointer.y;
+ return _evas_canvas_pointer_output_xy_by_device_get(eo_e, e, NULL, x, y);
}
EOLIAN static void
-_evas_canvas_pointer_canvas_xy_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas_Coord *x, Evas_Coord *y)
+_evas_canvas_pointer_canvas_xy_get(Eo *eo_e, Evas_Public_Data *e, Evas_Coord *x, Evas_Coord *y)
{
- if (x) *x = e->pointer.x;
- if (y) *y = e->pointer.y;
+ return _evas_canvas_pointer_canvas_xy_by_device_get(eo_e, e, NULL, x, y);
}
EOLIAN static unsigned int
-_evas_canvas_pointer_button_down_mask_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
+_evas_canvas_pointer_button_down_mask_get(Eo *eo_e, Evas_Public_Data *e)
{
- return e->pointer.button;
+ return _evas_canvas_pointer_button_down_mask_by_device_get(eo_e, e, NULL);
}
EOLIAN static Eina_Bool
-_evas_canvas_pointer_inside_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
+_evas_canvas_pointer_inside_get(Eo *eo_e, Evas_Public_Data *e)
{
- return e->pointer.inside;
+ return _evas_canvas_pointer_inside_by_device_get(eo_e, e, NULL);
}
EOLIAN static void
@@ -1004,4 +1080,70 @@ evas_output_viewport_get(const Evas *eo_e, Evas_Coord *x, Evas_Coord *y, Evas_Co
if (h) *h = e->viewport.h;
}
+Evas_Pointer_Data *
+_evas_pointer_data_by_device_get(Evas_Public_Data *edata, Efl_Input_Device *pointer)
+{
+ Eina_List *l;
+ Evas_Pointer_Data *pdata;
+
+ if (!pointer)
+ pointer = edata->default_mouse;
+
+ EINA_LIST_FOREACH(edata->pointers, l, pdata)
+ {
+ if (pdata->pointer == pointer)
+ return pdata;
+ }
+ return NULL;
+}
+
+Eina_Bool
+_evas_pointer_data_add(Evas_Public_Data *edata, Efl_Input_Device *pointer)
+{
+ Evas_Pointer_Data *pdata;
+
+ pdata = calloc(1, sizeof(Evas_Pointer_Data));
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, EINA_FALSE);
+
+ pdata->pointer = pointer;
+ edata->pointers = eina_list_append(edata->pointers, pdata);
+ return EINA_TRUE;
+}
+
+void
+_evas_pointer_data_remove(Evas_Public_Data *edata, Efl_Input_Device *pointer)
+{
+ Eina_List *l;
+ Evas_Pointer_Data *pdata;
+
+ EINA_LIST_FOREACH(edata->pointers, l, pdata)
+ {
+ if (pdata->pointer == pointer)
+ {
+ edata->pointers = eina_list_remove_list(edata->pointers, l);
+ eina_list_free(pdata->object.in);
+ free(pdata);
+ break;
+ }
+ }
+}
+
+Eina_List *
+_evas_pointer_list_in_rect_get(Evas_Public_Data *edata, Evas_Object *obj,
+ Evas_Object_Protected_Data *obj_data,
+ int w, int h)
+{
+ Eina_List *l, *list = NULL;
+ Evas_Pointer_Data *pdata;
+
+ EINA_LIST_FOREACH(edata->pointers, l, pdata)
+ {
+ if (evas_object_is_in_output_rect(obj, obj_data, pdata->x,
+ pdata->y, w, h))
+ list = eina_list_append(list, pdata);
+ }
+
+ return list;
+}
+
#include "canvas/evas_canvas.eo.c"
diff --git a/src/lib/evas/canvas/evas_map.c b/src/lib/evas/canvas/evas_map.c
index ccac2238af..386ecb8f41 100644
--- a/src/lib/evas/canvas/evas_map.c
+++ b/src/lib/evas/canvas/evas_map.c
@@ -5,7 +5,6 @@
static void
_evas_map_calc_geom_change(Evas_Object *eo_obj)
{
- int is, was = 0;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
if (!obj) return;
evas_object_change(eo_obj, obj);
@@ -13,17 +12,10 @@ _evas_map_calc_geom_change(Evas_Object *eo_obj)
if (!(obj->layer->evas->is_frozen))
{
evas_object_recalc_clippees(obj);
- if (!obj->is_smart)
+ if (!obj->is_smart && obj->cur->visible)
{
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if ((is ^ was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, NULL, eo_obj, obj, 1, 1,
+ EINA_TRUE, NULL);
}
}
evas_object_inform_call_move(eo_obj, obj);
diff --git a/src/lib/evas/canvas/evas_object_line.c b/src/lib/evas/canvas/evas_object_line.c
index d5fc7b3a11..17b8b2663e 100644
--- a/src/lib/evas/canvas/evas_object_line.c
+++ b/src/lib/evas/canvas/evas_object_line.c
@@ -108,7 +108,7 @@ _evas_line_xy_set(Eo *eo_obj, Evas_Line_Data *_pd, Evas_Coord x1, Evas_Coord y1,
Evas_Line_Data *o = _pd;
Evas_Coord min_x, max_x, min_y, max_y;
- int is, was = 0;
+ Eina_List *was = NULL;
MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ);
return;
@@ -127,10 +127,8 @@ _evas_line_xy_set(Eo *eo_obj, Evas_Line_Data *_pd, Evas_Coord x1, Evas_Coord y1,
if (!evas_event_passes_through(eo_obj, obj) &&
!evas_event_freezes_through(eo_obj, obj) &&
!evas_object_is_source_invisible(eo_obj, obj))
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
+ 1, 1);
}
if (x1 < x2)
{
@@ -171,23 +169,13 @@ _evas_line_xy_set(Eo *eo_obj, Evas_Line_Data *_pd, Evas_Coord x1, Evas_Coord y1,
evas_object_change(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
- if (!(obj->layer->evas->is_frozen))
- {
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if (!evas_event_passes_through(eo_obj, obj) &&
- !evas_event_freezes_through(eo_obj, obj) &&
- !evas_object_is_source_invisible(eo_obj, obj))
- {
- if ((is ^ was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
- }
- }
+ if (!(obj->layer->evas->is_frozen) &&
+ !evas_event_passes_through(eo_obj, obj) &&
+ !evas_event_freezes_through(eo_obj, obj) &&
+ !evas_object_is_source_invisible(eo_obj, obj) &&
+ obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
+ eina_list_free(was);
evas_object_inform_call_move(eo_obj, obj);
evas_object_inform_call_resize(eo_obj);
}
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 317d45abfc..00c4590657 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -81,6 +81,60 @@ _init_cow(void)
return EINA_TRUE;
}
+static void
+_evas_device_del_cb(void *data, const Efl_Event *ev)
+{
+ Evas_Object_Protected_Data *obj = data;
+
+ eina_hash_del_by_key(obj->pointer_grabs, &ev->object);
+}
+
+static void
+_evas_object_pointer_grab_del(Evas_Object_Pointer_Data *pdata)
+{
+ if ((pdata->mouse_grabbed > 0) && (pdata->obj->layer) && (pdata->obj->layer->evas))
+ pdata->evas_pdata->mouse_grabbed -= pdata->mouse_grabbed;
+ if (((pdata->mouse_in) || (pdata->mouse_grabbed > 0)) &&
+ (pdata->obj->layer) && (pdata->obj->layer->evas))
+ pdata->evas_pdata->object.in = eina_list_remove(pdata->evas_pdata->object.in, pdata->obj->object);
+ efl_event_callback_del(pdata->evas_pdata->pointer, EFL_EVENT_DEL,
+ _evas_device_del_cb, pdata->obj);
+ free(pdata);
+}
+
+static Evas_Object_Pointer_Data *
+_evas_object_pointer_data_add(Evas_Pointer_Data *evas_pdata,
+ Evas_Object_Protected_Data *obj,
+ Efl_Input_Device *pointer)
+{
+ Evas_Object_Pointer_Data *pdata;
+
+ pdata = calloc(1, sizeof(Evas_Object_Pointer_Data));
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL);
+ pdata->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
+ pdata->obj = obj;
+ pdata->evas_pdata = evas_pdata;
+ efl_event_callback_priority_add(pointer, EFL_EVENT_DEL,
+ EFL_CALLBACK_PRIORITY_BEFORE,
+ _evas_device_del_cb, obj);
+ eina_hash_add(obj->pointer_grabs, &pointer, pdata);
+ return pdata;
+}
+
+Evas_Object_Pointer_Data *
+_evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata,
+ Evas_Object_Protected_Data *obj,
+ Efl_Input_Device *pointer)
+{
+ Evas_Object_Pointer_Data *pdata;
+
+ pdata = eina_hash_find(obj->pointer_grabs, &pointer);
+ //The pointer does not exist yet - create one.
+ if (!pdata)
+ return _evas_object_pointer_data_add(evas_pdata, obj, pointer);
+ return pdata;
+}
+
EOLIAN static Eo *
_efl_canvas_object_efl_object_constructor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{
@@ -108,6 +162,7 @@ _efl_canvas_object_efl_object_constructor(Eo *eo_obj, Evas_Object_Protected_Data
obj->prev = eina_cow_alloc(evas_object_state_cow);
obj->data_3d = eina_cow_alloc(evas_object_3d_cow);
obj->mask = eina_cow_alloc(evas_object_mask_cow);
+ obj->pointer_grabs = eina_hash_pointer_new(EINA_FREE_CB(_evas_object_pointer_grab_del));
evas_object_inject(eo_obj, obj, evas);
evas_object_callback_init(eo_obj, obj);
@@ -855,15 +910,10 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data
if ((obj->layer) && (obj->layer->evas))
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
}
+ eina_hash_free(obj->pointer_grabs);
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_DEL, NULL, _evas_object_event_new(), NULL);
if ((obj->layer) && (obj->layer->evas))
_evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas);
- if ((obj->mouse_grabbed > 0) && (obj->layer) && (obj->layer->evas))
- obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed;
- if (((obj->mouse_in) || (obj->mouse_grabbed > 0)) && (obj->layer) && (obj->layer->evas))
- obj->layer->evas->pointer.object.in = eina_list_remove(obj->layer->evas->pointer.object.in, eo_obj);
- obj->mouse_grabbed = 0;
- obj->mouse_in = 0;
if (obj->name) evas_object_name_set(eo_obj, NULL);
if (!obj->layer)
{
@@ -953,10 +1003,9 @@ EOLIAN static void
_efl_canvas_object_efl_gfx_position_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
Evas_Coord x, Evas_Coord y)
{
-
- Eina_Bool is, was = EINA_FALSE;
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
Eina_Bool source_invisible = EINA_FALSE;
+ Eina_List *was = NULL;
evas_object_async_block(obj);
if (_evas_object_intercept_call(eo_obj, EVAS_OBJECT_INTERCEPT_CB_MOVE, 1, x, y))
@@ -977,9 +1026,8 @@ _efl_canvas_object_efl_gfx_position_set(Eo *eo_obj, Evas_Object_Protected_Data *
freeze = evas_event_freezes_through(eo_obj, obj);
source_invisible = evas_object_is_source_invisible(eo_obj, obj);
if ((!pass) && (!freeze) && (!source_invisible))
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
+ 1, 1);
}
obj->doing.in_move++;
@@ -1003,22 +1051,10 @@ _efl_canvas_object_efl_gfx_position_set(Eo *eo_obj, Evas_Object_Protected_Data *
if (!(obj->layer->evas->is_frozen))
{
evas_object_recalc_clippees(obj);
- if (!pass)
- {
- if (!obj->is_smart)
- {
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if ((is ^ was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
- }
- }
+ if (!pass && !obj->is_smart && obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
}
+ eina_list_free(was);
evas_object_inform_call_move(eo_obj, obj);
}
@@ -1052,9 +1088,9 @@ EOLIAN static void
_efl_canvas_object_efl_gfx_size_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
Evas_Coord w, Evas_Coord h)
{
- Eina_Bool is, was = EINA_FALSE;
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
Eina_Bool source_invisible = EINA_FALSE;
+ Eina_List *was = NULL;
if (w < 0) w = 0;
if (h < 0) h = 0;
@@ -1068,9 +1104,8 @@ _efl_canvas_object_efl_gfx_size_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
freeze = evas_event_freezes_through(eo_obj, obj);
source_invisible = evas_object_is_source_invisible(eo_obj, obj);
if ((!pass) && (!freeze) && (!source_invisible))
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj,
+ obj, 1, 1);
}
obj->doing.in_resize++;
@@ -1097,22 +1132,10 @@ _efl_canvas_object_efl_gfx_size_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
evas_object_recalc_clippees(obj);
// if (obj->func->coords_recalc) obj->func->coords_recalc(eo_obj);
- if (!pass)
- {
- if (!obj->is_smart)
- {
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if ((is ^ was) && (obj->cur->visible))
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
- }
- }
+ if (!pass && !obj->is_smart && obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
}
+ eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
}
@@ -1492,14 +1515,11 @@ _show(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{
if (!obj->is_smart)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1))
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
}
}
@@ -1554,17 +1574,17 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
if ((!obj->is_smart) ||
((obj->map->cur.map) && (obj->map->cur.map->count == 4) && (obj->map->cur.usemap)))
{
- if (!obj->mouse_grabbed)
+ Eina_Iterator *itr = eina_hash_iterator_data_new(obj->pointer_grabs);
+ Evas_Object_Pointer_Data *obj_pdata;
+ EINA_ITERATOR_FOREACH(itr, obj_pdata)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1))
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ if (!obj_pdata->mouse_grabbed &&
+ evas_object_is_in_output_rect(eo_obj, obj, obj_pdata->evas_pdata->x,
+ obj_pdata->evas_pdata->y,
+ 1, 1))
+ _evas_canvas_event_pointer_move_event_dispatch(obj->layer->evas, obj_pdata->evas_pdata, NULL);
}
+ eina_iterator_free(itr);
/* this is at odds to handling events when an obj is moved out of the mouse
* ore resized out or clipped out. if mouse is grabbed - regardless of
* visibility, mouse move events should keep happening and mouse up.
@@ -2019,7 +2039,10 @@ evas_object_top_at_pointer_get(const Evas *eo_e)
Evas_Public_Data *e = efl_isa(eo_e, EVAS_CANVAS_CLASS) ?
efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS) : NULL;
if (!e) return NULL;
- return evas_canvas_object_top_at_xy_get((Eo *)eo_e, e->pointer.x, e->pointer.y, EINA_TRUE, EINA_TRUE);
+
+ Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, NULL);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL);
+ return evas_canvas_object_top_at_xy_get((Eo *)eo_e, pdata->x, pdata->y, EINA_TRUE, EINA_TRUE);
}
EOLIAN Evas_Object*
diff --git a/src/lib/evas/canvas/evas_object_polygon.c b/src/lib/evas/canvas/evas_object_polygon.c
index 355f6ea378..29f7ca14a2 100644
--- a/src/lib/evas/canvas/evas_object_polygon.c
+++ b/src/lib/evas/canvas/evas_object_polygon.c
@@ -105,7 +105,7 @@ _efl_canvas_polygon_point_add(Eo *eo_obj, Efl_Canvas_Polygon_Data *_pd, Evas_Coo
Efl_Canvas_Polygon_Data *o = _pd;
Efl_Canvas_Polygon_Point *p;
Evas_Coord min_x, max_x, min_y, max_y;
- int is, was = 0;
+ Eina_List *was = NULL;
evas_object_async_block(obj);
if (!obj->layer->evas->is_frozen)
@@ -113,10 +113,8 @@ _efl_canvas_polygon_point_add(Eo *eo_obj, Efl_Canvas_Polygon_Data *_pd, Evas_Coo
if (!evas_event_passes_through(eo_obj, obj) &&
!evas_event_freezes_through(eo_obj, obj) &&
!evas_object_is_source_invisible(eo_obj, obj))
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
+ 1, 1);
}
if (!o->points)
{
@@ -184,23 +182,13 @@ _efl_canvas_polygon_point_add(Eo *eo_obj, Efl_Canvas_Polygon_Data *_pd, Evas_Coo
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
- if (!obj->layer->evas->is_frozen)
- {
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if (!evas_event_passes_through(eo_obj, obj) &&
- !evas_event_freezes_through(eo_obj, obj) &&
- !evas_object_is_source_invisible(eo_obj, obj))
- {
- if ((is ^ was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
- }
- }
+ if (!obj->layer->evas->is_frozen &&
+ !evas_event_passes_through(eo_obj, obj) &&
+ !evas_event_freezes_through(eo_obj, obj) &&
+ !evas_object_is_source_invisible(eo_obj, obj) &&
+ obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
+ eina_list_free(was);
evas_object_inform_call_move(eo_obj, obj);
evas_object_inform_call_resize(eo_obj);
}
@@ -211,12 +199,11 @@ _efl_canvas_polygon_points_clear(Eo *eo_obj, Efl_Canvas_Polygon_Data *_pd)
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Efl_Canvas_Polygon_Data *o = _pd;
void *list_data;
- int is, was;
+ Eina_List *was;
evas_object_async_block(obj);
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj, 1, 1);
+
EINA_LIST_FREE(o->points, list_data)
{
free(list_data);
@@ -236,15 +223,9 @@ _efl_canvas_polygon_points_clear(Eo *eo_obj, Efl_Canvas_Polygon_Data *_pd)
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if ((is || was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ if (obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_FALSE, NULL);
+ eina_list_free(was);
evas_object_inform_call_move(eo_obj, obj);
evas_object_inform_call_resize(eo_obj);
}
diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c
index fbd9b241b4..e31a722207 100644
--- a/src/lib/evas/canvas/evas_object_text.c
+++ b/src/lib/evas/canvas/evas_object_text.c
@@ -422,10 +422,10 @@ EOLIAN static void
_evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const char *font, Evas_Font_Size size)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- Eina_Bool is, was = EINA_FALSE;
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
Eina_Bool source_invisible = EINA_FALSE;
Evas_Font_Description *fdesc;
+ Eina_List *was = NULL;
if ((!font) || (size <= 0)) return;
@@ -461,9 +461,8 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha
freeze = evas_event_freezes_through(eo_obj, obj);
source_invisible = evas_object_is_source_invisible(eo_obj, obj);
if ((!pass) && (!freeze) && (!source_invisible))
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
+ 1, 1);
}
/* DO IT */
@@ -489,22 +488,9 @@ _evas_text_efl_text_properties_font_set(Eo *eo_obj, Evas_Text_Data *o, const cha
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
- if (!(obj->layer->evas->is_frozen))
- {
- if ((!pass) && (!freeze))
- {
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1);
- if ((is ^ was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
- }
- }
+ if (!obj->layer->evas->is_frozen && !pass && !freeze && obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
+ eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
}
@@ -1073,8 +1059,9 @@ EOLIAN static void
_evas_text_efl_text_text_set(Eo *eo_obj, Evas_Text_Data *o, const char *_text)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- int is, was, len;
+ int len;
Eina_Unicode *text;
+ Eina_List *was = NULL;
if ((o->cur.utf8_text) && (_text) && (!strcmp(o->cur.utf8_text, _text)))
return;
@@ -1082,9 +1069,7 @@ _evas_text_efl_text_text_set(Eo *eo_obj, Evas_Text_Data *o, const char *_text)
text = eina_unicode_utf8_to_unicode(_text, &len);
if (!text) text = eina_unicode_strdup(EINA_UNICODE_EMPTY_STRING);
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj, 1, 1);
/* DO II */
/*Update bidi_props*/
@@ -1102,15 +1087,9 @@ _evas_text_efl_text_text_set(Eo *eo_obj, Evas_Text_Data *o, const char *_text)
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if ((is || was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ if (obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_FALSE, NULL);
+ eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
}
@@ -2219,14 +2198,12 @@ _evas_object_text_rehint(Evas_Object *eo_obj)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
Evas_Text_Data *o = efl_data_scope_get(eo_obj, MY_CLASS);
- int is, was;
+ Eina_List *was = NULL;
if (!o->font) return;
evas_font_load_hinting_set(obj->layer->evas->evas, o->font,
obj->layer->evas->hinting);
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj, 1, 1);
/* DO II */
_evas_object_text_recalc(eo_obj, o->cur.text);
o->changed = 1;
@@ -2235,15 +2212,9 @@ _evas_object_text_rehint(Evas_Object *eo_obj)
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y, 1, 1);
- if ((is || was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ if (obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_FALSE, NULL);
+ eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
}
diff --git a/src/lib/evas/canvas/evas_object_textgrid.c b/src/lib/evas/canvas/evas_object_textgrid.c
index e98be126ba..d4be74de9f 100644
--- a/src/lib/evas/canvas/evas_object_textgrid.c
+++ b/src/lib/evas/canvas/evas_object_textgrid.c
@@ -1054,10 +1054,10 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
Evas_Font_Size font_size)
{
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
- Eina_Bool is, was = EINA_FALSE;
Eina_Bool pass = EINA_FALSE, freeze = EINA_FALSE;
Eina_Bool source_invisible = EINA_FALSE;
Evas_Font_Description *fdesc;
+ Eina_List *was = NULL;
if ((!font_name) || (!*font_name) || (font_size <= 0))
return;
@@ -1090,10 +1090,8 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
freeze = evas_event_freezes_through(eo_obj, obj);
source_invisible = evas_object_is_source_invisible(eo_obj, obj);
if ((!pass) && (!freeze) && (!source_invisible))
- was = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1);
+ was = _evas_pointer_list_in_rect_get(obj->layer->evas, eo_obj, obj,
+ 1, 1);
}
if (o->font_normal)
@@ -1229,22 +1227,9 @@ _evas_textgrid_efl_text_properties_font_set(Eo *eo_obj,
evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj);
evas_object_coords_recalc(eo_obj, obj);
- if (!(obj->layer->evas->is_frozen))
- {
- if ((!pass) && (!freeze))
- {
- is = evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1);
- if ((is ^ was) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
- }
- }
+ if (!obj->layer->evas->is_frozen && !pass && !freeze && obj->cur->visible)
+ _evas_canvas_event_pointer_in_list_mouse_move_feed(obj->layer->evas, was, eo_obj, obj, 1, 1, EINA_TRUE, NULL);
+ eina_list_free(was);
evas_object_inform_call_resize(eo_obj);
o->changed = 1;
o->core_change = 1;
diff --git a/src/lib/evas/canvas/evas_stack.c b/src/lib/evas/canvas/evas_stack.c
index 88d8a746e2..879dafdc38 100644
--- a/src/lib/evas/canvas/evas_stack.c
+++ b/src/lib/evas/canvas/evas_stack.c
@@ -75,17 +75,13 @@ _efl_canvas_object_efl_gfx_stack_raise(Eo *eo_obj, Evas_Object_Protected_Data *o
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj)))
{
- if (!obj->is_smart)
+ if (!obj->is_smart && obj->cur->visible)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
}
}
@@ -129,17 +125,13 @@ _efl_canvas_object_efl_gfx_stack_lower(Eo *eo_obj, Evas_Object_Protected_Data *o
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj)))
{
- if (!obj->is_smart)
+ if (!obj->is_smart && obj->cur->visible)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
}
}
@@ -211,17 +203,13 @@ _efl_canvas_object_efl_gfx_stack_stack_above(Eo *eo_obj, Evas_Object_Protected_D
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj)))
{
- if (!obj->is_smart)
+ if (!obj->is_smart && obj->cur->visible)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
}
}
@@ -293,17 +281,13 @@ _efl_canvas_object_efl_gfx_stack_stack_below(Eo *eo_obj, Evas_Object_Protected_D
(!evas_event_freezes_through(eo_obj, obj)) &&
(!evas_object_is_source_invisible(eo_obj, obj)))
{
- if (!obj->is_smart)
+ if (!obj->is_smart && obj->cur->visible)
{
- if (evas_object_is_in_output_rect(eo_obj, obj,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- 1, 1) && obj->cur->visible)
- evas_event_feed_mouse_move(obj->layer->evas->evas,
- obj->layer->evas->pointer.x,
- obj->layer->evas->pointer.y,
- obj->layer->evas->last_timestamp,
- NULL);
+ _evas_canvas_event_pointer_in_rect_mouse_move_feed(obj->layer->evas,
+ eo_obj,
+ obj, 1, 1,
+ EINA_FALSE,
+ NULL);
}
}
}
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 06b8c1e522..765765503c 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -84,6 +84,7 @@ typedef struct _Evas_Object_Map_Data Evas_Object_Map_Data;
typedef struct _Evas_Proxy_Render_Data Evas_Proxy_Render_Data;
typedef struct _Evas_Object_3D_Data Evas_Object_3D_Data;
typedef struct _Evas_Object_Mask_Data Evas_Object_Mask_Data;
+typedef struct _Evas_Object_Pointer_Data Evas_Object_Pointer_Data;
typedef struct _Evas_Smart_Data Evas_Smart_Data;
@@ -93,6 +94,7 @@ typedef struct _Evas_Object_Protected_Data Evas_Object_Protected_Data;
typedef struct _Evas_Filter_Program Evas_Filter_Program;
typedef struct _Evas_Object_Filter_Data Evas_Object_Filter_Data;
typedef struct _Evas_Filter_Data_Binding Evas_Filter_Data_Binding;
+typedef struct _Evas_Pointer_Data Evas_Pointer_Data;
// 3D stuff
@@ -767,7 +769,8 @@ struct _Evas_Modifier
int count;
char **list;
} mod;
- Evas_Modifier_Mask mask; /* ok we have a max of 64 modifiers */
+ Eina_Hash *masks; /* we have a max of 64 modifiers per seat */
+ Evas_Public_Data *e;
};
struct _Evas_Lock
@@ -776,7 +779,8 @@ struct _Evas_Lock
int count;
char **list;
} lock;
- Evas_Modifier_Mask mask; /* we have a max of 64 locks */
+ Eina_Hash *masks; /* we have a max of 64 locks per seat */
+ Evas_Public_Data *e;
};
struct _Evas_Post_Callback
@@ -798,6 +802,21 @@ typedef struct
Evas_Object_Protected_Data *obj;
} Evas_Active_Entry;
+struct _Evas_Pointer_Data
+{
+ Evas_Device *pointer;
+ struct {
+ Eina_List *in;
+ } object;
+ DATA32 button;
+ Evas_Coord x, y;
+ Evas_Point prev;
+ int mouse_grabbed;
+ int downs;
+ int nogrep;
+ unsigned char inside : 1;
+};
+
struct _Evas_Public_Data
{
EINA_INLIST;
@@ -805,18 +824,7 @@ struct _Evas_Public_Data
DATA32 magic;
Evas *evas;
- struct {
- unsigned char inside : 1;
- int mouse_grabbed;
- int downs;
- DATA32 button;
- Evas_Coord x, y;
- Evas_Point prev;
- int nogrep;
- struct {
- Eina_List *in;
- } object;
- } pointer;
+ Eina_List *pointers;
struct {
Evas_Coord x, y, w, h;
@@ -1083,6 +1091,14 @@ struct _Evas_Object_Protected_State
Eina_Bool snapshot : 1;
};
+struct _Evas_Object_Pointer_Data {
+ Evas_Object_Protected_Data *obj;
+ Evas_Pointer_Data *evas_pdata;
+ Evas_Object_Pointer_Mode pointer_mode;
+ int mouse_grabbed;
+ Eina_Bool mouse_in;
+};
+
struct _Evas_Object_Protected_Data
{
EINA_INLIST;
@@ -1123,6 +1139,7 @@ struct _Evas_Object_Protected_Data
const Evas_Object_3D_Data *data_3d;
const Evas_Object_Mask_Data *mask;
Eina_List *focused_by_seats;
+ Eina_Hash *pointer_grabs;
// Pointer to the Evas_Object itself
Evas_Object *object;
@@ -1131,7 +1148,6 @@ struct _Evas_Object_Protected_Data
int last_mouse_down_counter;
int last_mouse_up_counter;
- int mouse_grabbed;
// Daniel: Added because the destructor can't take parameters, at least for the moment
int clean_layer;
@@ -1152,6 +1168,7 @@ struct _Evas_Object_Protected_Data
Eina_Bool render_pre : 1;
Eina_Bool rect_del : 1;
+
Eina_Bool is_active : 1;
Eina_Bool changed : 1;
Eina_Bool restack : 1;
@@ -1173,8 +1190,6 @@ struct _Evas_Object_Protected_Data
Eina_Bool pre_render_done : 1;
Eina_Bool precise_is_inside : 1;
Eina_Bool is_static_clip : 1;
- Eina_Bool mouse_in : 1;
- Evas_Object_Pointer_Mode pointer_mode : 2;
Eina_Bool in_layer : 1;
Eina_Bool is_frame : 1;
@@ -1576,6 +1591,7 @@ void evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *obj);
void evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *obj, Evas_Object_Protected_Data *pd);
void evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *obj, int is_v, int was_v);
void evas_rects_return_difference_rects(Eina_Array *rects, int x, int y, int w, int h, int xx, int yy, int ww, int hh);
+Evas_Object_Pointer_Data *_evas_object_pointer_data_get(Evas_Pointer_Data *evas_pdata, Evas_Object_Protected_Data *obj, Efl_Input_Device *pointer);
void evas_object_clip_dirty(Evas_Object *obj, Evas_Object_Protected_Data *pd);
void evas_object_recalc_clippees(Evas_Object_Protected_Data *pd);
@@ -1904,7 +1920,22 @@ struct _Evas_Proxy_Render_Data
void _evas_canvas_event_init(Evas *eo_e, Evas_Public_Data *e);
void _evas_canvas_event_shutdown(Evas *eo_e, Evas_Public_Data *e);
-
+void _evas_canvas_event_pointer_in_rect_mouse_move_feed(Evas_Public_Data *edata,
+ Evas_Object *obj,
+ Evas_Object_Protected_Data *obj_data,
+ int w, int h,
+ Eina_Bool in_objects_list,
+ void *data);
+void _evas_canvas_event_pointer_in_list_mouse_move_feed(Evas_Public_Data *edata,
+ Eina_List *was,
+ Evas_Object *obj,
+ Evas_Object_Protected_Data *obj_data,
+ int w, int h,
+ Eina_Bool xor_rule,
+ void *data);
+void _evas_canvas_event_pointer_move_event_dispatch(Evas_Public_Data *edata,
+ Evas_Pointer_Data *pdata,
+ void *data);
int evas_async_events_init(void);
int evas_async_events_shutdown(void);
int evas_async_target_del(const void *target);
@@ -1969,6 +2000,13 @@ Eina_Bool _evas_image_proxy_source_clip_get(const Eo *eo_obj);
void _evas_focus_dispatch_event(Evas_Object_Protected_Data *obj,
Efl_Input_Device *seat, Eina_Bool in);
+Evas_Pointer_Data *_evas_pointer_data_by_device_get(Evas_Public_Data *edata, Efl_Input_Device *pointer);
+Eina_Bool _evas_pointer_data_add(Evas_Public_Data *edata, Efl_Input_Device *pointer);
+void _evas_pointer_data_remove(Evas_Public_Data *edata, Efl_Input_Device *pointer);
+Eina_List *_evas_pointer_list_in_rect_get(Evas_Public_Data *edata,
+ Evas_Object *obj,
+ Evas_Object_Protected_Data *obj_data,
+ int w, int h);
extern Eina_Cow *evas_object_proxy_cow;
extern Eina_Cow *evas_object_map_cow;
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
index 0bea2c4ccb..a4c2f36ba9 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
@@ -168,7 +168,7 @@ _ecore_evas_wl_common_cb_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED,
if (_ecore_evas_mouse_in_check(ee, ev->dev)) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_inout_set(ee, ev->dev, EINA_TRUE, EINA_FALSE);
- ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(ee->evas, ev->modifiers, ev->dev);
evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
_ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
return ECORE_CALLBACK_PASS_ON;
@@ -188,7 +188,8 @@ _ecore_evas_wl_common_cb_mouse_out(void *data EINA_UNUSED, int type EINA_UNUSED,
if (ev->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
if (!_ecore_evas_mouse_in_check(ee, ev->dev)) return ECORE_CALLBACK_PASS_ON;
- ecore_event_evas_modifier_lock_update(ee->evas, ev->modifiers);
+ ecore_event_evas_seat_modifier_lock_update(ee->evas,
+ ev->modifiers, ev->dev);
_ecore_evas_mouse_move_process(ee, ev->x, ev->y, ev->timestamp);
evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
_ecore_evas_mouse_inout_set(ee, ev->dev, EINA_FALSE, EINA_FALSE);
diff --git a/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c b/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c
index 8f78f40bde..088516245b 100644
--- a/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c
+++ b/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c
@@ -279,8 +279,9 @@ _ecore_evas_vnc_server_client_connection_new(rfbClientRec *client)
}
static unsigned int
-_ecore_evas_vnc_server_modifier_to_ecore_modifier(int mod)
+_ecore_evas_vnc_server_modifier_to_ecore_modifier(int mod, Eina_Bool *is_lock)
{
+ *is_lock = EINA_FALSE;
if (mod == XK_Shift_L || mod == XK_Shift_R)
return ECORE_EVENT_MODIFIER_SHIFT;
if (mod == XK_Control_L || mod == XK_Control_R)
@@ -290,13 +291,25 @@ _ecore_evas_vnc_server_modifier_to_ecore_modifier(int mod)
if (mod == XK_Super_L || mod == XK_Super_R)
return ECORE_EVENT_MODIFIER_WIN;
if (mod == XK_Scroll_Lock)
- return ECORE_EVENT_LOCK_SCROLL;
+ {
+ *is_lock = EINA_TRUE;
+ return ECORE_EVENT_LOCK_SCROLL;
+ }
if (mod == XK_Num_Lock)
- return ECORE_EVENT_LOCK_NUM;
+ {
+ *is_lock = EINA_TRUE;
+ return ECORE_EVENT_LOCK_NUM;
+ }
if (mod == XK_Caps_Lock)
- return ECORE_EVENT_LOCK_CAPS;
+ {
+ *is_lock = EINA_TRUE;
+ return ECORE_EVENT_LOCK_CAPS;
+ }
if (mod == XK_Shift_Lock)
- return ECORE_EVENT_LOCK_SHIFT;
+ {
+ *is_lock = EINA_TRUE;
+ return ECORE_EVENT_LOCK_SHIFT;
+ }
return 0;
}
@@ -360,11 +373,18 @@ _ecore_evas_vnc_server_client_keyboard_event(rfbBool down,
if (key >= XK_Shift_L && key <= XK_Hyper_R)
{
- int mod = _ecore_evas_vnc_server_modifier_to_ecore_modifier(key);
+ Eina_Bool is_lock;
+ int mod = _ecore_evas_vnc_server_modifier_to_ecore_modifier(key,
+ &is_lock);
if (down)
- cdata->key_modifiers |= mod;
- else
+ {
+ if (!is_lock || !(cdata->key_modifiers & mod))
+ cdata->key_modifiers |= mod;
+ else
+ cdata->key_modifiers &= ~mod;
+ }
+ else if (!is_lock)
cdata->key_modifiers &= ~mod;
}