make the mainloop not depend on an X display, and make it uses the obt_display automatically
This commit is contained in:
parent
ef54ca590d
commit
700b2c0aec
3 changed files with 24 additions and 8 deletions
|
@ -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 ***/
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue