broadway: Don't cause traffic when disconnecting
authorMatthias Clasen <mclasen@redhat.com>
Fri, 17 Mar 2023 14:59:05 +0000 (10:59 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 21 Apr 2023 06:19:17 +0000 (08:19 +0200)
The recently added transient-for support was causing
roundtrips when a client with transients disconnects,
leading to assertion failures. Avoid that.

gdk/broadway/broadway-server.c
gdk/broadway/broadway-server.h
gdk/broadway/broadwayd.c

index f48ff0157d3386ae994f6484b1e8825a7dd09838..6f6d6667bba7879809b5f89948e7c00571221eaa 100644 (file)
@@ -1574,7 +1574,8 @@ broadway_server_query_mouse (BroadwayServer *server,
 
 void
 broadway_server_destroy_surface (BroadwayServer *server,
-                                 int id)
+                                 int id,
+                                 gboolean disconnected)
 {
   BroadwaySurface *surface;
   gint32 transient_for = -1;
@@ -1589,8 +1590,7 @@ broadway_server_destroy_surface (BroadwayServer *server,
     server->pointer_grab_surface_id = -1;
 
   if (server->output)
-    broadway_output_destroy_surface (server->output,
-                                     id);
+    broadway_output_destroy_surface (server->output, id);
 
   surface = broadway_server_lookup_surface (server, id);
   if (surface != NULL)
@@ -1604,7 +1604,7 @@ broadway_server_destroy_surface (BroadwayServer *server,
       broadway_surface_free (server, surface);
     }
 
-  if (transient_for != -1)
+  if (transient_for != -1 && !disconnected)
     {
       surface = broadway_server_lookup_surface (server, transient_for);
       if (surface != NULL)
index 1f7faad7ea161d9c55d9e8332e121005277d6478..dc562b705638c0c018316ec59b94e9dcce3cf75c 100644 (file)
@@ -93,7 +93,8 @@ guint32             broadway_server_new_surface               (BroadwayServer  *
                                                                int              width,
                                                                int              height);
 void                broadway_server_destroy_surface           (BroadwayServer  *server,
-                                                               int              id);
+                                                               int              id,
+                                                               gboolean         disconnected);
 gboolean            broadway_server_surface_show              (BroadwayServer  *server,
                                                                int              id);
 gboolean            broadway_server_surface_hide              (BroadwayServer  *server,
index 2d1b4c1865416365670fcd0f69148b2a90ba97f0..4ca99b4a10cae003b2bf264babe043fc00653f3b 100644 (file)
@@ -101,8 +101,7 @@ client_disconnected (BroadwayClient *client)
     }
 
   for (l = client->surfaces; l != NULL; l = l->next)
-    broadway_server_destroy_surface (server,
-                                     GPOINTER_TO_UINT (l->data));
+    broadway_server_destroy_surface (server, GPOINTER_TO_UINT (l->data), TRUE);
   g_list_free (client->surfaces);
   client->surfaces = NULL;
 
@@ -268,7 +267,7 @@ client_handle_request (BroadwayClient *client,
       client->surfaces =
         g_list_remove (client->surfaces,
                        GUINT_TO_POINTER (request->destroy_surface.id));
-      broadway_server_destroy_surface (server, request->destroy_surface.id);
+      broadway_server_destroy_surface (server, request->destroy_surface.id, FALSE);
       break;
     case BROADWAY_REQUEST_SHOW_SURFACE:
       broadway_server_surface_show (server, request->show_surface.id);