ping all the windows every 3 seconds, and show "not responding" if they stop replying...
authorDana Jansens <danakj@orodu.net>
Wed, 16 Jan 2008 03:34:04 +0000 (22:34 -0500)
committerDana Jansens <danakj@orodu.net>
Wed, 16 Jan 2008 03:34:04 +0000 (22:34 -0500)
openbox/client.c
openbox/client.h
openbox/ping.c

index 5443b15..85f5e69 100644 (file)
@@ -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);
index f568b00..b9dd9e5 100644 (file)
@@ -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 */
index 687dd7f..874d020 100644 (file)
@@ -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);