summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-07-28 15:38:29 -0400
committerDana Jansens <danakj@orodu.net>2008-01-20 01:36:56 -0500
commit700b2c0aec0663249e39333b24de02f249f70267 (patch)
treeb84d802f3ce8c9c785a0b2fa4c19d3c1aaa6bd4a
parentef54ca590d49666b2f9df75c5c08537bee139819 (diff)
make the mainloop not depend on an X display, and make it uses the obt_display automatically
-rw-r--r--obt/mainloop.c28
-rw-r--r--obt/mainloop.h2
-rw-r--r--openbox/openbox.c2
3 files changed, 24 insertions, 8 deletions
diff --git a/obt/mainloop.c b/obt/mainloop.c
index 9797770d..f6f2fa07 100644
--- a/obt/mainloop.c
+++ b/obt/mainloop.c
@@ -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()
{
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 ***/
diff --git a/obt/mainloop.h b/obt/mainloop.h
index cdc0bd29..cce7d5b5 100644
--- a/obt/mainloop.h
+++ b/obt/mainloop.h
@@ -27,7 +27,7 @@ G_BEGIN_DECLS
typedef struct _ObtMainLoop ObtMainLoop;
-ObtMainLoop *obt_main_loop_new(Display *display);
+ObtMainLoop *obt_main_loop_new();
void obt_main_loop_ref(ObtMainLoop *loop);
void obt_main_loop_unref(ObtMainLoop *loop);
diff --git a/openbox/openbox.c b/openbox/openbox.c
index c9979325..8aefd76a 100644
--- a/openbox/openbox.c
+++ b/openbox/openbox.c
@@ -151,7 +151,7 @@ gint main(gint argc, gchar **argv)
exit(EXIT_SUCCESS);
}
- ob_main_loop = obt_main_loop_new(obt_display);
+ ob_main_loop = obt_main_loop_new();
/* set up signal handler */
obt_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL,NULL);