]> Dogcows Code - chaz/openbox/blobdiff - obt/mainloop.c
Merge branch 'backport' into work
[chaz/openbox] / obt / mainloop.c
index 9797770d9f3e19528a2c29026b3cd7fececf565f..691c6875174585e7352bbf7d842e351407de5e8a 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "obt/mainloop.h"
+#include "obt/display.h"
 #include "obt/util.h"
 
 #include <stdio.h>
@@ -67,6 +68,7 @@ static gint core_signals[] =
 static void sighandler(gint sig);
 static void timer_dispatch(ObtMainLoop *loop, GTimeVal **wait);
 static void fd_handler_destroy(gpointer data);
+static void calc_max_fd(ObtMainLoop *loop);
 
 struct _ObtMainLoop
 {
@@ -138,17 +140,15 @@ struct _ObtMainLoopFdHandlerType
     GDestroyNotify destroy;
 };
 
-ObtMainLoop *obt_main_loop_new(Display *display)
+ObtMainLoop *obt_main_loop_new(void)
 {
     ObtMainLoop *loop;
 
     loop = g_new0(ObtMainLoop, 1);
     loop->ref = 1;
-    loop->display = display;
-    loop->fd_x = ConnectionNumber(display);
     FD_ZERO(&loop->fd_set);
-    FD_SET(loop->fd_x, &loop->fd_set);
-    loop->fd_max = loop->fd_x;
+    loop->fd_x = -1;
+    loop->fd_max = -1;
 
     loop->fd_handlers = g_hash_table_new_full(g_int_hash, g_int_equal,
                                               NULL, fd_handler_destroy);
@@ -339,11 +339,21 @@ void obt_main_loop_x_add(ObtMainLoop *loop,
     h->func = handler;
     h->data = data;
     h->destroy = notify;
+
+    if (!loop->x_handlers) {
+        g_assert(obt_display); /* is the display open? */
+
+        loop->display = obt_display;
+        loop->fd_x = ConnectionNumber(loop->display);
+        FD_SET(loop->fd_x, &loop->fd_set);
+        calc_max_fd(loop);
+    }
+
     loop->x_handlers = g_slist_prepend(loop->x_handlers, h);
 }
 
 void obt_main_loop_x_remove(ObtMainLoop *loop,
-                           ObtMainLoopXHandler handler)
+                            ObtMainLoopXHandler handler)
 {
     GSList *it, *next;
 
@@ -356,6 +366,11 @@ void obt_main_loop_x_remove(ObtMainLoop *loop,
             g_free(h);
         }
     }
+
+    if (!loop->x_handlers) {
+        FD_CLR(loop->fd_x, &loop->fd_set);
+        calc_max_fd(loop);
+    }
 }
 
 /*** SIGNAL WATCHERS ***/
@@ -502,6 +517,7 @@ void obt_main_loop_fd_remove(ObtMainLoop *loop,
                              gint fd)
 {
     g_hash_table_remove(loop->fd_handlers, &fd);
+    calc_max_fd(loop);
 }
 
 /*** TIMEOUTS ***/
@@ -520,7 +536,7 @@ static void insert_timer(ObtMainLoop *loop, ObtMainLoopTimer *ins)
 {
     GSList *it;
     for (it = loop->timers; it; it = g_slist_next(it)) {
-        ObMainLoopTimer *t = it->data;
+        ObtMainLoopTimer *t = it->data;
         if (timecompare(&ins->timeout, &t->timeout) <= 0) {
             loop->timers = g_slist_insert_before(loop->timers, it, ins);
             break;
@@ -537,7 +553,7 @@ void obt_main_loop_timeout_add(ObtMainLoop *loop,
                                GEqualFunc cmp,
                                GDestroyNotify notify)
 {
-    ObMainLoopTimer *t = g_new(ObMainLoopTimer, 1);
+    ObtMainLoopTimer *t = g_new(ObtMainLoopTimer, 1);
 
     g_assert(microseconds > 0); /* if it's 0 it'll cause an infinite loop */
 
This page took 0.023315 seconds and 4 git commands to generate.