1 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
3 obt/xevent.c for the Openbox window manager
4 Copyright (c) 2007 Dana Jansens
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 See the COPYING file for a copy of the GNU General Public License.
19 #include "obt/xevent.h"
20 #include "obt/mainloop.h"
22 typedef struct _ObtXEventBinding ObtXEventBinding;
24 struct _ObtXEventHandler
29 /* A hash table where the key is the window, and the value is the
31 GHashTable *bindings[LASTEvent]; /* LASTEvent comes from X.h */
34 struct _ObtXEventBinding
37 ObtXEventCallback func;
41 static void xevent_handler(const XEvent *e, gpointer data);
42 static guint window_hash(Window *w) { return *w; }
43 static gboolean window_comp(Window *w1, Window *w2) { return *w1 == *w2; }
45 ObtXEventHandler* xevent_new()
50 h = g_new(ObtXEventHandler, 1);
52 for (i = 0; i < LASTEvent; ++i)
53 h->bindings[i] = g_hash_table_new_full((GHashFunc)window_hash,
54 (GEqualFunc)window_comp,
59 void xevent_ref(ObtXEventHandler *h)
64 void xevent_unref(ObtXEventHandler *h)
66 if (h && --h->ref == 0) {
68 obt_main_loop_x_remove(h->loop, xevent_handler);
72 void xevent_register(ObtXEventHandler *h, ObtMainLoop *loop)
75 obt_main_loop_x_add(loop, xevent_handler, h, NULL);
78 void xevent_set_handler(ObtXEventHandler *h, gint type, Window win,
79 ObtXEventCallback func, gpointer data)
83 g_assert(type < LASTEvent);
87 b = g_new(ObtXEventBinding, 1);
91 g_hash_table_replace(h->bindings[type], &b->win, b);
94 void xevent_remove_handler(ObtXEventHandler *h, gint type, Window win)
96 g_assert(type < LASTEvent);
99 g_hash_table_remove(h->bindings[type], &win);
102 static void xevent_handler(const XEvent *e, gpointer data)
108 b = g_hash_table_lookup(h->bindings[e->xany.type], &e->xany.window);
109 if (b) b->func(e, b->data);