all repos — openbox @ ec7898dda7bfdd56cfb4d9ff51dddc1c1ab1f00e

openbox fork - make it a bit more like ryudo

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

ec7898dda7bfdd56cfb4d9ff51dddc1c1ab1f00e

parent

3167fc223ea82851ae954b348a5ff1c0ce6b6d79

4 files changed, 54 insertions(+), 35 deletions(-)

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

@@ -538,15 +538,6 @@

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

@@ -3264,18 +3255,23 @@ }

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) { - /* it came back to life ! */ + if (dead) + /* the client isn't responding, so ask to kill it */ + client_prompt_kill(self); + else { + /* 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; } }

@@ -3283,6 +3279,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;

@@ -3300,6 +3297,14 @@ OBT_PROP_MSG_TO(self->window, self->window, WM_PROTOCOLS,

OBT_PROP_ATOM(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); }

@@ -3328,15 +3333,22 @@ { _("No"), OB_KILL_RESULT_NO },

{ _("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]),

@@ -3354,7 +3366,7 @@ {

/* 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",

@@ -4345,3 +4357,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; +}
M openbox/client.hopenbox/client.h

@@ -727,4 +727,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
M openbox/ping.copenbox/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,10 +69,11 @@ void ping_start(struct _ObClient *client, ObPingEventHandler h)

{ ObPingTarget *t; + /* make sure the client supports ping! */ + g_assert(client->ping == TRUE); + /* 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); + if (g_hash_table_find(ping_ids, find_client, client) != NULL) return; t = g_new0(ObPingTarget, 1); t->client = client;

@@ -89,11 +90,6 @@ /* 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) -{ - ping_end(c, NULL); -} - void ping_got_pong(guint32 id) { ObPingTarget *t;

@@ -106,6 +102,9 @@ need to notify that they are again */

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", id);
M openbox/ping.hopenbox/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);