[gtk+] broadway: During pointer grabs, send pointer events only to one client



commit 63b6c07fe051c928f619fd2e769805d76139cdea
Author: Alexander Larsson <alexl redhat com>
Date:   Wed Dec 26 22:31:52 2012 +0100

    broadway: During pointer grabs, send pointer events only to one client

 gdk/broadway/broadway-server.c |   28 ++++++++++++++++++++-
 gdk/broadway/broadway-server.h |    4 ++-
 gdk/broadway/broadwayd.c       |   54 +++++++++++++++++++++++-----------------
 3 files changed, 61 insertions(+), 25 deletions(-)
---
diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c
index 93387df..05e3485 100644
--- a/gdk/broadway/broadway-server.c
+++ b/gdk/broadway/broadway-server.c
@@ -39,6 +39,7 @@ struct _BroadwayServer {
 
   /* Explicit pointer grabs: */
   gint32 pointer_grab_window_id; /* -1 => none */
+  gint32 pointer_grab_client_id; /* -1 => none */
   guint32 pointer_grab_time;
   gboolean pointer_grab_owner_events;
 
@@ -225,10 +226,25 @@ broadway_server_lookahead_event (BroadwayServer  *server,
   return FALSE;
 }
 
+static gboolean
+is_pointer_event (BroadwayInputMsg *message)
+{
+  return
+    message->base.type == BROADWAY_EVENT_ENTER ||
+    message->base.type == BROADWAY_EVENT_LEAVE ||
+    message->base.type == BROADWAY_EVENT_POINTER_MOVE ||
+    message->base.type == BROADWAY_EVENT_BUTTON_PRESS ||
+    message->base.type == BROADWAY_EVENT_BUTTON_RELEASE ||
+    message->base.type == BROADWAY_EVENT_SCROLL ||
+    message->base.type == BROADWAY_EVENT_GRAB_NOTIFY ||
+    message->base.type == BROADWAY_EVENT_UNGRAB_NOTIFY;
+}
+
 static void
 process_input_messages (BroadwayServer *server)
 {
   BroadwayInputMsg *message;
+  gint32 client;
 
   while (server->input_messages)
     {
@@ -239,7 +255,12 @@ process_input_messages (BroadwayServer *server)
 
 
       update_event_state (server, message);
-      broadway_events_got_input (message);
+      client = -1;
+      if (is_pointer_event (message) &&
+	  server->pointer_grab_window_id != -1)
+	client = server->pointer_grab_client_id;
+	  
+      broadway_events_got_input (message, client);
       g_free (message);
     }
 }
@@ -1275,6 +1296,9 @@ broadway_server_window_hide (BroadwayServer *server,
       server->mouse_in_toplevel_id = 0;
     }
 
+  if (server->pointer_grab_window_id == id)
+    server->pointer_grab_window_id = -1;
+
   if (server->output)
     {
       broadway_output_hide_surface (server->output, window->id);
@@ -1549,6 +1573,7 @@ broadway_server_window_move_resize (BroadwayServer *server,
 
 guint32
 broadway_server_grab_pointer (BroadwayServer *server,
+			      gint client_id,
 			      gint id,
 			      gboolean owner_events,
 			      guint32 event_mask,
@@ -1562,6 +1587,7 @@ broadway_server_grab_pointer (BroadwayServer *server,
     time_ = server->last_seen_time;
 
   server->pointer_grab_window_id = id;
+  server->pointer_grab_client_id = client_id;
   server->pointer_grab_owner_events = owner_events;
   server->pointer_grab_time = time_;
 
diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h
index 0329ea8..b408139 100644
--- a/gdk/broadway/broadway-server.h
+++ b/gdk/broadway/broadway-server.h
@@ -5,7 +5,8 @@
 #include <glib-object.h>
 #include <cairo.h>
 
-void broadway_events_got_input (BroadwayInputMsg *message);
+void broadway_events_got_input (BroadwayInputMsg *message,
+				gint32 client_id);
 
 typedef struct _BroadwayServer BroadwayServer;
 typedef struct _BroadwayServerClass BroadwayServerClass;
@@ -33,6 +34,7 @@ void                broadway_server_query_mouse              (BroadwayServer   *
 							      gint32           *root_y,
 							      guint32          *mask);
 guint32             broadway_server_grab_pointer             (BroadwayServer   *server,
+							      gint              client_id,
 							      gint              id,
 							      gboolean          owner_events,
 							      guint32           event_mask,
diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c
index 8d6d23e..2e13ab2 100644
--- a/gdk/broadway/broadwayd.c
+++ b/gdk/broadway/broadwayd.c
@@ -15,7 +15,9 @@
 /* TODO:
  * Cache surfaces that are opened via shm_open inbetween updates.
  * Send configure event when a window is moved and no client
- * Rewrite events (only to one client, per-client serials, etc)
+ * Handle implicit grabs when in broadway-server.c
+ * Rewrite events (per-client serials, etc)
+ * Handle window size changes
  * _gdk_broadway_server_has_client is always FALSE, so resize don't work.
  */
 
@@ -242,17 +244,17 @@ client_handle_request (BroadwayClient *client,
       break;
     case BROADWAY_REQUEST_SET_TRANSIENT_FOR:
       broadway_server_window_set_transient_for (server,
-						     request->set_transient_for.id,
-						     request->set_transient_for.parent);
+						request->set_transient_for.id,
+						request->set_transient_for.parent);
       break;
     case BROADWAY_REQUEST_TRANSLATE:
       area = region_from_rects (request->translate.rects,
 				request->translate.n_rects);
       broadway_server_window_translate (server,
-					     request->translate.id,
-					     area,
-					     request->translate.dx,
-					     request->translate.dy);
+					request->translate.id,
+					area,
+					request->translate.dx,
+					request->translate.dy);
       cairo_region_destroy (area);
       break;
     case BROADWAY_REQUEST_UPDATE:
@@ -262,18 +264,18 @@ client_handle_request (BroadwayClient *client,
       if (surface != NULL)
 	{
 	  broadway_server_window_update (server,
-					      request->update.id,
-					      surface);
+					 request->update.id,
+					 surface);
 	  cairo_surface_destroy (surface);
 	}
       break;
     case BROADWAY_REQUEST_MOVE_RESIZE:
       if (!broadway_server_window_move_resize (server,
-						    request->move_resize.id,
-						    request->move_resize.x,
-						    request->move_resize.y,
-						    request->move_resize.width,
-						    request->move_resize.height))
+					       request->move_resize.id,
+					       request->move_resize.x,
+					       request->move_resize.y,
+					       request->move_resize.width,
+					       request->move_resize.height))
 	{
 	  /* TODO: Send configure request */
 	}
@@ -281,17 +283,18 @@ client_handle_request (BroadwayClient *client,
     case BROADWAY_REQUEST_GRAB_POINTER:
       reply_grab_pointer.status =
 	broadway_server_grab_pointer (server,
-					   request->grab_pointer.id,
-					   request->grab_pointer.owner_events,
-					   request->grab_pointer.event_mask,
-					   request->grab_pointer.time_);
+				      client->id,
+				      request->grab_pointer.id,
+				      request->grab_pointer.owner_events,
+				      request->grab_pointer.event_mask,
+				      request->grab_pointer.time_);
       send_reply (client, request, (BroadwayReply *)&reply_grab_pointer, sizeof (reply_grab_pointer),
 		  BROADWAY_REPLY_GRAB_POINTER);
       break;
     case BROADWAY_REQUEST_UNGRAB_POINTER:
       reply_ungrab_pointer.status =
 	broadway_server_ungrab_pointer (server,
-					     request->ungrab_pointer.time_);
+					request->ungrab_pointer.time_);
       send_reply (client, request, (BroadwayReply *)&reply_ungrab_pointer, sizeof (reply_ungrab_pointer),
 		  BROADWAY_REPLY_UNGRAB_POINTER);
       break;
@@ -495,7 +498,8 @@ get_event_size (int type)
 }
 
 void
-broadway_events_got_input (BroadwayInputMsg *message)
+broadway_events_got_input (BroadwayInputMsg *message,
+			   gint32 client_id)
 {
   GList *l;
   BroadwayReplyEvent reply_event;
@@ -509,8 +513,12 @@ broadway_events_got_input (BroadwayInputMsg *message)
     {
       BroadwayClient *client = l->data;
 
-      send_reply (client, NULL, (BroadwayReply *)&reply_event,
-		  sizeof (BroadwayReplyBase) + size,
-		  BROADWAY_REPLY_EVENT);
+      if (client_id == -1 ||
+	  client->id == client_id)
+	{
+	  send_reply (client, NULL, (BroadwayReply *)&reply_event,
+		      sizeof (BroadwayReplyBase) + size,
+		      BROADWAY_REPLY_EVENT);
+	}
     }
 }



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