Revert "add XFlush to g_timeout callbacks"
[dana/openbox.git] / openbox / ping.c
index 42487ab..7cb4766 100644 (file)
@@ -22,7 +22,6 @@
 #include "event.h"
 #include "debug.h"
 #include "openbox.h"
-#include "obt/mainloop.h"
 #include "obt/prop.h"
 
 typedef struct _ObPingTarget
@@ -30,15 +29,16 @@ typedef struct _ObPingTarget
     ObClient *client;
     ObPingEventHandler h;
     guint32 id;
+    guint loopid;
     gint waiting;
 } ObPingTarget;
 
 static GHashTable *ping_ids     = NULL;
 static guint32     ping_next_id = 1;
 
-#define PING_TIMEOUT (G_USEC_PER_SEC * 3)
+#define PING_TIMEOUT 3000 /* in MS */
 /*! Warn the user after this many PING_TIMEOUT intervals */
-#define PING_TIMEOUT_WARN 3
+#define PING_TIMEOUT_WARN 2
 
 static void     ping_send(ObPingTarget *t);
 static void     ping_end(ObClient *client, gpointer data);
@@ -69,17 +69,18 @@ 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);
 
-    t = g_new0(ObPingTarget, 1);
+    /* make sure we're not already pinging the client */
+    if (g_hash_table_find(ping_ids, find_client, client) != NULL) return;
+
+    t = g_slice_new0(ObPingTarget);
     t->client = client;
     t->h = h;
 
-    obt_main_loop_timeout_add(ob_main_loop, PING_TIMEOUT, ping_timeout,
-                              t, g_direct_equal, NULL);
+    t->loopid = g_timeout_add_full(G_PRIORITY_DEFAULT, PING_TIMEOUT,
+                                   ping_timeout, t, NULL);
     /* act like we just timed out immediately, to start the pinging process
        now instead of after the first delay.  this makes sure the client
        ends up in the ping_ids hash table now. */
@@ -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);
@@ -159,9 +158,8 @@ static void ping_end(ObClient *client, gpointer data)
     if ((t = g_hash_table_find(ping_ids, find_client, client))) {
         g_hash_table_remove(ping_ids, &t->id);
 
-        obt_main_loop_timeout_remove_data(ob_main_loop, ping_timeout,
-                                          t, FALSE);
+        g_source_remove(t->loopid);
 
-        g_free(t);
+        g_slice_free(ObPingTarget, t);
     }
 }