From 810afd8597da355039e289218abed6c062585870 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 15 Jan 2008 22:34:04 -0500 Subject: [PATCH] ping all the windows every 3 seconds, and show "not responding" if they stop replying for 3 times (9-12 seconds). show [Killing...] in the titlebar when trying to kill an app off --- openbox/client.c | 50 ++++++++++++++++++++++++++++++++++-------------- openbox/client.h | 6 ++++-- openbox/ping.c | 6 +++--- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 5443b158..85f5e691 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -602,6 +602,9 @@ void client_manage(Window window) /* update the list hints */ client_set_list(); + /* watch for when the application stops responding */ + if (self->ping) ping_start(self, client_ping_event); + /* free the ObAppSettings shallow copy */ g_free(settings); @@ -683,6 +686,9 @@ 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) ping_stop(self); + /* update the focus lists */ focus_order_remove(self); if (client_focused(self)) { @@ -1955,7 +1961,10 @@ void client_update_title(ObClient *self) if (self->not_responding) { data = visible; - visible = g_strdup_printf("%s - [%s]", data, _("Not Responding")); + if (self->close_tried_term) + visible = g_strdup_printf("%s - [%s]", data, _("Killing...")); + else + visible = g_strdup_printf("%s - [%s]", data, _("Not Responding")); g_free(data); } @@ -1984,7 +1993,10 @@ void client_update_title(ObClient *self) if (self->not_responding) { data = visible; - visible = g_strdup_printf("%s - [%s]", data, _("Not Responding")); + if (self->close_tried_term) + visible = g_strdup_printf("%s - [%s]", data, _("Killing...")); + else + visible = g_strdup_printf("%s - [%s]", data, _("Not Responding")); g_free(data); } @@ -3194,6 +3206,14 @@ static void client_ping_event(ObClient *self, gboolean dead) { self->not_responding = dead; client_update_title(self); + + if (!dead) { + /* the window has started responding again, so don't kill it the first + time they click on close, even if it stops responding again in the + future */ + self->close_tried_destroy = FALSE; + self->close_tried_term = FALSE; + } } void client_close(ObClient *self) @@ -3206,20 +3226,14 @@ void client_close(ObClient *self) /* don't use client_kill(), we should only kill based on PID in response to a lack of PING replies */ XKillClient(ob_display, self->window); - else if (self->not_responding) + else if (self->not_responding && self->close_tried_destroy) client_kill(self); else { PROP_MSG_TO(self->window, self->window, wm_protocols, prop_atoms.wm_delete_window, event_curtime, 0, 0, 0, NoEventMask); - - if (self->ping) { - /* may have tried to kill it earlier but the window is still - around and started responding again */ - self->kill_tried_term = FALSE; - - ping_start(self, client_ping_event); - } + self->close_tried_destroy = TRUE; + self->close_tried_term = FALSE; } } @@ -3227,12 +3241,20 @@ void client_kill(ObClient *self) { if (!self->client_machine && self->pid) { /* running on the local host */ - if (!self->kill_tried_term) { + if (!self->close_tried_term) { + ob_debug("killing window 0x%x with pid %lu, with SIGTERM\n", + self->window, self->pid); kill(self->pid, SIGTERM); - self->kill_tried_term = TRUE; + self->close_tried_term = TRUE; + + /* show that we're trying to kill it */ + client_update_title(self); } - else + else { + ob_debug("killing window 0x%x with pid %lu, with SIGKILL\n", + self->window, self->pid); kill(self->pid, SIGKILL); /* kill -9 */ + } } else XKillClient(ob_display, self->window); diff --git a/openbox/client.h b/openbox/client.h index f568b008..b9dd9e5a 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -231,8 +231,10 @@ struct _ObClient /*! Indicates if the client is trying to close but has stopped responding to pings */ gboolean not_responding; - /*! We tried to kill the client with SIGTERM */ - gboolean kill_tried_term; + /*! We tried to close the window with a DESTROY message */ + gboolean close_tried_destroy; + /*! We tried to close the window with a SIGTERM */ + gboolean close_tried_term; #ifdef SYNC /*! The client wants to sync during resizes */ diff --git a/openbox/ping.c b/openbox/ping.c index 687dd7f4..874d020c 100644 --- a/openbox/ping.c +++ b/openbox/ping.c @@ -35,7 +35,7 @@ typedef struct _ObPingTarget static GSList *ping_targets = NULL; static gboolean active = FALSE; -#define PING_TIMEOUT (G_USEC_PER_SEC * 1) +#define PING_TIMEOUT (G_USEC_PER_SEC * 3) /*! Warn the user after this many PING_TIMEOUT intervals */ #define PING_TIMEOUT_WARN 3 @@ -87,7 +87,7 @@ void ping_got_pong(Time timestamp) for (it = ping_targets; it != NULL; it = g_slist_next(it)) { t = it->data; if (t->sent == timestamp) { - ob_debug("Got PONG with timestamp %lu\n", timestamp); + /*ob_debug("Got PONG with timestamp %lu\n", timestamp);*/ if (t->waiting > PING_TIMEOUT_WARN) { /* we had notified that they weren't responding, so now we need to notify that they are again */ @@ -106,7 +106,7 @@ void ping_got_pong(Time timestamp) static void ping_send(ObPingTarget *t) { t->sent = event_get_server_time(); - ob_debug("PINGing client 0x%x at %lu\n", t->client->window, t->sent); + /*ob_debug("PINGing client 0x%x at %lu\n", t->client->window, t->sent);*/ PROP_MSG_TO(t->client->window, t->client->window, wm_protocols, prop_atoms.net_wm_ping, t->sent, t->client->window, 0, 0, NoEventMask); -- 2.44.0