make the mainloop not depend on an X display, and make it uses the obt_display automatically

This commit is contained in:
Dana Jansens 2007-07-28 15:38:29 -04:00
parent ef54ca590d
commit 700b2c0aec
3 changed files with 24 additions and 8 deletions

View file

@ -18,6 +18,7 @@
*/ */
#include "obt/mainloop.h" #include "obt/mainloop.h"
#include "obt/display.h"
#include "obt/util.h" #include "obt/util.h"
#include <stdio.h> #include <stdio.h>
@ -67,6 +68,7 @@ static gint core_signals[] =
static void sighandler(gint sig); static void sighandler(gint sig);
static void timer_dispatch(ObtMainLoop *loop, GTimeVal **wait); static void timer_dispatch(ObtMainLoop *loop, GTimeVal **wait);
static void fd_handler_destroy(gpointer data); static void fd_handler_destroy(gpointer data);
static void calc_max_fd(ObtMainLoop *loop);
struct _ObtMainLoop struct _ObtMainLoop
{ {
@ -138,17 +140,15 @@ struct _ObtMainLoopFdHandlerType
GDestroyNotify destroy; GDestroyNotify destroy;
}; };
ObtMainLoop *obt_main_loop_new(Display *display) ObtMainLoop *obt_main_loop_new()
{ {
ObtMainLoop *loop; ObtMainLoop *loop;
loop = g_new0(ObtMainLoop, 1); loop = g_new0(ObtMainLoop, 1);
loop->ref = 1; loop->ref = 1;
loop->display = display;
loop->fd_x = ConnectionNumber(display);
FD_ZERO(&loop->fd_set); FD_ZERO(&loop->fd_set);
FD_SET(loop->fd_x, &loop->fd_set); loop->fd_x = -1;
loop->fd_max = loop->fd_x; loop->fd_max = -1;
loop->fd_handlers = g_hash_table_new_full(g_int_hash, g_int_equal, loop->fd_handlers = g_hash_table_new_full(g_int_hash, g_int_equal,
NULL, fd_handler_destroy); NULL, fd_handler_destroy);
@ -339,11 +339,21 @@ void obt_main_loop_x_add(ObtMainLoop *loop,
h->func = handler; h->func = handler;
h->data = data; h->data = data;
h->destroy = notify; 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); loop->x_handlers = g_slist_prepend(loop->x_handlers, h);
} }
void obt_main_loop_x_remove(ObtMainLoop *loop, void obt_main_loop_x_remove(ObtMainLoop *loop,
ObtMainLoopXHandler handler) ObtMainLoopXHandler handler)
{ {
GSList *it, *next; GSList *it, *next;
@ -356,6 +366,11 @@ void obt_main_loop_x_remove(ObtMainLoop *loop,
g_free(h); g_free(h);
} }
} }
if (!loop->x_handlers) {
FD_CLR(loop->fd_x, &loop->fd_set);
calc_max_fd(loop);
}
} }
/*** SIGNAL WATCHERS ***/ /*** SIGNAL WATCHERS ***/
@ -502,6 +517,7 @@ void obt_main_loop_fd_remove(ObtMainLoop *loop,
gint fd) gint fd)
{ {
g_hash_table_remove(loop->fd_handlers, &fd); g_hash_table_remove(loop->fd_handlers, &fd);
calc_max_fd(loop);
} }
/*** TIMEOUTS ***/ /*** TIMEOUTS ***/

View file

@ -27,7 +27,7 @@ G_BEGIN_DECLS
typedef struct _ObtMainLoop ObtMainLoop; 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_ref(ObtMainLoop *loop);
void obt_main_loop_unref(ObtMainLoop *loop); void obt_main_loop_unref(ObtMainLoop *loop);

View file

@ -151,7 +151,7 @@ gint main(gint argc, gchar **argv)
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }
ob_main_loop = obt_main_loop_new(obt_display); ob_main_loop = obt_main_loop_new();
/* set up signal handler */ /* set up signal handler */
obt_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL,NULL); obt_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL,NULL);