diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index 43ec72a6ad..b493383b43 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -2393,7 +2393,19 @@ ecore_evas_pointer_device_xy_get(const Ecore_Evas *ee, if (x) *x = 0; if (y) *y = 0; ECORE_EVAS_CHECK(ee); - if (ee->engine.func->fn_pointer_device_xy_get) + 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); } } diff --git a/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c b/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c index c55fb9cf7e..88c02d22db 100644 --- a/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c +++ b/src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c @@ -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);