From cccc57fdb04b2e5602254f1eb623acc95f9a032e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 16 Jan 2008 19:21:42 -0500 Subject: [PATCH] make the ping hash tables work correctly. don't need to stop pinging, it will automatically. and not all windows get pings, even tho we get notified that they are being destroyed --- openbox/client.c | 9 ++++----- openbox/ping.c | 25 +++++++++++++++---------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 6a6ec2bd..63245a3c 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -609,7 +609,10 @@ void client_manage(Window window) /* watch for when the application stops responding. only do this for normal windows, i.e. windows which have titlebars and close buttons - and things like that */ + and things like that. + we don't need to stop pinging on unmanage, because it will be handled + automatically by the destroy callback! + */ if (self->ping && client_normal(self)) ping_start(self, client_ping_event); @@ -694,10 +697,6 @@ void client_unmanage(ObClient *self) /* remove the window from our save set */ XChangeSaveSet(ob_display, self->window, SetModeDelete); - /* stop pinging the window */ - if (self->ping && client_normal(self)) - ping_stop(self); - /* update the focus lists */ focus_order_remove(self); if (client_focused(self)) { diff --git a/openbox/ping.c b/openbox/ping.c index 16f95adb..37b5d30c 100644 --- a/openbox/ping.c +++ b/openbox/ping.c @@ -49,7 +49,7 @@ void ping_startup(gboolean reconfigure) { if (reconfigure) return; - ping_ids = g_hash_table_new(g_direct_hash, g_int_equal); + ping_ids = g_hash_table_new(g_int_hash, g_int_equal); /* listen for clients to disappear */ client_add_destroy_notify(ping_end, NULL); @@ -60,6 +60,7 @@ void ping_shutdown(gboolean reconfigure) if (reconfigure) return; g_hash_table_unref(ping_ids); + ping_ids = NULL; client_remove_destroy_notify(ping_end); } @@ -68,6 +69,7 @@ void ping_start(struct _ObClient *client, ObPingEventHandler h) { ObPingTarget *t; + /* make sure we're not already pinging the client */ g_assert(g_hash_table_find(ping_ids, find_client, client) == NULL); g_assert(client->ping == TRUE); @@ -79,8 +81,12 @@ void ping_start(struct _ObClient *client, ObPingEventHandler h) ob_main_loop_timeout_add(ob_main_loop, PING_TIMEOUT, ping_timeout, t, g_direct_equal, NULL); /* act like we just timed out immediately, to start the pinging process - now instead of after the first delay */ + now instead of after the first delay. this makes sure the client + ends up in the ping_ids hash table now. */ ping_timeout(t); + + /* make sure we can remove the client later */ + g_assert(g_hash_table_find(ping_ids, find_client, client) != NULL); } void ping_stop(struct _ObClient *c) @@ -93,7 +99,7 @@ void ping_got_pong(guint32 id) ObPingTarget *t; if ((t = g_hash_table_lookup(ping_ids, &id))) { - /*g_print("-PONG: '%s' (id %u)\n", t->client->title, t->id);*/ + /*ob_debug("-PONG: '%s' (id %u)\n", t->client->title, t->id);*/ if (t->waiting > PING_TIMEOUT_WARN) { /* we had notified that they weren't responding, so now we need to notify that they are again */ @@ -125,7 +131,7 @@ static void ping_send(ObPingTarget *t) g_hash_table_insert(ping_ids, &t->id, t); } - /*g_print("+PING: '%s' (id %u)\n", t->client->title, t->id);*/ + /*ob_debug("+PING: '%s' (id %u)\n", t->client->title, t->id);*/ PROP_MSG_TO(t->client->window, t->client->window, wm_protocols, prop_atoms.net_wm_ping, t->id, t->client->window, 0, 0, NoEventMask); @@ -150,12 +156,11 @@ static void ping_end(ObClient *client, gpointer data) { ObPingTarget *t; - t = g_hash_table_find(ping_ids, find_client, client); - g_assert (t != NULL); - - g_hash_table_remove(ping_ids, &t->id); + if ((t = g_hash_table_find(ping_ids, find_client, client))) { + g_hash_table_remove(ping_ids, &t->id); - ob_main_loop_timeout_remove_data(ob_main_loop, ping_timeout, t, FALSE); + ob_main_loop_timeout_remove_data(ob_main_loop, ping_timeout, t, FALSE); - g_free(t); + g_free(t); + } } -- 2.39.2