broadway: Track windows for client and kill on client exit

This commit is contained in:
Alexander Larsson 2012-12-23 22:42:41 +01:00
parent 5ee8b69418
commit 329372a343

View File

@ -26,6 +26,7 @@ typedef struct {
static void static void
client_free (BroadwayClient *client) client_free (BroadwayClient *client)
{ {
g_assert (client->windows == NULL);
g_assert (client->disconnect_idle == 0); g_assert (client->disconnect_idle == 0);
clients = g_list_remove (clients, client); clients = g_list_remove (clients, client);
g_object_unref (client->connection); g_object_unref (client->connection);
@ -36,15 +37,21 @@ client_free (BroadwayClient *client)
static void static void
client_disconnected (BroadwayClient *client) client_disconnected (BroadwayClient *client)
{ {
GList *l;
if (client->disconnect_idle != 0) if (client->disconnect_idle != 0)
{ {
g_source_remove (client->disconnect_idle); g_source_remove (client->disconnect_idle);
client->disconnect_idle = 0; client->disconnect_idle = 0;
} }
g_print ("client %d disconnected\n", client->id); for (l = client->windows; l != NULL; l = l->next)
_gdk_broadway_server_destroy_window (server,
GPOINTER_TO_UINT (l->data));
g_list_free (client->windows);
client->windows = NULL;
/* TODO: destroy client windows, also maybe do this in an idle, at least in some cases like on an i/o error */ _gdk_broadway_server_flush (server);
client_free (client); client_free (client);
} }
@ -189,6 +196,9 @@ client_handle_request (BroadwayClient *client,
request->new_window.width, request->new_window.width,
request->new_window.height, request->new_window.height,
request->new_window.is_temp); request->new_window.is_temp);
client->windows =
g_list_prepend (client->windows,
GUINT_TO_POINTER (reply_new_window.id));
send_reply (client, request, (BroadwayReply *)&reply_new_window, sizeof (reply_new_window), send_reply (client, request, (BroadwayReply *)&reply_new_window, sizeof (reply_new_window),
BROADWAY_REPLY_NEW_WINDOW); BROADWAY_REPLY_NEW_WINDOW);
@ -211,6 +221,9 @@ client_handle_request (BroadwayClient *client,
BROADWAY_REPLY_QUERY_MOUSE); BROADWAY_REPLY_QUERY_MOUSE);
break; break;
case BROADWAY_REQUEST_DESTROY_WINDOW: case BROADWAY_REQUEST_DESTROY_WINDOW:
client->windows =
g_list_remove (client->windows,
GUINT_TO_POINTER (request->destroy_window.id));
_gdk_broadway_server_destroy_window (server, request->destroy_window.id); _gdk_broadway_server_destroy_window (server, request->destroy_window.id);
break; break;
case BROADWAY_REQUEST_SHOW_WINDOW: case BROADWAY_REQUEST_SHOW_WINDOW: