Merge branch 'devs/iscaro/ecore_evas_cursor'

This series add new APIs to get the pointer position and set the
pointer icon by device

Patches by Guilherme Iscaro <iscaro@profusion.mobi>

Reviewed By: bdilly, jpeg, zmike

Differential Revision: https://phab.enlightenment.org/D4450
This commit is contained in:
Bruno Dilly 2016-12-20 18:35:14 -02:00
commit e254e50ae5
23 changed files with 1005 additions and 666 deletions

View File

@ -20,6 +20,7 @@
/ecore_evas_buffer_example_01
/ecore_evas_buffer_example_02
/ecore_evas_callbacks
/ecore_evas_cursor_example
/ecore_evas_ews_example
/ecore_evas_extn_plug_example
/ecore_evas_extn_socket_example

View File

@ -57,9 +57,10 @@ ecore_con_url_ftp_example \
ecore_evas_basics_example \
ecore_evas_buffer_example_01 \
ecore_evas_buffer_example_02 \
ecore_evas_callbacks \
ecore_evas_cursor_example \
ecore_evas_extn_socket_example \
ecore_evas_extn_plug_example \
ecore_evas_callbacks \
ecore_evas_ews_example \
ecore_evas_object_example \
ecore_evas_wayland_multiseat_example \
@ -209,15 +210,18 @@ ecore_evas_buffer_example_01_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_buffer_example_02_SOURCES = ecore_evas_buffer_example_02.c
ecore_evas_buffer_example_02_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_callbacks_SOURCES = ecore_evas_callbacks.c
ecore_evas_callbacks_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_cursor_example_SOURCES = ecore_evas_cursor_example.c
ecore_evas_cursor_example_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_extn_socket_example_SOURCES = ecore_evas_extn_socket_example.c
ecore_evas_extn_socket_example_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_extn_plug_example_SOURCES = ecore_evas_extn_plug_example.c
ecore_evas_extn_plug_example_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_callbacks_SOURCES = ecore_evas_callbacks.c
ecore_evas_callbacks_LDADD = $(ECORE_EVAS_COMMON_LDADD)
ecore_evas_ews_example_SOURCES = ecore_evas_ews_example.c
ecore_evas_ews_example_LDADD = $(ECORE_EVAS_COMMON_LDADD)

View File

