]> Pileus Git - ~andy/gtk/commitdiff
broadway: During pointer grabs, send pointer events only to one client
authorAlexander Larsson <alexl@redhat.com>
Wed, 26 Dec 2012 21:31:52 +0000 (22:31 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 27 Dec 2012 21:56:04 +0000 (22:56 +0100)
gdk/broadway/broadway-server.c
gdk/broadway/broadway-server.h
gdk/broadway/broadwayd.c

index 93387dfaaa1bc90ab632f405c75064891f07f421..05e3485944a167d8e1a5729e5ca1bba04bd51915 100644 (file)
@@ -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_;
 
index 0329ea8e3469085394214d2a7a697c11c111cf2c..b4081398796958eec2bd094f7c23322b8d4d7290 100644 (file)
@@ -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,
index 8d6d23ec5ac0fdefacda507a8f80825b071711f9..2e13ab2f85ad4ac747b800835c9839970e371439 100644 (file)
@@ -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);
+       }
     }
 }