Revert "add XFlush to g_timeout callbacks"
[dana/openbox.git] / openbox / ping.c
index 37b5d30..7cb4766 100644 (file)
 
 #include "ping.h"
 #include "client.h"
-#include "prop.h"
 #include "event.h"
 #include "debug.h"
-#include "mainloop.h"
 #include "openbox.h"
+#include "obt/prop.h"
 
 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;
 
-    ob_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,26 +90,24 @@ 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;
 
     if ((t = g_hash_table_lookup(ping_ids, &id))) {
-        /*ob_debug("-PONG: '%s' (id %u)\n", t->client->title, t->id);*/
+        /*ob_debug("-PONG: '%s' (id %u)", t->client->title, t->id);*/
         if (t->waiting > PING_TIMEOUT_WARN) {
             /* we had notified that they weren't responding, so now we
                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\n", id);
+        ob_debug("Got PONG with id %u but not waiting for one", id);
 }
 
 static gboolean find_client(gpointer key, gpointer value, gpointer client)
@@ -131,10 +130,10 @@ static void ping_send(ObPingTarget *t)
         g_hash_table_insert(ping_ids, &t->id, t);
     }
 
-    /*ob_debug("+PING: '%s' (id %u)\n", t->client->title, t->id);*/
-    PROP_MSG_TO(t->client->window, t->client->window, wm_protocols,
-                prop_atoms.net_wm_ping, t->id, t->client->window, 0, 0,
-                NoEventMask);
+    /*ob_debug("+PING: '%s' (id %u)", t->client->title, t->id);*/
+    OBT_PROP_MSG_TO(t->client->window, t->client->window, WM_PROTOCOLS,
+                    OBT_PROP_ATOM(NET_WM_PING), t->id, t->client->window, 0, 0,
+                    NoEventMask);
 }
 
 static gboolean ping_timeout(gpointer data)
@@ -159,8 +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);
 
-        ob_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);
     }
 }