all repos — openbox @ a1bb01c92e0de7cc9a82e9b3f68916a34851bff9

openbox fork - make it a bit more like ryudo

Use a gsource instead of gio channels for watching x events

Fixes not getting some focusin events sometimes.
Mikael Magnusson mikachu@gmail.com
commit

a1bb01c92e0de7cc9a82e9b3f68916a34851bff9

parent

de7c3f466f1e69e470b3767a5eaab4b6af24b655

1 files changed, 31 insertions(+), 7 deletions(-)

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

@@ -327,7 +327,7 @@

static ObtXQueueCB *callbacks = NULL; static guint n_callbacks = 0; -static gboolean event_read(GIOChannel *s, GIOCondition cond, gpointer data) +static gboolean event_read(GSource *source, GSourceFunc callback, gpointer data) { XEvent ev;

@@ -340,15 +340,39 @@

return TRUE; /* repeat */ } -void xqueue_listen(void) +static gboolean x_source_prepare(GSource *source, gint *timeout) +{ + *timeout = -1; + return XPending(obt_display); +} + +static gboolean x_source_check(GSource *source) { - GIOChannel *ch; + return XPending(obt_display); +} - g_assert(obt_display != NULL); +struct x_source { + GSource source; - ch = g_io_channel_unix_new(ConnectionNumber(obt_display)); - g_io_add_watch(ch, G_IO_IN, event_read, NULL); - g_io_channel_unref(ch); + GPollFD pfd; +}; + +static GSourceFuncs x_source_funcs = { + x_source_prepare, + x_source_check, + event_read, + NULL +}; + +void xqueue_listen(void) +{ + GSource *source = g_source_new(&x_source_funcs, sizeof(struct x_source)); + struct x_source *x_source = (struct x_source *)source; + GPollFD *pfd = &x_source->pfd; + + *pfd = (GPollFD){ ConnectionNumber(obt_display), G_IO_IN, G_IO_IN }; + g_source_add_poll(source, pfd); + g_source_attach(source, NULL); } void xqueue_add_callback(ObtXQueueFunc f, gpointer data)