summaryrefslogtreecommitdiff
path: root/tests/src/x-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/x-server.c')
-rw-r--r--tests/src/x-server.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/tests/src/x-server.c b/tests/src/x-server.c
index d756c58c..1c93103a 100644
--- a/tests/src/x-server.c
+++ b/tests/src/x-server.c
@@ -20,6 +20,7 @@ G_DEFINE_TYPE (XClient, x_client, G_TYPE_OBJECT);
enum {
X_SERVER_CLIENT_CONNECTED,
X_SERVER_CLIENT_DISCONNECTED,
+ X_SERVER_RESET,
X_SERVER_LAST_SIGNAL
};
static guint x_server_signals[X_SERVER_LAST_SIGNAL] = { 0 };
@@ -107,12 +108,31 @@ x_server_new (gint display_number)
return server;
}
-static void
-x_client_disconnected_cb (XClient *client, XServer *server)
+static gboolean
+client_read_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
{
- g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, server);
- g_hash_table_remove (server->priv->clients, client->priv->channel);
- g_signal_emit (server, x_server_signals[X_SERVER_CLIENT_DISCONNECTED], 0, client);
+ XClient *client = data;
+ gchar *d;
+ gsize d_length;
+
+ if (g_io_channel_read_to_end (channel, &d, &d_length, NULL) == G_IO_STATUS_NORMAL && d_length == 0)
+ {
+ XServer *server = client->priv->server;
+
+ g_signal_emit (client, x_client_signals[X_CLIENT_DISCONNECTED], 0);
+ g_signal_emit (server, x_server_signals[X_SERVER_CLIENT_DISCONNECTED], 0, client);
+
+ g_hash_table_remove (server->priv->clients, client->priv->channel);
+
+ if (g_hash_table_size (server->priv->clients) == 0)
+ g_signal_emit (server, x_server_signals[X_SERVER_RESET], 0);
+
+ g_free (d);
+
+ return G_SOURCE_REMOVE;
+ }
+
+ return G_SOURCE_CONTINUE;
}
static gboolean
@@ -132,9 +152,9 @@ socket_connect_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
client = g_object_new (x_client_get_type (), NULL);
client->priv->server = server;
- g_signal_connect (client, X_CLIENT_SIGNAL_DISCONNECTED, G_CALLBACK (x_client_disconnected_cb), server);
client->priv->socket = data_socket;
client->priv->channel = g_io_channel_unix_new (g_socket_get_fd (data_socket));
+ g_io_add_watch (client->priv->channel, G_IO_IN | G_IO_HUP, client_read_cb, client);
g_hash_table_insert (server->priv->clients, client->priv->channel, client);
g_signal_emit (server, x_server_signals[X_SERVER_CLIENT_CONNECTED], 0, client);
@@ -210,4 +230,12 @@ x_server_class_init (XServerClass *klass)
NULL, NULL,
NULL,
G_TYPE_NONE, 1, x_client_get_type ());
+ x_server_signals[X_SERVER_RESET] =
+ g_signal_new (X_SERVER_SIGNAL_RESET,
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (XServerClass, reset),
+ NULL, NULL,
+ NULL,
+ G_TYPE_NONE, 0);
}