[gtk/wip/alexl/broadway7: 82/87] broadway: Keep track of surface owner and only send input to that client



commit a966fe1ed5b5e633af05c2968960dbd870e89912
Author: Alexander Larsson <alexl redhat com>
Date:   Fri Mar 29 11:07:04 2019 +0100

    broadway: Keep track of surface owner and only send input to that client

 gdk/broadway/broadway-server.c | 42 +++++++++++++++++++++++++++++++++++++++++-
 gdk/broadway/broadway-server.h |  1 +
 gdk/broadway/broadwayd.c       |  2 +-
 3 files changed, 43 insertions(+), 2 deletions(-)
---
diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c
index b8bfe8b1d0..dc6f965db0 100644
--- a/gdk/broadway/broadway-server.c
+++ b/gdk/broadway/broadway-server.c
@@ -115,6 +115,7 @@ struct BroadwayInput {
 };
 
 struct BroadwaySurface {
+  guint32 owner;
   gint32 id;
   gint32 x;
   gint32 y;
@@ -471,9 +472,46 @@ process_input_message (BroadwayServer *server,
                        BroadwayInputMsg *message)
 {
   gint32 client;
+  BroadwaySurface *surface;
 
   update_event_state (server, message);
-  client = -1;
+
+
+  switch (message->base.type) {
+  case BROADWAY_EVENT_ENTER:
+  case BROADWAY_EVENT_LEAVE:
+  case BROADWAY_EVENT_POINTER_MOVE:
+  case BROADWAY_EVENT_BUTTON_PRESS:
+  case BROADWAY_EVENT_BUTTON_RELEASE:
+  case BROADWAY_EVENT_SCROLL:
+  case BROADWAY_EVENT_GRAB_NOTIFY:
+  case BROADWAY_EVENT_UNGRAB_NOTIFY:
+    surface = broadway_server_lookup_surface (server, message->pointer.event_surface_id);
+    break;
+  case BROADWAY_EVENT_TOUCH:
+    surface = broadway_server_lookup_surface (server, message->touch.event_surface_id);
+    break;
+  case BROADWAY_EVENT_CONFIGURE_NOTIFY:
+    surface = broadway_server_lookup_surface (server, message->configure_notify.id);
+    break;
+  case BROADWAY_EVENT_ROUNDTRIP_NOTIFY:
+    surface = broadway_server_lookup_surface (server, message->roundtrip_notify.id);
+    break;
+  case BROADWAY_EVENT_KEY_PRESS:
+  case BROADWAY_EVENT_KEY_RELEASE:
+    /* TODO: Send to keys focused clients only... */
+  case BROADWAY_EVENT_FOCUS:
+  case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
+  default:
+    surface = NULL;
+    break;
+  }
+
+  if (surface)
+    client = surface->owner;
+  else
+    client = -1;
+
   if (is_pointer_event (message) &&
       server->pointer_grab_surface_id != -1)
     client = server->pointer_grab_client_id;
@@ -2020,6 +2058,7 @@ broadway_server_ungrab_pointer (BroadwayServer *server,
 
 guint32
 broadway_server_new_surface (BroadwayServer *server,
+                             guint32 client,
                              int x,
                              int y,
                              int width,
@@ -2029,6 +2068,7 @@ broadway_server_new_surface (BroadwayServer *server,
   BroadwaySurface *surface;
 
   surface = g_new0 (BroadwaySurface, 1);
+  surface->owner = client;
   surface->id = server->id_counter++;
   surface->x = x;
   surface->y = y;
diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h
index 859464aa45..f11e9e872d 100644
--- a/gdk/broadway/broadway-server.h
+++ b/gdk/broadway/broadway-server.h
@@ -86,6 +86,7 @@ gint32              broadway_server_get_mouse_surface         (BroadwayServer  *
 void                broadway_server_set_show_keyboard         (BroadwayServer  *server,
                                                                gboolean         show);
 guint32             broadway_server_new_surface               (BroadwayServer  *server,
+                                                               guint32          client,
                                                                int              x,
                                                                int              y,
                                                                int              width,
diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c
index a3b402f1f6..54d97c5ec1 100644
--- a/gdk/broadway/broadwayd.c
+++ b/gdk/broadway/broadwayd.c
@@ -234,7 +234,7 @@ client_handle_request (BroadwayClient *client,
     {
     case BROADWAY_REQUEST_NEW_SURFACE:
       reply_new_surface.id =
-        broadway_server_new_surface (server,
+        broadway_server_new_surface (server, client->id,
                                      request->new_surface.x,
                                      request->new_surface.y,
                                      request->new_surface.width,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]