From c778cf15cbc954d0f42ef9030d56c61bb494c1e0 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 11 Feb 2008 22:45:27 -0500 Subject: [PATCH] don't ping everything all the time. yay. ping when you close, and if it doesn't reply then show the kill prompt. also show a more correct prompt for windows connecting from non-local machines - ask to disconnect them from the X server. --- openbox/client.c | 68 +++++++++++++++++++++++++++++++++++--------------------- openbox/client.h | 3 +++ openbox/ping.c | 17 +++++++------- openbox/ping.h | 1 - 4 files changed, 54 insertions(+), 35 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index c8c6c93..62489c1 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -619,15 +619,6 @@ void client_manage(Window window, ObPrompt *prompt) /* update the list hints */ 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. - 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); - /* free the ObAppSettings shallow copy */ g_free(settings); @@ -3344,18 +3335,23 @@ void client_shade(ObClient *self, gboolean shade) static void client_ping_event(ObClient *self, gboolean dead) { - self->not_responding = dead; - client_update_title(self); + if (self->not_responding != dead) { + self->not_responding = dead; + client_update_title(self); + + if (dead) + /* the client isn't responding, so ask to kill it */ + client_prompt_kill(self); + else { + /* it came back to life ! */ - if (!dead) { - /* it came back to life ! */ + if (self->kill_prompt) { + prompt_unref(self->kill_prompt); + self->kill_prompt = NULL; + } - if (self->kill_prompt) { - prompt_unref(self->kill_prompt); - self->kill_prompt = NULL; + self->kill_level = 0; } - - self->kill_level = 0; } } @@ -3363,6 +3359,7 @@ void client_close(ObClient *self) { if (!(self->functions & OB_CLIENT_FUNC_CLOSE)) return; + /* if closing an internal obprompt, that is just cancelling it */ if (self->prompt) { prompt_cancel(self->prompt); return; @@ -3380,6 +3377,14 @@ void client_close(ObClient *self) prop_atoms.wm_delete_window, event_curtime, 0, 0, 0, NoEventMask); + /* we're trying to close the window, so see if it is responding. if it + is not, then we will let them kill the window */ + if (self->ping) + ping_start(self, client_ping_event); + + /* if we already know the window isn't responding (maybe they clicked + no in the kill dialog but it hasn't come back to life), then show + the kill dialog */ if (self->not_responding) client_prompt_kill(self); } @@ -3408,15 +3413,22 @@ static void client_prompt_kill(ObClient *self) { _("Yes"), OB_KILL_RESULT_YES } }; gchar *m; - const gchar *sig; - if (self->kill_level == 0) - sig = "terminate"; + if (client_on_localhost(self)) { + const gchar *sig; + + if (self->kill_level == 0) + sig = "terminate"; + else + sig = "kill"; + + m = g_strdup_printf + (_("The window \"%s\" does not seem to be responding. Do you want to force it to exit by sending the %s signal?"), self->original_title, sig); + } else - sig = "kill"; + m = g_strdup_printf + (_("The window \"%s\" does not seem to be responding. Do you want to disconnect it from the X server?"), self->original_title); - m = g_strdup_printf - (_("The window \"%s\" does not seem to be responding. Do you want to force it to exit by sending the %s signal?"), self->original_title, sig); self->kill_prompt = prompt_new(m, answers, sizeof(answers)/sizeof(answers[0]), @@ -3434,7 +3446,7 @@ void client_kill(ObClient *self) /* don't kill our own windows */ if (self->prompt) return; - if (!self->client_machine && self->pid) { + if (client_on_localhost(self) && self->pid) { /* running on the local host */ if (self->kill_level == 0) { ob_debug("killing window 0x%x with pid %lu, with SIGTERM", @@ -4424,3 +4436,9 @@ gboolean client_has_group_siblings(ObClient *self) { return self->group && self->group->members->next; } + +/*! Returns TRUE if the client is running on the same machine as Openbox */ +gboolean client_on_localhost(ObClient *self) +{ + return self->client_machine == NULL; +} diff --git a/openbox/client.h b/openbox/client.h index 197fb06..c34d0ab 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -729,4 +729,7 @@ ObClient* client_under_pointer(); gboolean client_has_group_siblings(ObClient *self); +/*! Returns TRUE if the client is running on the same machine as Openbox */ +gboolean client_on_localhost(ObClient *self); + #endif diff --git a/openbox/ping.c b/openbox/ping.c index 37b5d30..748c0c8 100644 --- a/openbox/ping.c +++ b/openbox/ping.c @@ -38,7 +38,7 @@ static guint32 ping_next_id = 1; #define PING_TIMEOUT (G_USEC_PER_SEC * 3) /*! Warn the user after this many PING_TIMEOUT intervals */ -#define PING_TIMEOUT_WARN 3 +#define PING_TIMEOUT_WARN 1 static void ping_send(ObPingTarget *t); static void ping_end(ObClient *client, gpointer data); @@ -69,11 +69,12 @@ 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); - + /* make sure the client supports ping! */ g_assert(client->ping == TRUE); + /* make sure we're not already pinging the client */ + if (g_hash_table_find(ping_ids, find_client, client) != NULL) return; + t = g_new0(ObPingTarget, 1); t->client = client; t->h = h; @@ -89,11 +90,6 @@ void ping_start(struct _ObClient *client, ObPingEventHandler h) g_assert(g_hash_table_find(ping_ids, find_client, client) != NULL); } -void ping_stop(struct _ObClient *c) -{ - ping_end(c, NULL); -} - void ping_got_pong(guint32 id) { ObPingTarget *t; @@ -106,6 +102,9 @@ void ping_got_pong(guint32 id) t->h(t->client, FALSE); } t->waiting = 0; /* not waiting for a reply anymore */ + + /* we got a pong so we're happy now */ + ping_end(t->client, NULL); } else ob_debug("Got PONG with id %u but not waiting for one\n", id); diff --git a/openbox/ping.h b/openbox/ping.h index 1333ea0..ceb0bdb 100644 --- a/openbox/ping.h +++ b/openbox/ping.h @@ -37,7 +37,6 @@ void ping_startup(gboolean reconfigure); void ping_shutdown(gboolean reconfigure); void ping_start(struct _ObClient *c, ObPingEventHandler h); -void ping_stop(struct _ObClient *c); void ping_got_pong(guint32 id); -- 1.9.1