forked from enlightenment/efl
Ecore Evas: Add support for multiple mouse positions.
Since it's possible to have more than one mouse, Ecore Evas must take into account the position of all mouses and update them correctly.
This commit is contained in:
parent
e5acc5604a
commit
044219226c
|
@ -3140,8 +3140,6 @@ _ecore_evas_mouse_move_process_internal(Ecore_Evas *ee,
|
||||||
Eina_Bool send_event = EINA_TRUE;
|
Eina_Bool send_event = EINA_TRUE;
|
||||||
Ecore_Evas_Cursor *cursor;
|
Ecore_Evas_Cursor *cursor;
|
||||||
int fx, fy, fw, fh, evt_x, evt_y;
|
int fx, fy, fw, fh, evt_x, evt_y;
|
||||||
ee->mouse.x = x;
|
|
||||||
ee->mouse.y = y;
|
|
||||||
|
|
||||||
evas_output_framespace_get(ee->evas, &fx, &fy, &fw, &fh);
|
evas_output_framespace_get(ee->evas, &fx, &fy, &fw, &fh);
|
||||||
|
|
||||||
|
@ -3149,6 +3147,8 @@ _ecore_evas_mouse_move_process_internal(Ecore_Evas *ee,
|
||||||
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
||||||
|
cursor->pos_x = x;
|
||||||
|
cursor->pos_y = y;
|
||||||
if (cursor->object)
|
if (cursor->object)
|
||||||
{
|
{
|
||||||
evas_object_show(cursor->object);
|
evas_object_show(cursor->object);
|
||||||
|
|
|
@ -194,6 +194,8 @@ struct _Ecore_Evas_Cursor {
|
||||||
struct {
|
struct {
|
||||||
int x, y;
|
int x, y;
|
||||||
} hot;
|
} hot;
|
||||||
|
int pos_x;
|
||||||
|
int pos_y;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _Ecore_Evas
|
struct _Ecore_Evas
|
||||||
|
@ -227,10 +229,6 @@ struct _Ecore_Evas
|
||||||
int changed : 1;
|
int changed : 1;
|
||||||
} shadow;
|
} shadow;
|
||||||
|
|
||||||
struct {
|
|
||||||
int x, y;
|
|
||||||
} mouse;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
int w, h;
|
int w, h;
|
||||||
} expecting_resize;
|
} expecting_resize;
|
||||||
|
|
|
@ -60,14 +60,13 @@ _ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y)
|
||||||
Ecore_Evas_Cursor *cursor;
|
Ecore_Evas_Cursor *cursor;
|
||||||
int fbw, fbh;
|
int fbw, fbh;
|
||||||
|
|
||||||
ee->mouse.x = x;
|
|
||||||
ee->mouse.y = y;
|
|
||||||
ecore_fb_size_get(&fbw, &fbh);
|
ecore_fb_size_get(&fbw, &fbh);
|
||||||
|
|
||||||
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
||||||
|
cursor->pos_x = x;
|
||||||
|
cursor->pos_y = y;
|
||||||
if (cursor->object)
|
if (cursor->object)
|
||||||
{
|
{
|
||||||
evas_object_show(cursor->object);
|
evas_object_show(cursor->object);
|
||||||
|
@ -361,9 +360,15 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, in
|
||||||
static void
|
static void
|
||||||
_ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize EINA_UNUSED)
|
_ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
Evas_Device *pointer;
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
Evas_Engine_Info_FB *einfo;
|
Evas_Engine_Info_FB *einfo;
|
||||||
int rot_dif;
|
int rot_dif;
|
||||||
|
|
||||||
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
||||||
|
|
||||||
if (ee->rotation == rotation) return;
|
if (ee->rotation == rotation) return;
|
||||||
einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
|
einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
|
||||||
if (!einfo) return;
|
if (!einfo) return;
|
||||||
|
@ -416,7 +421,7 @@ _ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize EINA_UNUSED)
|
||||||
else
|
else
|
||||||
evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
|
evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
|
||||||
|
|
||||||
_ecore_evas_mouse_move_process_fb(ee, ee->mouse.x, ee->mouse.y);
|
_ecore_evas_mouse_move_process_fb(ee, cursor->pos_x, cursor->pos_y);
|
||||||
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,8 @@ _ecore_evas_psl1ght_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event
|
||||||
static void
|
static void
|
||||||
_ecore_evas_screen_resized(Ecore_Evas *ee)
|
_ecore_evas_screen_resized(Ecore_Evas *ee)
|
||||||
{
|
{
|
||||||
|
Evas_Device *pointer;
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
/* Do not resize if the window is not fullscreen */
|
/* Do not resize if the window is not fullscreen */
|
||||||
|
@ -262,6 +264,10 @@ _ecore_evas_screen_resized(Ecore_Evas *ee)
|
||||||
|
|
||||||
ecore_psl1ght_screen_resolution_get (&w, &h);
|
ecore_psl1ght_screen_resolution_get (&w, &h);
|
||||||
|
|
||||||
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
||||||
|
|
||||||
if (w != ee->w || h != ee->h)
|
if (w != ee->w || h != ee->h)
|
||||||
{
|
{
|
||||||
ee->req.w = ee->w = w;
|
ee->req.w = ee->w = w;
|
||||||
|
@ -271,7 +277,7 @@ _ecore_evas_screen_resized(Ecore_Evas *ee)
|
||||||
ecore_psl1ght_resolution_set (w, h);
|
ecore_psl1ght_resolution_set (w, h);
|
||||||
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
|
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
|
||||||
|
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
_ecore_evas_time_get());
|
_ecore_evas_time_get());
|
||||||
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
}
|
}
|
||||||
|
|
|
@ -301,6 +301,20 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_mouse_move_dispatch(Ecore_Evas *ee)
|
||||||
|
{
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
|
Eina_Iterator *itr = eina_hash_iterator_data_new(ee->prop.cursors);
|
||||||
|
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(itr);
|
||||||
|
|
||||||
|
EINA_ITERATOR_FOREACH(itr, cursor)
|
||||||
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
|
ecore_loop_time_get());
|
||||||
|
eina_iterator_free(itr);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_rotation_do(Ecore_Evas *ee, int rotation, int resize)
|
_rotation_do(Ecore_Evas *ee, int rotation, int resize)
|
||||||
{
|
{
|
||||||
|
@ -422,8 +436,7 @@ _rotation_do(Ecore_Evas *ee, int rotation, int resize)
|
||||||
* Yes, it's required to update the mouse position, relatively to
|
* Yes, it's required to update the mouse position, relatively to
|
||||||
* widgets. After a rotation change, e.g., the mouse might not be over
|
* widgets. After a rotation change, e.g., the mouse might not be over
|
||||||
* a button anymore. */
|
* a button anymore. */
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_mouse_move_dispatch(ee);
|
||||||
ecore_loop_time_get());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -437,8 +450,7 @@ _rotation_do(Ecore_Evas *ee, int rotation, int resize)
|
||||||
*
|
*
|
||||||
* NB: Is This Really Needed ? Yes, it's required to update the mouse
|
* NB: Is This Really Needed ? Yes, it's required to update the mouse
|
||||||
* position, relatively to widgets. */
|
* position, relatively to widgets. */
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_mouse_move_dispatch(ee);
|
||||||
ecore_loop_time_get());
|
|
||||||
|
|
||||||
/* call the ecore_evas' resize function */
|
/* call the ecore_evas' resize function */
|
||||||
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
|
|
|
@ -371,9 +371,12 @@ _ecore_evas_win32_event_window_hide(void *data EINA_UNUSED, int type EINA_UNUSED
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_ecore_evas_win32_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
_ecore_evas_win32_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
||||||
{
|
{
|
||||||
|
Evas_Device *pointer;
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
Ecore_Win32_Event_Window_Configure *e;
|
Ecore_Win32_Event_Window_Configure *e;
|
||||||
|
|
||||||
|
|
||||||
INF("window configure");
|
INF("window configure");
|
||||||
|
|
||||||
e = event;
|
e = event;
|
||||||
|
@ -381,6 +384,10 @@ _ecore_evas_win32_event_window_configure(void *data EINA_UNUSED, int type EINA_U
|
||||||
if (!ee) return 1; /* pass on event */
|
if (!ee) return 1; /* pass on event */
|
||||||
if ((Ecore_Window)e->window != ee->prop.window) return 1;
|
if ((Ecore_Window)e->window != ee->prop.window) return 1;
|
||||||
|
|
||||||
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(cursor, 1);
|
||||||
|
|
||||||
if (ee->prop.override)
|
if (ee->prop.override)
|
||||||
{
|
{
|
||||||
if ((ee->x != e->x) || (ee->y != e->y))
|
if ((ee->x != e->x) || (ee->y != e->y))
|
||||||
|
@ -426,7 +433,7 @@ _ecore_evas_win32_event_window_configure(void *data EINA_UNUSED, int type EINA_U
|
||||||
{
|
{
|
||||||
if ((ee->expecting_resize.w == ee->w) &&
|
if ((ee->expecting_resize.w == ee->w) &&
|
||||||
(ee->expecting_resize.h == ee->h))
|
(ee->expecting_resize.h == ee->h))
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
ecore_win32_current_time_get());
|
ecore_win32_current_time_get());
|
||||||
ee->expecting_resize.w = 0;
|
ee->expecting_resize.w = 0;
|
||||||
ee->expecting_resize.h = 0;
|
ee->expecting_resize.h = 0;
|
||||||
|
@ -588,11 +595,17 @@ _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int heigh
|
||||||
static void
|
static void
|
||||||
_ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
|
_ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
|
||||||
{
|
{
|
||||||
|
Evas_Device *pointer;
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
int rot_dif;
|
int rot_dif;
|
||||||
|
|
||||||
rot_dif = ee->rotation - rotation;
|
rot_dif = ee->rotation - rotation;
|
||||||
if (rot_dif < 0) rot_dif = -rot_dif;
|
if (rot_dif < 0) rot_dif = -rot_dif;
|
||||||
|
|
||||||
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
||||||
|
|
||||||
if (rot_dif != 180)
|
if (rot_dif != 180)
|
||||||
{
|
{
|
||||||
int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
|
int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
|
||||||
|
@ -633,13 +646,13 @@ _ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
|
||||||
ecore_evas_size_max_set(ee, maxh, maxw);
|
ecore_evas_size_max_set(ee, maxh, maxw);
|
||||||
ecore_evas_size_base_set(ee, baseh, basew);
|
ecore_evas_size_base_set(ee, baseh, basew);
|
||||||
ecore_evas_size_step_set(ee, steph, stepw);
|
ecore_evas_size_step_set(ee, steph, stepw);
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
ecore_win32_current_time_get());
|
ecore_win32_current_time_get());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ee->rotation = rotation;
|
ee->rotation = rotation;
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
ecore_win32_current_time_get());
|
ecore_win32_current_time_get());
|
||||||
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1616,6 +1616,9 @@ _ecore_evas_x_shadow_update(Ecore_Evas *ee)
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
_ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Evas_Device *pointer;
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
Ecore_X_Event_Window_Configure *e;
|
Ecore_X_Event_Window_Configure *e;
|
||||||
Ecore_Evas_Engine_Data_X11 *edata;
|
Ecore_Evas_Engine_Data_X11 *edata;
|
||||||
|
@ -1628,6 +1631,10 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE
|
||||||
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
|
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
|
||||||
if (edata->direct_resize) return ECORE_CALLBACK_PASS_ON;
|
if (edata->direct_resize) return ECORE_CALLBACK_PASS_ON;
|
||||||
|
|
||||||
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN_VAL(cursor, ECORE_CALLBACK_PASS_ON);
|
||||||
|
|
||||||
if (edata->configure_reqs > 0) edata->configure_reqs--;
|
if (edata->configure_reqs > 0) edata->configure_reqs--;
|
||||||
|
|
||||||
edata->configure_coming = 0;
|
edata->configure_coming = 0;
|
||||||
|
@ -1684,7 +1691,7 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE
|
||||||
{
|
{
|
||||||
if ((ee->expecting_resize.w == ee->w) &&
|
if ((ee->expecting_resize.w == ee->w) &&
|
||||||
(ee->expecting_resize.h == ee->h))
|
(ee->expecting_resize.h == ee->h))
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
ecore_x_current_time_get());
|
ecore_x_current_time_get());
|
||||||
ee->expecting_resize.w = 0;
|
ee->expecting_resize.w = 0;
|
||||||
ee->expecting_resize.h = 0;
|
ee->expecting_resize.h = 0;
|
||||||
|
@ -2340,10 +2347,16 @@ static void
|
||||||
_ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
|
_ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
|
||||||
Evas_Engine_Info *einfo)
|
Evas_Engine_Info *einfo)
|
||||||
{
|
{
|
||||||
|
Evas_Device *pointer;
|
||||||
|
Ecore_Evas_Cursor *cursor;
|
||||||
int rot_dif;
|
int rot_dif;
|
||||||
Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
|
Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
|
||||||
int fw = 0, fh = 0;
|
int fw = 0, fh = 0;
|
||||||
|
|
||||||
|
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
|
||||||
|
cursor = eina_hash_find(ee->prop.cursors, &pointer);
|
||||||
|
EINA_SAFETY_ON_NULL_RETURN(cursor);
|
||||||
|
|
||||||
rot_dif = ee->rotation - rotation;
|
rot_dif = ee->rotation - rotation;
|
||||||
if (rot_dif < 0) rot_dif = -rot_dif;
|
if (rot_dif < 0) rot_dif = -rot_dif;
|
||||||
|
|
||||||
|
@ -2422,7 +2435,7 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
|
||||||
ecore_evas_size_max_set(ee, maxh, maxw);
|
ecore_evas_size_max_set(ee, maxh, maxw);
|
||||||
ecore_evas_size_base_set(ee, baseh, basew);
|
ecore_evas_size_base_set(ee, baseh, basew);
|
||||||
ecore_evas_size_step_set(ee, steph, stepw);
|
ecore_evas_size_step_set(ee, steph, stepw);
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
ecore_x_current_time_get());
|
ecore_x_current_time_get());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2432,7 +2445,7 @@ _ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
|
||||||
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
|
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
|
||||||
}
|
}
|
||||||
ee->rotation = rotation;
|
ee->rotation = rotation;
|
||||||
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
|
_ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y,
|
||||||
ecore_x_current_time_get());
|
ecore_x_current_time_get());
|
||||||
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
if (ee->func.fn_resize) ee->func.fn_resize(ee);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue