all repos — openbox @ cccc57fdb04b2e5602254f1eb623acc95f9a032e

openbox fork - make it a bit more like ryudo

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
Dana Jansens danakj@orodu.net
commit

cccc57fdb04b2e5602254f1eb623acc95f9a032e

parent

7630f660350bc39d0535a5aeb1da69ba25baf26b

2 files changed, 19 insertions(+), 15 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -609,7 +609,10 @@ client_set_list();

/* 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);

@@ -693,10 +696,6 @@ mouse_grab_for_client(self, FALSE);

/* 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);
M openbox/ping.copenbox/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 @@ {

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 @@

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 @@ {

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 @@ if (++ping_next_id == 0) ++ping_next_id; /* skip 0 on wraparound */

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); + if ((t = g_hash_table_find(ping_ids, find_client, client))) { + g_hash_table_remove(ping_ids, &t->id); - 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); + } }