summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilherme Iscaro <iscaro@profusion.mobi>2016-10-27 15:40:20 -0200
committerGuilherme Iscaro <iscaro@profusion.mobi>2016-11-25 12:05:38 -0200
commit87f290e258ce8e76be4d9224a5e9faf190e160f7 (patch)
treeab572e8c62b430971f8c7514341f92e571f8fd12
parentae47db9253ef12c9feb6f7cb3f043dd5b120b79b (diff)
downloadefl-devs/iscaro/multi-seat-events.tar.gz
Ecore_Evas VNC: Properly set mouse/canvas in/out properties.devs/iscaro/multi-seat-events
-rw-r--r--src/modules/ecore_evas/vnc_server/ecore_evas_vnc_server.c30
1 files changed, 28 insertions, 2 deletions
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 def9593c9e..8f78f40bde 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
@@ -101,6 +101,10 @@ typedef struct _Ecore_Evas_Vnc_Server_Client_Data {
#define VNC_SAMPLES_PER_PIXEL (3)
#define VNC_BYTES_PER_PIXEL (4)
+
+static void _ecore_evas_vnc_server_ecore_event_generic_free(void *user_data,
+ void *func_data);
+
static void
_ecore_evas_vnc_server_update_clients(rfbScreenInfoPtr vnc_screen)
{
@@ -152,15 +156,33 @@ _ecore_evas_vnc_server_socket_listen_activity(void *data,
}
static void
+_ecore_evas_vnc_server_mouse_inout_emit(Ecore_Evas_Vnc_Server *server,
+ Evas_Device *dev, int event_type)
+{
+ Ecore_Event_Mouse_IO *io = calloc(1, sizeof(Ecore_Event_Mouse_IO));
+ EINA_SAFETY_ON_NULL_RETURN(io);
+ io->timestamp = time(NULL);
+ io->dev = efl_ref(dev);
+ io->event_window = io->window = server->ee->prop.window;
+ ecore_event_add(event_type, io,
+ _ecore_evas_vnc_server_ecore_event_generic_free, dev);
+}
+
+static void
_ecore_evas_vnc_server_client_gone(rfbClientRec *client)
{
- Ecore_Evas_Vnc_Server_Client_Data *cdata = client->clientData;
Ecore_Evas_Vnc_Server *server = client->screen->screenData;
+ Ecore_Evas_Vnc_Server_Client_Data *cdata = client->clientData;
DBG("VNC client on seat '%s' gone", evas_device_name_get(cdata->seat));
if (server->disc_cb)
server->disc_cb(server->cb_data, server->ee, client->host);
+ _ecore_evas_vnc_server_mouse_inout_emit(server, cdata->mouse,
+ ECORE_EVENT_MOUSE_OUT);
+ _ecore_evas_mouse_inout_set(server->ee, cdata->mouse, EINA_FALSE,
+ EINA_FALSE);
+ ecore_evas_focus_device_set(server->ee, cdata->seat, EINA_FALSE);
ecore_main_fd_handler_del(cdata->handler);
evas_device_del(cdata->keyboard);
evas_device_del(cdata->mouse);
@@ -240,7 +262,11 @@ _ecore_evas_vnc_server_client_connection_new(rfbClientRec *client)
DBG("New VNC client on seat '%u'", _available_seat);
_available_seat++;
-
+ _ecore_evas_vnc_server_mouse_inout_emit(server, cdata->mouse,
+ ECORE_EVENT_MOUSE_IN);
+ _ecore_evas_mouse_inout_set(server->ee, cdata->mouse, EINA_TRUE,
+ EINA_FALSE);
+ ecore_evas_focus_device_set(server->ee, cdata->seat, EINA_TRUE);
return RFB_CLIENT_ACCEPT;
err_mouse: