summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2010-06-25 13:04:39 +0200
committerMikael Magnusson <mikachu@gmail.com>2010-06-25 13:08:00 +0200
commita1bb01c92e0de7cc9a82e9b3f68916a34851bff9 (patch)
treee30206e63d70b47f30f2d441393716d67341d185
parentde7c3f466f1e69e470b3767a5eaab4b6af24b655 (diff)
Use a gsource instead of gio channels for watching x events
Fixes not getting some focusin events sometimes.
-rw-r--r--obt/xqueue.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/obt/xqueue.c b/obt/xqueue.c
index 22a3de23..b370c4a8 100644
--- a/obt/xqueue.c
+++ b/obt/xqueue.c
@@ -327,7 +327,7 @@ typedef struct _ObtXQueueCB {
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 @@ static gboolean event_read(GIOChannel *s, GIOCondition cond, gpointer data)
return TRUE; /* repeat */
}
-void xqueue_listen(void)
+static gboolean x_source_prepare(GSource *source, gint *timeout)
{
- GIOChannel *ch;
+ *timeout = -1;
+ return XPending(obt_display);
+}
+
+static gboolean x_source_check(GSource *source)
+{
+ return XPending(obt_display);
+}
- g_assert(obt_display != NULL);
+struct x_source {
+ GSource source;
+
+ 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;
- 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);
+ *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)