don't ping everything all the time. yay. ping when you close, and if it doesn't...
authorDana Jansens <danakj@orodu.net>
Tue, 12 Feb 2008 03:45:27 +0000 (22:45 -0500)
committerMikael Magnusson <mikachu@comhem.se>
Thu, 14 Feb 2008 09:46:41 +0000 (10:46 +0100)
openbox/client.c
openbox/client.h
openbox/ping.c
openbox/ping.h

index dd1f5e7..e65ed07 100644 (file)
@@ -538,15 +538,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);
 
@@ -3264,18 +3255,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;
     }
 }
 
@@ -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 @@ void client_close(ObClient *self)
                         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 @@ 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]),
@@ -3354,7 +3366,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",
@@ -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;
+}
index dbe93d2..bb63137 100644 (file)
@@ -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
index 42487ab..8320249 100644 (file)
@@ -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", id);
index 1333ea0..ceb0bdb 100644 (file)
@@ -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);