Ecore Evas VNC: Add support for ecore_evas_pointer_device_xy_get().
authorGuilherme Iscaro <iscaro@profusion.mobi>
Mon, 21 Nov 2016 19:05:18 +0000 (17:05 -0200)
committerBruno Dilly <bdilly@profusion.mobi>
Tue, 20 Dec 2016 20:34:39 +0000 (18:34 -0200)
This commit adds the support to fetch the mouse position of a VNC
client.

src/lib/ecore_evas/ecore_evas.c
src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c

index 43ec72a..b493383 100644 (file)
@@ -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);
      }
 }
index c55fb9c..88c02d2 100644 (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);