all repos — openbox @ 700b2c0aec0663249e39333b24de02f249f70267

openbox fork - make it a bit more like ryudo

make the mainloop not depend on an X display, and make it uses the obt_display automatically
Dana Jansens danakj@orodu.net
commit

700b2c0aec0663249e39333b24de02f249f70267

parent

ef54ca590d49666b2f9df75c5c08537bee139819

3 files changed, 24 insertions(+), 8 deletions(-)

jump to
M obt/mainloop.cobt/mainloop.c

@@ -18,6 +18,7 @@ See the COPYING file for a copy of the GNU General Public License.

*/ #include "obt/mainloop.h" +#include "obt/display.h" #include "obt/util.h" #include <stdio.h>

@@ -67,6 +68,7 @@

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 @@ ObtMainLoopFdHandler func;

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 @@ h->loop = 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;

@@ -355,6 +365,11 @@ loop->x_handlers = g_slist_delete_link(loop->x_handlers, it);

if (h->destroy) h->destroy(h->data); g_free(h); } + } + + if (!loop->x_handlers) { + FD_CLR(loop->fd_x, &loop->fd_set); + calc_max_fd(loop); } }

@@ -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 ***/
M obt/mainloop.hobt/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);
M openbox/openbox.copenbox/openbox.c

@@ -151,7 +151,7 @@ obt_display_close(obt_display);

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);