@ -0,0 +1,166 @@
/**
* Ecore Evas example illustrating how to set a new cursor image for a pointer device.
*
* @verbatim
* gcc -o ecore_evas_cursor_example ecore_evas_cursor_example.c `pkg-config --libs --cflags evas ecore ecore-evas`
* @endverbatim
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <Ecore.h>
#include <Ecore_Evas.h>
#include <Evas.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define W (200)
#define H (200)
#define TIMEOUT (1.0)
static void
_delete_request_cb(Ecore_Evas *ee EINA_UNUSED)
{
ecore_main_loop_quit();
}
static void
_resize_cb(Ecore_Evas *ee)
{
int w, h;
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
evas_object_resize(ecore_evas_data_get(ee, "bg"), w, h);
}
static Eina_Bool
_mouse_pos_print(void *data)
{
Efl_Input_Device *pointer;
const Eina_List *devs, *l;
devs = evas_device_list(ecore_evas_get(data), NULL);
EINA_LIST_FOREACH(devs, l, pointer)
{
Evas_Coord x, y;
Efl_Input_Device *seat;
if (efl_input_device_type_get(pointer) != EFL_INPUT_DEVICE_CLASS_MOUSE)
continue;
ecore_evas_pointer_device_xy_get(data, pointer, &x, &y);
seat = efl_input_device_seat_get(pointer);
if (!seat)
{
fprintf(stderr, "Could not fetch the seat from mouse '%s'\n",
efl_input_device_name_get(pointer));
continue;
}
printf("Mouse from seat '%s' is at (%d, %d)\n",
efl_input_device_name_get(seat), x, y);
}
return EINA_TRUE;
}
static void
_cursor_set(Ecore_Evas *ee, Efl_Input_Device *pointer)
{
Evas_Object *obj;
obj = evas_object_rectangle_add(ecore_evas_get(ee));
evas_object_color_set(obj, rand() % 256, rand() % 256, rand() % 256, 255);
evas_object_resize(obj, 30, 30);
evas_object_show(obj);
ecore_evas_object_cursor_device_set(ee, pointer, obj, 0, 10, 10);
}
static void
_device_added(void *data, const Efl_Event *event)
{
Efl_Input_Device *pointer = event->info;
Efl_Input_Device *seat;
if (efl_input_device_type_get(pointer) != EFL_INPUT_DEVICE_CLASS_MOUSE)
return;
seat = efl_input_device_seat_get(pointer);
if (!seat)
{
fprintf(stderr, "Could not fetch the seat from pointer '%s'\n",
efl_input_device_name_get(pointer));
return;
}
printf("Setting cursor image at seat '%s'\n", efl_input_device_name_get(seat));
_cursor_set(data, pointer);
}
int
main(int argc EINA_UNUSED, char *argv[] EINA_UNUSED)
{
const Eina_List *devs, *l;
Efl_Input_Device *pointer;
Ecore_Evas *ee;
Evas_Object *bg;
Evas *e;
Ecore_Timer *t;
const char *driver;
srand(time(NULL));
if (!ecore_evas_init())
{
fprintf(stderr, "Could not init the Ecore Evas\n");
return EXIT_FAILURE;
}
ee = ecore_evas_new(NULL, 0, 0, W, H, NULL);
if (!ee)
{
fprintf(stderr, "Could not create the Ecore Evas\n");
goto err_ee;
}
driver = ecore_evas_engine_name_get(ee);
printf("Using driver %s\n", driver);
if ((!strcmp(driver, "fb") || !strcmp(driver, "software_x11")) &&
!ecore_evas_vnc_start(ee, "localhost", -1, NULL, NULL, NULL))
{
fprintf(stderr, "Could not init the VNC server\n");
goto err_ee;
}
e = ecore_evas_get(ee);
bg = evas_object_rectangle_add(e);
evas_object_resize(bg, W, H);
evas_object_move(bg, 0, 0);
evas_object_color_set(bg, 255, 255, 255, 255);
evas_object_show(bg);
ecore_evas_data_set(ee, "bg", bg);
devs = evas_device_list(e, NULL);
EINA_LIST_FOREACH(devs, l, pointer)
{
if (efl_input_device_type_get(pointer) != EFL_INPUT_DEVICE_CLASS_MOUSE)
continue;
_cursor_set(ee, pointer);
}
t = ecore_timer_add(TIMEOUT, _mouse_pos_print, ee);
efl_event_callback_add(e, EFL_CANVAS_EVENT_DEVICE_ADDED,
_device_added, ee);
ecore_evas_callback_resize_set(ee, _resize_cb);
ecore_evas_callback_delete_request_set(ee, _delete_request_cb);
ecore_evas_show(ee);
ecore_main_loop_begin();
ecore_evas_free(ee);
ecore_timer_del(t);
ecore_evas_shutdown();
return EXIT_SUCCESS;
err_ee:
ecore_evas_shutdown();
return EXIT_FAILURE;
}

View File

@ -2143,7 +2143,7 @@ EAPI void ecore_evas_size_step_set(Ecore_Evas *ee, int w, int h);
EAPI void ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h);
/**
* @brief Set the cursor of an Ecore_Evas.
* @brief Set the cursor for the default pointer device.
*
* @param ee The Ecore_Evas
* @param file The path to an image file for the cursor.
@ -2166,9 +2166,9 @@ EAPI void ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h);
*/
EAPI void ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y);
/**
* @brief Get information about an Ecore_Evas' cursor
* @brief Get information about an Ecore_Evas' default pointer device.
*
* @param ee The Ecore_Evas to set
* @param ee The Ecore_Evas to get
* @param obj A pointer to an Evas_Object to place the cursor Evas_Object.
* @param layer A pointer to an int to place the cursor's layer in.
* @param hot_x A pointer to an int to place the cursor's hot_x coordinate in.
@ -2183,10 +2183,9 @@ EAPI void ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int lay
EAPI void ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y);
/**
* @brief Set the cursor of an Ecore_Evas
* @brief Set the cursor for the default pointer device.
*
* @param ee The Ecore_Evas
*
* @param obj The Evas_Object which will be the cursor.
* @param layer The layer in which the cursor will appear.
* @param hot_x The x coordinate of the cursor's hot spot.
@ -2202,7 +2201,7 @@ EAPI void ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj,
EAPI void ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y);
/**
* @brief Unset the Ecore_Evas cursor
* @brief Unset the cursor of the default pointer device.
*
* @param ee The Ecore_Evas to unset the cursor.
*
@ -2217,6 +2216,45 @@ EAPI void ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj,
*/
EAPI Evas_Object* ecore_evas_cursor_unset(Ecore_Evas *ee);
/**
* @brief Set the cursor of an Ecore_Evas specified pointer device.
*
* @param ee The Ecore_Evas
* @param pointer A pointer device to set the cursor. Use @c NULL for the default.
* @param obj The Evas_Object which will be the cursor.
* @param layer The layer in which the cursor will appear.
* @param hot_x The x coordinate of the cursor's hot spot.
* @param hot_y The y coordinate of the cursor's hot spot.
*
* This function makes the mouse cursor over @p ee be the object specified by
* @p obj. The actual point within the object that the mouse is at is specified
* by @p hot_x and @p hot_y, which are coordinates with respect to the top left
* corner of the cursor object. Cursor object will be delete with the Ecore_Evas.
*
* @since 1.19
*/
EAPI void ecore_evas_object_cursor_device_set(Ecore_Evas *ee, Efl_Input_Device *pointer,
Evas_Object *obj, int layer,
int hot_x, int hot_y);
/**
* @brief Get information about an Ecore_Evas' specified pointer device.
*
* @param ee The Ecore_Evas
* @param pointer A pointer device to set the cursor. Use @c NULL for the default.
* @param obj A pointer to an Evas_Object to place the cursor Evas_Object.
* @param layer A pointer to an int to place the cursor's layer in.
* @param hot_x A pointer to an int to place the cursor's hot_x coordinate in.
* @param hot_y A pointer to an int to place the cursor's hot_y coordinate in.
*
* This function queries information about an Ecore_Evas' cursor.
*
* @see ecore_evas_cursor_device_set()
* @since 1.19
*/
EAPI Eina_Bool ecore_evas_cursor_device_get(const Ecore_Evas *ee, Efl_Input_Device *pointer,
Evas_Object **obj, int *layer,
int *hot_x, int *hot_y);
/**
* @brief Tell the WM whether or not to ignore an Ecore_Evas' window
*
@ -2917,12 +2955,13 @@ EAPI Evas_Object *ecore_evas_extn_plug_new(Ecore_Evas *ee_target);
EAPI Eina_Bool ecore_evas_extn_plug_connect(Evas_Object *obj, const char *svcname, int svcnum, Eina_Bool svcsys);
/**
* @brief Retrieve the coordinates of the mouse pointer
* @brief Retrieve the coordinates of the default mouse pointer
*
* @param ee The Ecore_Evas containing the pointer
* @param x Pointer to integer to store horizontal coordinate. May be @c NULL.
* @param y Pointer to integer to store vertical coordinate. May be @c NULL.
*
* @see ecore_evas_pointer_device_xy_get
* @since 1.8
*/
EAPI void ecore_evas_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y);
@ -2940,6 +2979,17 @@ EAPI void ecore_evas_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Co
*/
EAPI Eina_Bool ecore_evas_pointer_warp(const Ecore_Evas *ee, Evas_Coord x, Evas_Coord y);
/**
* @brief Retrieve the coordinates of the mouse pointer
*
* @param ee The Ecore_Evas containing the pointer
* @param pointer The pointer device, use @c NULL for the default pointer.
* @param x Pointer to integer to store horizontal coordinate. May be @c NULL.
* @param y Pointer to integer to store vertical coordinate. May be @c NULL.
* @since 1.19
*/
EAPI void ecore_evas_pointer_device_xy_get(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y);
/**
* @brief Retrieve the Visual used for pixmap creation
*

View File

@ -51,6 +51,13 @@
return __VA_ARGS__; \
}
#define ECORE_EVAS_CHECK_GOTO(_ee, _label) \
if (!ECORE_MAGIC_CHECK(_ee, ECORE_MAGIC_EVAS)) \
{ \
ECORE_MAGIC_FAIL(_ee, ECORE_MAGIC_EVAS, __FUNCTION__); \
goto _label; \
}
EAPI Eina_Bool _ecore_evas_app_comp_sync = EINA_FALSE;
EAPI int _ecore_evas_log_dom = -1;
static int _ecore_evas_init_count = 0;
@ -62,6 +69,8 @@ static Ecore_Idle_Enterer *ecore_evas_idle_enterer = NULL;
static Ecore_Evas *ecore_evases = NULL;
static int _ecore_evas_fps_debug = 0;
static const Efl_Event_Description *_event_description_get(Efl_Pointer_Action action);
//RENDER_SYNC
static int _ecore_evas_render_sync = 1;
@ -246,6 +255,87 @@ _ecore_evas_idle_enter(void *data EINA_UNUSED)
return ECORE_CALLBACK_RENEW;
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ecore_Evas_Cursor *cursor = data;
cursor->object = NULL;
}
static void
_ecore_evas_cursor_element_del(Ecore_Evas_Cursor *cursor)
{
if (cursor->object)
{
evas_object_event_callback_del_full(cursor->object, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del,
cursor);
evas_object_del(cursor->object);
}
free(cursor);
}
static void
_ecore_evas_cursor_add(Ecore_Evas *ee, Efl_Input_Device *dev)
{
Ecore_Evas_Cursor *cursor = calloc(1, sizeof(Ecore_Evas_Cursor));
EINA_SAFETY_ON_NULL_RETURN(cursor);
eina_hash_add(ee->prop.cursors, &dev, cursor);
if (ee->prop.cursor_cache.object)
{
ecore_evas_object_cursor_device_set(ee, dev,
ee->prop.cursor_cache.object,
ee->prop.cursor_cache.layer,
ee->prop.cursor_cache.hot.x,
ee->prop.cursor_cache.hot.y);
memset(&ee->prop.cursor_cache, 0, sizeof(Ecore_Evas_Cursor));
}
}
static void
_ecore_evas_dev_added_or_removed(void *data, const Efl_Event *event)
{
Ecore_Evas *ee = data;
if (efl_input_device_type_get(event->info) != EFL_INPUT_DEVICE_CLASS_MOUSE)
return;
if (event->desc == EFL_CANVAS_EVENT_DEVICE_ADDED)
_ecore_evas_cursor_add(ee, event->info);
else
eina_hash_del_by_key(ee->prop.cursors, &event->info);
}
EFL_CALLBACKS_ARRAY_DEFINE(_ecore_evas_device_cbs,
{ EFL_CANVAS_EVENT_DEVICE_ADDED, _ecore_evas_dev_added_or_removed },
{ EFL_CANVAS_EVENT_DEVICE_REMOVED, _ecore_evas_dev_added_or_removed });
Eina_Bool
_ecore_evas_cursors_init(Ecore_Evas *ee)
{
const Eina_List *devs, *l;
Efl_Input_Device *dev;
EINA_SAFETY_ON_NULL_RETURN_VAL(ee, EINA_FALSE);
ee->prop.cursors = eina_hash_pointer_new(EINA_FREE_CB(_ecore_evas_cursor_element_del));
EINA_SAFETY_ON_NULL_RETURN_VAL(ee->prop.cursors, EINA_FALSE);
devs = evas_device_list(ee->evas, NULL);
EINA_LIST_FOREACH(devs, l, dev)
{
if (efl_input_device_type_get(dev) != EFL_INPUT_DEVICE_CLASS_MOUSE)
continue;
_ecore_evas_cursor_add(ee, dev);
}
efl_event_callback_array_priority_add(ee->evas, _ecore_evas_device_cbs(),
EFL_CALLBACK_PRIORITY_BEFORE, ee);
return EINA_TRUE;
}
EAPI Ecore_Evas_Interface *
_ecore_evas_interface_get(const Ecore_Evas *ee, const char *iname)
{
@ -1534,13 +1624,106 @@ ecore_evas_size_step_get(const Ecore_Evas *ee, int *w, int *h)
}
}
EAPI void
ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, int hot_y)
EAPI Evas_Object *
_ecore_evas_default_cursor_image_get(Ecore_Evas *ee)
{
Evas_Object *obj = NULL;
Efl_Input_Device *pointer;
Ecore_Evas_Cursor *cursor;
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, NULL);
return cursor->object;
}
EAPI void
_ecore_evas_default_cursor_hide(Ecore_Evas *ee)
{
Efl_Input_Device *pointer;
Ecore_Evas_Cursor *cursor;
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 (cursor->object)
evas_object_hide(cursor->object);
}
static void
_ecore_evas_object_cursor_device_set(Ecore_Evas *ee, Efl_Input_Device *pointer,
Evas_Object *obj, int layer,
int hot_x, int hot_y)
{
Ecore_Evas_Cursor *cursor;
int x, y;
Evas_Object *old;
ECORE_EVAS_CHECK(ee);
if (!pointer)
{
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
if (!pointer)
{
ee->prop.cursor_cache.object = obj;
ee->prop.cursor_cache.layer = layer;
ee->prop.cursor_cache.hot.x = hot_x;
ee->prop.cursor_cache.hot.y = hot_y;
return;
}
}
if (obj && ee->engine.func->fn_object_cursor_set)
ee->engine.func->fn_object_cursor_set(ee, obj, layer, hot_x, hot_y);
else if (!obj && ee->engine.func->fn_object_cursor_unset)
ee->engine.func->fn_object_cursor_unset(ee);
cursor = eina_hash_find(ee->prop.cursors, &pointer);
EINA_SAFETY_ON_NULL_RETURN(cursor);
old = cursor->object;
if (!obj)
{
cursor->object = NULL;
cursor->layer = 0;
cursor->hot.x = 0;
cursor->hot.y = 0;
goto end;
}
cursor->object = obj;
cursor->layer = layer;
cursor->hot.x = hot_x;
cursor->hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
evas_object_layer_set(cursor->object, cursor->layer);
evas_object_pass_events_set(cursor->object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(cursor->object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, cursor);
}
evas_object_move(cursor->object, x - cursor->hot.x,
y - cursor->hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, cursor);
evas_object_del(old);
}
}
EAPI void
ecore_evas_cursor_set(Ecore_Evas *ee, const char *file,
int layer, int hot_x, int hot_y)
{
Evas_Object *obj = NULL;
if (file)
{
int x, y;
@ -1552,41 +1735,82 @@ ecore_evas_cursor_set(Ecore_Evas *ee, const char *file, int layer, int hot_x, in
evas_object_image_fill_set(obj, 0, 0, x, y);
}
IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
IFE;
_ecore_evas_object_cursor_device_set(ee, NULL, obj, layer, hot_x, hot_y);
}
EAPI void
ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj,
int layer, int hot_x, int hot_y)
{
ECORE_EVAS_CHECK(ee);
IFC(ee, fn_object_cursor_set) (ee, obj, layer, hot_x, hot_y);
IFE;
_ecore_evas_object_cursor_device_set(ee, NULL, obj, layer, hot_x, hot_y);
}
EAPI void
ecore_evas_object_cursor_device_set(Ecore_Evas *ee, Efl_Input_Device *pointer,
Evas_Object *obj, int layer,
int hot_x, int hot_y)
{
_ecore_evas_object_cursor_device_set(ee, pointer, obj, layer, hot_x, hot_y);
}
EAPI Eina_Bool
ecore_evas_cursor_device_get(const Ecore_Evas *ee, Efl_Input_Device *pointer,
Evas_Object **obj, int *layer,
int *hot_x, int *hot_y)
{
Ecore_Evas_Cursor *cursor;
ECORE_EVAS_CHECK_GOTO(ee, err);
if (!pointer)
pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE);
if (pointer)
{
cursor = eina_hash_find(ee->prop.cursors, &pointer);
if (cursor)
{
if (obj) *obj = cursor->object;
if (layer) *layer = cursor->layer;
if (hot_x) *hot_x = cursor->hot.x;
if (hot_y) *hot_y = cursor->hot.y;
return EINA_TRUE;
}
}
err:
if (obj) *obj = NULL;
if (layer) *layer = 0;
if (hot_x) *hot_x = 0;
if (hot_y) *hot_y = 0;
return EINA_FALSE;
}
EAPI void
ecore_evas_cursor_get(const Ecore_Evas *ee, Evas_Object **obj, int *layer, int *hot_x, int *hot_y)
{
ECORE_EVAS_CHECK(ee);
if (obj) *obj = ee->prop.cursor.object;
if (layer) *layer = ee->prop.cursor.layer;
if (hot_x) *hot_x = ee->prop.cursor.hot.x;
if (hot_y) *hot_y = ee->prop.cursor.hot.y;
ecore_evas_cursor_device_get(ee, NULL, obj, layer, hot_x, hot_y);
}
EAPI Evas_Object *
ecore_evas_cursor_unset(Ecore_Evas *ee)
{
Ecore_Evas_Cursor *cursor;
Efl_Input_Device *pointer;
Evas_Object *obj;
ECORE_EVAS_CHECK(ee, NULL);
obj = ee->prop.cursor.object;
IFC(ee, fn_object_cursor_unset) (ee);
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, NULL);
obj = cursor->object;
if (ee->engine.func->fn_object_cursor_unset)
ee->engine.func->fn_object_cursor_unset(ee);
evas_object_hide(obj);
ee->prop.cursor.object = NULL;
}
cursor->object = NULL;
evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del,
cursor);
return obj;
}
@ -2381,6 +2605,36 @@ ecore_evas_pointer_warp(const Ecore_Evas *ee, Evas_Coord x, Evas_Coord y)
return EINA_FALSE;
}
EAPI void
ecore_evas_pointer_device_xy_get(const Ecore_Evas *ee,
const Efl_Input_Device *pointer, Evas_Coord *x,
Evas_Coord *y)
{
if ((!pointer) ||
(pointer == evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_CLASS_MOUSE)))
ecore_evas_pointer_xy_get(ee, x, y);
else
{
if (x) *x = 0;
if (y) *y = 0;
ECORE_EVAS_CHECK(ee);
if (ee->vnc_server)
{
Eina_Module *mod;
void (*pointer_xy_get)(const void *, const Efl_Input_Device *, Evas_Coord *, Evas_Coord *y);
mod = _ecore_evas_vnc_server_module_load();
EINA_SAFETY_ON_NULL_RETURN(mod);
pointer_xy_get = eina_module_symbol_get(mod, "ecore_evas_vnc_server_pointer_xy_get");
EINA_SAFETY_ON_NULL_RETURN(pointer_xy_get);
pointer_xy_get(ee->vnc_server, pointer, x, y);
}
else if (ee->engine.func->fn_pointer_device_xy_get)
ee->engine.func->fn_pointer_device_xy_get(ee, pointer, x, y);
}
}
EAPI void *
ecore_evas_pixmap_visual_get(const Ecore_Evas *ee)
{
@ -2824,8 +3078,9 @@ _ecore_evas_free(Ecore_Evas *ee)
ecore_timer_del(ee->prop.wm_rot.manual_mode.timer);
_ecore_evas_aux_hint_free(ee);
ee->prop.wm_rot.manual_mode.timer = NULL;
if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
ee->prop.cursor.object = NULL;
efl_event_callback_array_del(ee->evas, _ecore_evas_device_cbs(), ee);
eina_hash_free(ee->prop.cursors);
ee->prop.cursors = NULL;
if (ee->evas) evas_free(ee->evas);
ee->evas = NULL;
ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE);
@ -2875,49 +3130,98 @@ _ecore_evas_idle_timeout_update(Ecore_Evas *ee)
}
static void
_ecore_evas_mouse_move_process_internal(Ecore_Evas *ee, int x, int y, unsigned int timestamp, Eina_Bool feed)
_ecore_evas_mouse_move_process_internal(Ecore_Evas *ee,
Efl_Input_Device *pointer,
int x, int y, unsigned int timestamp,
Eina_Bool feed)
{
int fx, fy, fw, fh;
ee->mouse.x = x;
ee->mouse.y = y;
Efl_Input_Pointer_Data *ev;
Efl_Input_Pointer *evt;
Eina_Bool send_event = EINA_TRUE;
Ecore_Evas_Cursor *cursor;
int fx, fy, fw, fh, evt_x, evt_y;
evas_output_framespace_get(ee->evas, &fx, &fy, &fw, &fh);
if (ee->prop.cursor.object)
if (!pointer)
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);
cursor->pos_x = x;
cursor->pos_y = y;
if (cursor->object)
{
evas_object_show(ee->prop.cursor.object);
evas_object_show(cursor->object);
if (ee->rotation == 0)
evas_object_move(ee->prop.cursor.object,
x - fx - ee->prop.cursor.hot.x,
y - fy - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
x - fx - cursor->hot.x,
y - fy - cursor->hot.y);
else if (ee->rotation == 90)
evas_object_move(ee->prop.cursor.object,
ee->h + fw - y - fx - 1 - ee->prop.cursor.hot.x,
x - fy - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
ee->h + fw - y - fx - 1 - cursor->hot.x,
x - fy - cursor->hot.y);
else if (ee->rotation == 180)
evas_object_move(ee->prop.cursor.object,
ee->w + fw - x - fx - 1 - ee->prop.cursor.hot.x,
ee->h + fh - y - fy - 1 - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
ee->w + fw - x - fx - 1 - cursor->hot.x,
ee->h + fh - y - fy - 1 - cursor->hot.y);
else if (ee->rotation == 270)
evas_object_move(ee->prop.cursor.object,
y - fx - ee->prop.cursor.hot.x,
ee->w + fh - x - fy - 1 - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
y - fx - cursor->hot.x,
ee->w + fh - x - fy - 1 - cursor->hot.y);
}
if (!feed) return;
if (ee->rotation == 0)
evas_event_input_mouse_move(ee->evas, x, y, timestamp, NULL);
{
evt_x = x;
evt_y = y;
}
else if (ee->rotation == 90)
evas_event_input_mouse_move(ee->evas, ee->h + fw - y - 1, x, timestamp, NULL);
{
evt_x = ee->h + fw - y - 1;
evt_y = x;
}
else if (ee->rotation == 180)
evas_event_input_mouse_move(ee->evas, ee->w + fw - x - 1, ee->h + fh - y - 1, timestamp, NULL);
{
evt_x = ee->w + fw - x - 1;
evt_y = ee->h + fh - y - 1;
}
else if (ee->rotation == 270)
evas_event_input_mouse_move(ee->evas, y, ee->w + fh - x - 1, timestamp, NULL);
{
evt_x = y;
evt_y = ee->w + fh - x - 1;
}
else
send_event = EINA_FALSE;
if (!send_event) return;
evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, ee->evas, (void **) &ev);
if (!evt) return;
ev->action = EFL_POINTER_ACTION_MOVE;
ev->device = efl_ref(pointer);
ev->timestamp = timestamp;
ev->cur.x = evt_x;
ev->cur.y = evt_y;
efl_event_callback_legacy_call(ee->evas,
_event_description_get(ev->action), evt);
efl_del(evt);
}
EAPI void
_ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
{
_ecore_evas_mouse_move_process_internal(ee, x, y, timestamp, EINA_TRUE);
_ecore_evas_mouse_move_process_internal(ee, NULL, x, y, timestamp,
EINA_TRUE);
}
EAPI void
_ecore_evas_mouse_device_move_process(Ecore_Evas *ee, Efl_Input_Device *pointer,
int x, int y, unsigned int timestamp)
{
_ecore_evas_mouse_move_process_internal(ee, pointer, x, y, timestamp,
EINA_TRUE);
}
EAPI void
@ -3174,6 +3478,7 @@ _ecore_evas_aux_hint_free(Ecore_Evas *ee)
EAPI Ecore_Evas *
ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("fb");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3181,12 +3486,19 @@ ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
new = eina_module_symbol_get(m, "ecore_evas_fb_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, rotation, w, h);
ee = new(disp_name, rotation, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("x");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3194,7 +3506,13 @@ ecore_evas_software_x11_new(const char *disp_name, Ecore_X_Window parent, int x,
new = eina_module_symbol_get(m, "ecore_evas_software_x11_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h);
ee = new(disp_name, parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_X_Window
@ -3240,6 +3558,7 @@ ecore_evas_software_x11_extra_event_window_add(Ecore_Evas *ee, Ecore_X_Window wi
EAPI Ecore_Evas *
ecore_evas_software_x11_pixmap_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("x");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3247,7 +3566,14 @@ ecore_evas_software_x11_pixmap_new(const char *disp_name, Ecore_X_Window parent,
new = eina_module_symbol_get(m, "ecore_evas_software_x11_pixmap_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h);
ee = new(disp_name, parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_X_Pixmap
@ -3266,6 +3592,7 @@ ecore_evas_software_x11_pixmap_get(const Ecore_Evas *ee)
EAPI Ecore_Evas *
ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("x");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3273,12 +3600,20 @@ ecore_evas_gl_x11_new(const char *disp_name, Ecore_X_Window parent, int x, int y
new = eina_module_symbol_get(m, "ecore_evas_gl_x11_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h);
ee = new(disp_name, parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h, const int *opt)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int, const int*);
Eina_Module *m = _ecore_evas_engine_load("x");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3286,12 +3621,19 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent, int
new = eina_module_symbol_get(m, "ecore_evas_gl_x11_options_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h, opt);
ee = new(disp_name, parent, x, y, w, h, opt);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_gl_x11_pixmap_new(const char *disp_name, Ecore_X_Window parent, int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, Ecore_X_Window, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("x");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3299,7 +3641,14 @@ ecore_evas_gl_x11_pixmap_new(const char *disp_name, Ecore_X_Window parent, int x
new = eina_module_symbol_get(m, "ecore_evas_gl_x11_pixmap_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h);
ee = new(disp_name, parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_X_Pixmap
@ -3495,6 +3844,7 @@ ecore_evas_vnc_stop(Ecore_Evas *ee)
EAPI Ecore_Evas *
ecore_evas_extn_socket_new(int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(int, int);
Eina_Module *m = _ecore_evas_engine_load("extn");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3502,7 +3852,14 @@ ecore_evas_extn_socket_new(int w, int h)
new = eina_module_symbol_get(m, "ecore_evas_extn_socket_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(w, h);
ee = new(w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Eina_Bool
@ -3605,6 +3962,7 @@ EAPI Ecore_Evas *
ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen,
int hwsurface, int noframe, int alpha)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, int, int, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("sdl");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3612,13 +3970,20 @@ ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen,
new = eina_module_symbol_get(m, "ecore_evas_sdl_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(name, w, h, fullscreen, hwsurface, noframe, alpha);
ee = new(name, w, h, fullscreen, hwsurface, noframe, alpha);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen,
int hwsurface, int noframe, int alpha)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, int, int, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("sdl");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3626,12 +3991,19 @@ ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen,
new = eina_module_symbol_get(m, "ecore_evas_sdl16_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(name, w, h, fullscreen, hwsurface, noframe, alpha);
ee = new(name, w, h, fullscreen, hwsurface, noframe, alpha);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int noframe)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("sdl");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3639,13 +4011,20 @@ ecore_evas_gl_sdl_new(const char* name, int w, int h, int fullscreen, int nofram
new = eina_module_symbol_get(m, "ecore_evas_gl_sdl_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(name, w, h, fullscreen, noframe);
ee = new(name, w, h, fullscreen, noframe);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent,
int x, int y, int w, int h, Eina_Bool frame)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool);
Eina_Module *m = _ecore_evas_engine_load("wayland");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3653,13 +4032,20 @@ ecore_evas_wayland_shm_new(const char *disp_name, unsigned int parent,
new = eina_module_symbol_get(m, "ecore_evas_wayland_shm_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h, frame);
ee = new(disp_name, parent, x, y, w, h, frame);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent,
int x, int y, int w, int h, Eina_Bool frame)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int, Eina_Bool);
Eina_Module *m = _ecore_evas_engine_load("wayland");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3667,7 +4053,13 @@ ecore_evas_wayland_egl_new(const char *disp_name, unsigned int parent,
new = eina_module_symbol_get(m, "ecore_evas_wayland_egl_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h, frame);
ee = new(disp_name, parent, x, y, w, h, frame);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI void
@ -3743,6 +4135,7 @@ EAPI Ecore_Evas *
ecore_evas_drm_new(const char *disp_name, unsigned int parent,
int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("drm");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3750,13 +4143,20 @@ ecore_evas_drm_new(const char *disp_name, unsigned int parent,
new = eina_module_symbol_get(m, "ecore_evas_drm_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h);
ee = new(disp_name, parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_gl_drm_new(const char *disp_name, unsigned int parent,
int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char *, unsigned int, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("drm");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3764,7 +4164,14 @@ ecore_evas_gl_drm_new(const char *disp_name, unsigned int parent,
new = eina_module_symbol_get(m, "ecore_evas_gl_drm_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(disp_name, parent, x, y, w, h);
ee = new(disp_name, parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
@ -3774,6 +4181,7 @@ ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
int width,
int height)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("win32");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3781,7 +4189,14 @@ ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
new = eina_module_symbol_get(m, "ecore_evas_software_gdi_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(parent, x, y, width, height);
ee = new(parent, x, y, width, height);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
@ -3791,6 +4206,7 @@ ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
int width,
int height)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(Ecore_Win32_Window *, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("win32");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3798,7 +4214,13 @@ ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
new = eina_module_symbol_get(m, "ecore_evas_software_ddraw_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(parent, x, y, width, height);
ee = new(parent, x, y, width, height);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Win32_Window *
@ -3814,6 +4236,7 @@ ecore_evas_win32_window_get(const Ecore_Evas *ee)
EAPI Ecore_Evas *
ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(Ecore_Cocoa_Window *, int, int, int, int);
Eina_Module *m = _ecore_evas_engine_load("cocoa");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3821,12 +4244,19 @@ ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
new = eina_module_symbol_get(m, "ecore_evas_cocoa_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(parent, x, y, w, h);
ee = new(parent, x, y, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
EAPI Ecore_Evas *
ecore_evas_psl1ght_new(const char* name, int w, int h)
{
Ecore_Evas *ee;
Ecore_Evas *(*new)(const char*, int, int);
Eina_Module *m = _ecore_evas_engine_load("psl1ght");
EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL);
@ -3834,7 +4264,13 @@ ecore_evas_psl1ght_new(const char* name, int w, int h)
new = eina_module_symbol_get(m, "ecore_evas_psl1ght_new_internal");
EINA_SAFETY_ON_NULL_RETURN_VAL(new, NULL);
return new(name, w, h);
ee = new(name, w, h);
if (!_ecore_evas_cursors_init(ee))
{
ecore_evas_free(ee);
return NULL;
}
return ee;
}
@ -3966,7 +4402,8 @@ _direct_mouse_move_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Move *info)
Evas *e = ee->evas;
Eina_Bool processed;
_ecore_evas_mouse_move_process_internal(ee, info->x, info->y, info->timestamp, EINA_FALSE);
_ecore_evas_mouse_move_process_internal(ee, info->dev, info->x, info->y,
info->timestamp, EINA_FALSE);
/* Unused information:
* same_screen

View File

@ -607,6 +607,7 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
static void *
@ -720,6 +721,11 @@ ecore_evas_buffer_allocfunc_new(int w, int h,
evas_key_lock_add(ee->evas, "Num_Lock");
evas_key_lock_add(ee->evas, "Scroll_Lock");
if (!_ecore_evas_cursors_init(ee))
{
ERR("Could not init the Ecore Evas cursors");
ecore_evas_free(ee);
}
evas_event_feed_mouse_in(ee->evas, 0, NULL);
_ecore_evas_register(ee);

View File

@ -400,50 +400,10 @@ _ecore_evas_ews_size_step_set(Ecore_Evas *ee, int w, int h)
}
static void
_ecore_evas_ews_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
_ecore_evas_ews_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj EINA_UNUSED,
int layer EINA_UNUSED, int hot_x EINA_UNUSED,
int hot_y EINA_UNUSED)
{
Ecore_Evas *ee = data;
ee->prop.cursor.object = NULL;
}
static void
_ecore_evas_ews_object_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_ews_object_cursor_del, ee);
}
static void
_ecore_evas_ews_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y;
if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
if (!obj)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
return;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_move(ee->prop.cursor.object,
x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add
(obj, EVAS_CALLBACK_DEL, _ecore_evas_ews_object_cursor_del, ee);
_ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
}
@ -670,7 +630,7 @@ static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
_ecore_evas_ews_size_base_set,
_ecore_evas_ews_size_step_set,
_ecore_evas_ews_object_cursor_set,
_ecore_evas_ews_object_cursor_unset,
NULL,
_ecore_evas_ews_layer_set,
_ecore_evas_ews_focus_set,
_ecore_evas_ews_iconified_set,
@ -719,6 +679,7 @@ static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
void
@ -882,7 +843,7 @@ _ecore_evas_ews_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj E
if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
_ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
_ecore_evas_default_cursor_hide(ee);
_ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
}
@ -1260,6 +1221,12 @@ ecore_evas_ews_new(int x, int y, int w, int h)
evas_key_lock_add(ee->evas, "Num_Lock");
evas_key_lock_add(ee->evas, "Scroll_Lock");
if (!_ecore_evas_cursors_init(ee))
{
ERR("Could not init the Ecore Evas cursors");
ecore_evas_free(ee);
}
_ews_ee->sub_ecore_evas = eina_list_append(_ews_ee->sub_ecore_evas, ee);
_ews_children = eina_list_append(_ews_children, ee);

View File

@ -76,6 +76,7 @@ typedef struct _Ecore_Evas_Engine Ecore_Evas_Engine;
typedef struct _Ecore_Evas_Engine_Func Ecore_Evas_Engine_Func;
typedef struct _Ecore_Evas_Interface Ecore_Evas_Interface;
typedef struct _Ecore_Evas_Aux_Hint Ecore_Evas_Aux_Hint;
typedef struct _Ecore_Evas_Cursor Ecore_Evas_Cursor;
/* Engines interfaces */
struct _Ecore_Evas_Engine_Func
@ -165,6 +166,7 @@ struct _Ecore_Evas_Engine_Func
void (*fn_callback_device_mouse_in_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func);
void (*fn_callback_device_mouse_out_set) (Ecore_Evas *ee, Ecore_Evas_Mouse_IO_Cb func);
void (*fn_pointer_device_xy_get)(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y);
};
struct _Ecore_Evas_Interface
@ -186,6 +188,16 @@ struct _Ecore_Evas_Engine
#endif
};
struct _Ecore_Evas_Cursor {
Evas_Object *object;
int layer;
struct {
int x, y;
} hot;
int pos_x;
int pos_y;
};
struct _Ecore_Evas
{
EINA_INLIST;
@ -217,15 +229,12 @@ struct _Ecore_Evas
int changed : 1;
} shadow;
struct {
int x, y;
} mouse;
struct {
int w, h;
} expecting_resize;
struct {
Eina_Hash *cursors;
char *title;
char *name;
char *clas;
@ -237,13 +246,7 @@ struct _Ecore_Evas
struct {
int w, h;
} min, max, base, step;
struct {
Evas_Object *object;
int layer;
struct {
int x, y;
} hot;
} cursor;
Ecore_Evas_Cursor cursor_cache;
struct {
Eina_Bool supported; // indicate that the underlying window system supports window manager rotation protocol
Eina_Bool app_set; // indicate that the ee supports window manager rotation protocol
@ -389,6 +392,8 @@ EAPI void _ecore_evas_register_animators(Ecore_Evas *ee);
EAPI void _ecore_evas_free(Ecore_Evas *ee);
EAPI void _ecore_evas_idle_timeout_update(Ecore_Evas *ee);
EAPI void _ecore_evas_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp);
EAPI void _ecore_evas_mouse_device_move_process(Ecore_Evas *ee, Efl_Input_Device *pointer,
int x, int y, unsigned int timestamp);
EAPI void _ecore_evas_mouse_multi_move_process(Ecore_Evas *ee, int device,
int x, int y,
double radius,
@ -456,13 +461,18 @@ EAPI void ecore_evas_animator_tick(Ecore_Evas *ee, Eina_Rectangle *viewport, dou
Eina_Module *_ecore_evas_vnc_server_module_load(void);
EAPI void _ecore_evas_focus_device_set(Ecore_Evas *ee, Efl_Input_Device *seat,
Eina_Bool on);
EAPI Eina_Bool _ecore_evas_mouse_in_check(Ecore_Evas *ee, Efl_Input_Device *mouse);
EAPI void _ecore_evas_mouse_inout_set(Ecore_Evas *ee, Efl_Input_Device *mouse,
Eina_Bool in, Eina_Bool force_out);
EAPI Evas_Object *_ecore_evas_default_cursor_image_get(Ecore_Evas *ee);
EAPI void _ecore_evas_default_cursor_hide(Ecore_Evas *ee);
Eina_Bool _ecore_evas_cursors_init(Ecore_Evas *ee);
#undef EAPI
#define EAPI

View File

@ -837,10 +837,23 @@ EAPI void ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool ico
* @param y where to return the vertical position. May be NULL. Returns 0 on error.
*
* @ingroup Ecore_Wl2_Window_Group
* @see ecore_wl2_window_pointer_device_xy_get
* @since 1.17
*/
EAPI void ecore_wl2_window_pointer_xy_get(Ecore_Wl2_Window *window, int *x, int *y);
/**
* Retrieves the mouse position of the current window.
*
* @param window The window on which to retrieve the mouse position.
* @param pointer The Efl.Input.Pointer device to fetch the position.
* @param x where to return the horizontal position. May be NULL. Returns 0 on error.
* @param y where to return the vertical position. May be NULL. Returns 0 on error.
* @ingroup Ecore_Wl2_Window_Group
* @since 1.19
*/
EAPI void ecore_wl2_window_pointer_device_xy_get(Ecore_Wl2_Window *window, const Eo *pointer, int *x, int *y);
/**
* Set a given wl_surface to use as the pointer on a window
*

View File

@ -18,15 +18,6 @@
#include <sys/mman.h>
#include "ecore_wl2_private.h"
typedef struct _Ecore_Wl2_Input_Devices
{
Eo *pointer_dev;
Eo *keyboard_dev;
Eo *touch_dev;
Eo *seat_dev;
int window_id;
} Ecore_Wl2_Input_Devices;
typedef struct _Ecore_Wl2_Mouse_Down_Info
{
EINA_INLIST;

View File

@ -67,6 +67,15 @@ extern Eina_Bool no_session_recovery;
# endif
# define CRI(...) EINA_LOG_DOM_CRIT(_ecore_wl2_log_dom, __VA_ARGS__)
typedef struct _Ecore_Wl2_Input_Devices
{
Eo *pointer_dev;
Eo *keyboard_dev;
Eo *touch_dev;
Eo *seat_dev;
int window_id;
} Ecore_Wl2_Input_Devices;
struct _Ecore_Wl2_Display
{
int refs;

View File

@ -941,6 +941,38 @@ ecore_wl2_window_pointer_xy_get(Ecore_Wl2_Window *window, int *x, int *y)
if (y) *y = input->pointer.sy;
}
EAPI void
ecore_wl2_window_pointer_device_xy_get(Ecore_Wl2_Window *window,
const Eo *pointer,
int *x, int *y)
{
Ecore_Wl2_Input_Devices *devs;
Eina_List *l;
Ecore_Wl2_Input *input;
EINA_SAFETY_ON_NULL_RETURN(window);
EINA_SAFETY_ON_NULL_RETURN(pointer);
if (x) *x = 0;
if (y) *y = 0;
EINA_INLIST_FOREACH(window->display->inputs, input)
{
if (!input->wl.pointer)
continue;
EINA_LIST_FOREACH(input->devices_list, l, devs)
{
if ((devs->window_id == window->id) &&
(devs->pointer_dev == pointer))
{
if (x) *x = input->pointer.sx;
if (y) *y = input->pointer.sy;
}
}
}
}
EAPI void
ecore_wl2_window_pointer_set(Ecore_Wl2_Window *window, struct wl_surface *surface, int hot_x, int hot_y)
{

View File

@ -464,69 +464,16 @@ _ecore_evas_title_set(Ecore_Evas *ee, const char *title)
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj,
int layer EINA_UNUSED, int hot_x EINA_UNUSED,
int hot_y EINA_UNUSED)
{
Ecore_Evas *ee;
DBG("");
ee = data;
if (ee)
ee->prop.cursor.object = NULL;
}
static void
_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
}
static void
_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y;
Evas_Object *old;
Ecore_Cocoa_Window *win = (Ecore_Cocoa_Window *)(ee->prop.window);
DBG("");
old = ee->prop.cursor.object;
if (obj == NULL)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
ecore_cocoa_window_cursor_show(win, EINA_TRUE);
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
ecore_cocoa_window_cursor_show(win, EINA_FALSE);
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object,
x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full(old, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
if (!obj)
ecore_cocoa_window_cursor_show(win, EINA_TRUE);
else if (obj != _ecore_evas_default_cursor_image_get(ee))
ecore_cocoa_window_cursor_show(win, EINA_FALSE);
}
static void
@ -627,7 +574,7 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
NULL,
_ecore_evas_size_step_set,
_ecore_evas_object_cursor_set,
_ecore_evas_object_cursor_unset,
NULL,
NULL,
NULL,
_ecore_evas_iconified_set,
@ -675,6 +622,7 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
static Ecore_Cocoa_Window *

View File

@ -433,68 +433,6 @@ _drm_size_step_set(Ecore_Evas *ee, int w, int h)
ee->prop.step.h = h;
}
static void
_drm_object_cursor_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee) ee->prop.cursor.object = NULL;
}
static void
_drm_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
Evas_Object *old;
int x, y;
old = ee->prop.cursor.object;
if (!obj)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
ecore_evas_pointer_xy_get(ee, &x, &y);
if (obj != old)
{
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_drm_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object, x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _drm_object_cursor_del, ee);
evas_object_del(old);
}
}
static void
_drm_object_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object,
EVAS_CALLBACK_DEL,
_drm_object_cursor_del, ee);
}
static void
_drm_layer_set(Ecore_Evas *ee, int layer)
{
@ -747,8 +685,8 @@ static Ecore_Evas_Engine_Func _ecore_evas_drm_engine_func =
_drm_size_max_set,
_drm_size_base_set,
_drm_size_step_set,
_drm_object_cursor_set,
_drm_object_cursor_unset,
NULL,
NULL,
_drm_layer_set,
NULL, //void (*fn_focus_set) (Ecore_Evas *ee, Eina_Bool on);
_drm_iconified_set,
@ -796,6 +734,7 @@ static Ecore_Evas_Engine_Func _ecore_evas_drm_engine_func =
NULL, //fn_focus_device_set
NULL, //fn_callback_focus_device_in_set
NULL, //fn_callback_focus_device_out_set
NULL, //fn_pointer_device_xy_get
};
static Ecore_Evas *

View File

@ -925,6 +925,7 @@ static const Ecore_Evas_Engine_Func _ecore_extn_plug_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
static Eina_Bool

View File

@ -56,30 +56,36 @@ struct _Ecore_Evas_Engine_FB_Data {
static void
_ecore_evas_mouse_move_process_fb(Ecore_Evas *ee, int x, int y)
{
Efl_Input_Device *pointer;
Ecore_Evas_Cursor *cursor;
int fbw, fbh;
ee->mouse.x = x;
ee->mouse.y = y;
ecore_fb_size_get(&fbw, &fbh);
if (ee->prop.cursor.object)
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);
cursor->pos_x = x;
cursor->pos_y = y;
if (cursor->object)
{
evas_object_show(ee->prop.cursor.object);
evas_object_show(cursor->object);
if (ee->rotation == 0)
evas_object_move(ee->prop.cursor.object,
x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
x - cursor->hot.x,
y - cursor->hot.y);
else if (ee->rotation == 90)
evas_object_move(ee->prop.cursor.object,
(fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.x,
x - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
(fbh - ee->h) + ee->h - y - 1 - cursor->hot.x,
x - cursor->hot.y);
else if (ee->rotation == 180)
evas_object_move(ee->prop.cursor.object,
(fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.x,
(fbh - ee->h) + ee->h - y - 1 - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
(fbw - ee->w) + ee->w - x - 1 - cursor->hot.x,
(fbh - ee->h) + ee->h - y - 1 - cursor->hot.y);
else if (ee->rotation == 270)
evas_object_move(ee->prop.cursor.object,
y - ee->prop.cursor.hot.x,
(fbw - ee->w) + ee->w - x - 1 - ee->prop.cursor.hot.y);
evas_object_move(cursor->object,
y - cursor->hot.x,
(fbw - ee->w) + ee->w - x - 1 - cursor->hot.y);
}
}
@ -354,9 +360,15 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, in
static void
_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;
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;
einfo = (Evas_Engine_Info_FB *)evas_engine_info_get(ee->evas);
if (!einfo) return;
@ -409,7 +421,7 @@ _ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize EINA_UNUSED)
else
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);
}
@ -430,67 +442,6 @@ _ecore_evas_hide(Ecore_Evas *ee)
_ecore_evas_focus_device_set(ee, NULL, EINA_FALSE);
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee)
ee->prop.cursor.object = NULL;
}
static void
_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
}
static void
_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y;
Evas_Object *old;
old = ee->prop.cursor.object;
if (obj == NULL)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object, x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
}
static void
_ecore_evas_fullscreen_set(Ecore_Evas *ee, Eina_Bool on)
{
@ -592,8 +543,8 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
NULL,
NULL,
NULL,
_ecore_evas_object_cursor_set,
_ecore_evas_object_cursor_unset,
NULL,
NULL,
NULL,
NULL,
NULL,
@ -642,6 +593,7 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
EAPI Ecore_Evas *

View File

@ -255,6 +255,8 @@ _ecore_evas_psl1ght_callback_delete_request_set(Ecore_Evas *ee, Ecore_Evas_Event
static void
_ecore_evas_screen_resized(Ecore_Evas *ee)
{
Evas_Device *pointer;
Ecore_Evas_Cursor *cursor;
int w, h;
/* 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);
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)
{
ee->req.w = ee->w = w;
@ -271,7 +277,7 @@ _ecore_evas_screen_resized(Ecore_Evas *ee)
ecore_psl1ght_resolution_set (w, 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());
if (ee->func.fn_resize) ee->func.fn_resize(ee);
}
@ -319,66 +325,6 @@ _ecore_evas_screen_geometry_get(const Ecore_Evas *ee EINA_UNUSED, int *x, int *y
ecore_psl1ght_screen_resolution_get (w, h);
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee)
ee->prop.cursor.object = NULL;
}
static void
_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
}
static void
_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y;
Evas_Object *old;
old = ee->prop.cursor.object;
if (obj == NULL)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
if (obj != old)
{
evas_pointer_output_xy_get(ee->evas, &x, &y);
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object, x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
}
static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
{
_ecore_evas_psl1ght_free,
@ -413,8 +359,8 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
NULL,
NULL,
NULL,
_ecore_evas_object_cursor_set,
_ecore_evas_object_cursor_unset,
NULL,
NULL,
NULL,
NULL,
NULL,
@ -463,6 +409,7 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
EAPI Ecore_Evas *

View File

@ -411,66 +411,6 @@ _ecore_evas_show(Ecore_Evas *ee)
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee) ee->prop.cursor.object = NULL;
}
static void
_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
}
static void
_ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y;
Evas_Object *old;
old = ee->prop.cursor.object;
if (obj == NULL)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object, x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
}
static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
{
_ecore_evas_sdl_free,
@ -505,8 +445,8 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
NULL,
NULL,
NULL,
_ecore_evas_object_cursor_set,
_ecore_evas_object_cursor_unset,
NULL,
NULL,
NULL,
NULL,
NULL,
@ -555,6 +495,7 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
static Ecore_Evas*

View File

@ -43,7 +43,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
_ecore_evas_wl_common_size_base_set,
_ecore_evas_wl_common_size_step_set,
_ecore_evas_wl_common_object_cursor_set,
_ecore_evas_wl_common_object_cursor_unset,
NULL,
_ecore_evas_wl_common_layer_set,
NULL, // focus set
_ecore_evas_wl_common_iconified_set,
@ -90,6 +90,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
_ecore_evas_wl_common_pointer_device_xy_get,
};
#define _smart_frame_type "ecore_evas_wl_frame"
@ -170,7 +171,7 @@ _ecore_evas_wl_common_cb_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED,
_ecore_evas_mouse_inout_set(ee, ev->dev, EINA_TRUE, EINA_FALSE);
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);
_ecore_evas_mouse_device_move_process(ee, ev->dev, ev->x, ev->y, ev->timestamp);
return ECORE_CALLBACK_PASS_ON;
}
@ -190,10 +191,9 @@ _ecore_evas_wl_common_cb_mouse_out(void *data EINA_UNUSED, int type EINA_UNUSED,
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);
_ecore_evas_mouse_device_move_process(ee, ev->dev, 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);
if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
return ECORE_CALLBACK_PASS_ON;
}
@ -301,6 +301,20 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_
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
_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
* widgets. After a rotation change, e.g., the mouse might not be over
* a button anymore. */
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
ecore_loop_time_get());
_mouse_move_dispatch(ee);
}
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
* position, relatively to widgets. */
_ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
ecore_loop_time_get());
_mouse_move_dispatch(ee);
/* call the ecore_evas' resize function */
if (ee->func.fn_resize) ee->func.fn_resize(ee);
@ -1132,6 +1144,19 @@ _ecore_evas_wl_common_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_C
ecore_wl2_window_pointer_xy_get(wdata->win, x, y);
}
void
_ecore_evas_wl_common_pointer_device_xy_get(const Ecore_Evas *ee,
const Efl_Input_Device *pointer,
Evas_Coord *x, Evas_Coord *y)
{
Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
wdata = ee->engine.data;
ecore_wl2_window_pointer_device_xy_get(wdata->win, pointer, x, y);
}
void
_ecore_evas_wl_common_raise(Ecore_Evas *ee)
{
@ -1251,72 +1276,17 @@ _ecore_evas_wl_common_aspect_set(Ecore_Evas *ee, double aspect)
ee->prop.aspect = aspect;
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee) ee->prop.cursor.object = NULL;
}
void
_ecore_evas_wl_common_object_cursor_unset(Ecore_Evas *ee)
_ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj,
int layer EINA_UNUSED,
int hot_x EINA_UNUSED,
int hot_y EINA_UNUSED)
{
evas_object_event_callback_del_full(ee->prop.cursor.object,
EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
void
_ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y, fx, fy;
Ecore_Evas_Engine_Wl_Data *wdata;
Evas_Object *old;
if (!ee) return;
wdata = ee->engine.data;
old = ee->prop.cursor.object;
if (obj == NULL)
{
ecore_wl2_window_pointer_set(wdata->win, NULL, 0, 0);
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
ecore_wl2_window_pointer_set(wdata->win, NULL, 0, 0);
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_output_framespace_get(ee->evas, &fx, &fy, NULL, NULL);
evas_object_move(ee->prop.cursor.object, x - fx - ee->prop.cursor.hot.x,
y - fy - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
if (obj != _ecore_evas_default_cursor_image_get(ee))
ecore_wl2_window_pointer_set(wdata->win, NULL, 0, 0);
}
void

View File

@ -103,6 +103,8 @@ void _ecore_evas_wl_common_transparent_set(Ecore_Evas *ee, int transparent);
void _ecore_evas_wl_common_frame_callback_clean(Ecore_Evas *ee);
void _ecore_evas_wl_common_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y);
void _ecore_evas_wl_common_pointer_device_xy_get(const Ecore_Evas *ee, const Efl_Input_Device *pointer, Evas_Coord *x, Evas_Coord *y);
Ecore_Evas *_ecore_evas_wl_common_new_internal(const char *disp_name, unsigned int parent, int x, int y, int w, int h, Eina_Bool frame, const char *engine_name);
extern Eina_List *ee_list;

View File

@ -220,7 +220,7 @@ _ecore_evas_win32_event_mouse_out(void *data EINA_UNUSED, int type EINA_UNUSED,
if (evas_event_down_count_get(ee->evas) > 0) return ECORE_CALLBACK_PASS_ON;
evas_event_feed_mouse_out(ee->evas, e->timestamp, NULL);
_ecore_evas_mouse_inout_set(ee, NULL, EINA_FALSE, EINA_FALSE);
if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
_ecore_evas_default_cursor_hide(ee);
}
return ECORE_CALLBACK_PASS_ON;
@ -371,9 +371,12 @@ _ecore_evas_win32_event_window_hide(void *data EINA_UNUSED, int type EINA_UNUSED
static Eina_Bool
_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_Win32_Event_Window_Configure *e;
INF("window configure");
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 ((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->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) &&
(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());
ee->expecting_resize.w = 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
_ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
{
Evas_Device *pointer;
Ecore_Evas_Cursor *cursor;
int rot_dif;
rot_dif = ee->rotation - rotation;
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)
{
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_base_set(ee, baseh, basew);
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());
}
else
{
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());
if (ee->func.fn_resize) ee->func.fn_resize(ee);
}
@ -834,67 +847,6 @@ _ecore_evas_win32_size_step_set(Ecore_Evas *ee, int width, int height)
width, height);
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee) ee->prop.cursor.object = NULL;
}
static void
_ecore_evas_win32_cursor_unset(Ecore_Evas *ee)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
}
static void
_ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x, y;
Evas_Object *old;
old = ee->prop.cursor.object;
if (obj == NULL)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
// ecore_win32_window_cursor_show(ee->prop.window, 0);
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object, x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
}
static void
_ecore_evas_win32_focus_set(Ecore_Evas *ee, Eina_Bool on EINA_UNUSED)
{
@ -1157,8 +1109,8 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
_ecore_evas_win32_size_max_set,
_ecore_evas_win32_size_base_set,
_ecore_evas_win32_size_step_set,
_ecore_evas_win32_cursor_set,
_ecore_evas_win32_cursor_unset,
NULL,
NULL,
NULL, /* _ecore_evas_x_layer_set */
_ecore_evas_win32_focus_set,
_ecore_evas_win32_iconified_set,
@ -1207,6 +1159,7 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
#endif /* BUILD_ECORE_EVAS_WIN32 */

View File

@ -1315,7 +1315,7 @@ _fake_out(void *data)
_feed_cancel_out(e, (e->mode == ECORE_X_EVENT_MODE_GRAB));
_ecore_evas_mouse_inout_set(ee, NULL, EINA_FALSE, EINA_TRUE);
if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
_ecore_evas_default_cursor_hide(ee);
return EINA_FALSE;
}
@ -1480,7 +1480,7 @@ _ecore_evas_x_event_mouse_out(void *data EINA_UNUSED, int type EINA_UNUSED, void
_ecore_evas_mouse_move_process(ee, e->x, e->y, e->time);
_ecore_evas_mouse_inout_set(ee, NULL, EINA_FALSE, EINA_FALSE);
_feed_cancel_out(e, (e->mode == ECORE_X_EVENT_MODE_GRAB));
if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
_ecore_evas_default_cursor_hide(ee);
}
return ECORE_CALLBACK_PASS_ON;
}
@ -1616,6 +1616,9 @@ _ecore_evas_x_shadow_update(Ecore_Evas *ee)
static Eina_Bool
_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_X_Event_Window_Configure *e;
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 (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--;
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) &&
(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());
ee->expecting_resize.w = 0;
ee->expecting_resize.h = 0;
@ -1800,7 +1807,7 @@ _ecore_evas_x_event_window_hide(void *data EINA_UNUSED, int type EINA_UNUSED, vo
};
_feed_cancel_out(&out, EINA_TRUE);
_ecore_evas_mouse_inout_set(ee, NULL, EINA_FALSE, EINA_FALSE);
if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
_ecore_evas_default_cursor_hide(ee);
}
if (ee->prop.override)
{
@ -2340,10 +2347,16 @@ static void
_ecore_evas_x_rotation_set_internal(Ecore_Evas *ee, int rotation, int resize,
Evas_Engine_Info *einfo)
{
Evas_Device *pointer;
Ecore_Evas_Cursor *cursor;
int rot_dif;
Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
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;
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_base_set(ee, baseh, basew);
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());
}
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);
}
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());
if (ee->func.fn_resize) ee->func.fn_resize(ee);
@ -3153,65 +3166,18 @@ _ecore_evas_x_size_step_set(Ecore_Evas *ee, int w, int h)
}
static void
_ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
_ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj,
int layer EINA_UNUSED, int hot_x EINA_UNUSED,
int hot_y EINA_UNUSED)
{
Ecore_Evas *ee;
ee = data;
if (ee) ee->prop.cursor.object = NULL;
if (obj != _ecore_evas_default_cursor_image_get(ee))
ecore_x_window_cursor_show(ee->prop.window, 0);
}
static void
_ecore_evas_x_object_cursor_unset(Ecore_Evas *ee)
_ecore_evas_x_object_cursor_unset(Ecore_Evas *ee EINA_UNUSED)
{
evas_object_event_callback_del_full(ee->prop.cursor.object, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
}
static void
_ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
{
int x = 0, y = 0;
Evas_Object *old;
old = ee->prop.cursor.object;
if (!obj)
{
ee->prop.cursor.object = NULL;
ee->prop.cursor.layer = 0;
ee->prop.cursor.hot.x = 0;
ee->prop.cursor.hot.y = 0;
ecore_x_window_cursor_show(ee->prop.window, 1);
goto end;
}
ee->prop.cursor.object = obj;
ee->prop.cursor.layer = layer;
ee->prop.cursor.hot.x = hot_x;
ee->prop.cursor.hot.y = hot_y;
evas_pointer_output_xy_get(ee->evas, &x, &y);
if (obj != old)
{
ecore_x_window_cursor_show(ee->prop.window, 0);
evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
evas_object_pass_events_set(ee->prop.cursor.object, 1);
if (evas_pointer_inside_get(ee->evas))
evas_object_show(ee->prop.cursor.object);
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
_ecore_evas_object_cursor_del, ee);
}
evas_object_move(ee->prop.cursor.object, x - ee->prop.cursor.hot.x,
y - ee->prop.cursor.hot.y);
end:
if ((old) && (obj != old))
{
evas_object_event_callback_del_full
(old, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
evas_object_del(old);
}
ecore_x_window_cursor_show(ee->prop.window, 1);
}
/*
@ -3788,6 +3754,7 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func =
NULL, //fn_callback_focus_device_out_set
NULL, //fn_callback_device_mouse_in_set
NULL, //fn_callback_device_mouse_out_set
NULL, //fn_pointer_device_xy_get
};
/*

View File

@ -893,5 +893,38 @@ ecore_evas_vnc_server_del(Ecore_Evas_Vnc_Server *server)
free(server);
}
EAPI void
ecore_evas_vnc_server_pointer_xy_get(const Ecore_Evas_Vnc_Server *server,
const Evas_Device *pointer,
Evas_Coord *x, Evas_Coord *y)
{
Evas_Coord sx, sy;
rfbClientIteratorPtr itr;
rfbClientRec *client;
Ecore_Evas_Vnc_Server_Client_Data *cdata;
EINA_SAFETY_ON_NULL_RETURN(server);
EINA_SAFETY_ON_NULL_RETURN(pointer);
sx = sy = 0;
itr = rfbGetClientIterator(server->vnc_screen);
while ((client = rfbClientIteratorNext(itr)))
{
cdata = client->clientData;
if (cdata->mouse == pointer)
{
sx = client->lastPtrX;
sy = client->lastPtrY;
break;
}
}
rfbReleaseClientIterator(itr);
if (x) *x = sx;
if (y) *y = sy;
}
EINA_MODULE_INIT(_ecore_evas_vnc_server_init);
EINA_MODULE_SHUTDOWN(_ecore_evas_vnc_server_shutdown);