ob3_LDFLAGS=-export-dynamic
ob3_SOURCES=client.c event.c extensions.c focus.c frame.c openbox.c prop.c \
screen.c stacking.c xerror.c themerc.c timer.c dispatch.c \
- engine.c plugin.c action.c
+ engine.c plugin.c action.c grab.c
noinst_HEADERS=client.h event.h extensions.h focus.h frame.h geom.h gettext.h \
openbox.h prop.h screen.h stacking.h xerror.h themerc.h dispatch.h \
- timer.h engine.h plugin.h action.h
+ timer.h engine.h plugin.h action.h grab.h
MAINTAINERCLEANFILES= Makefile.in
--- /dev/null
+#include "openbox.h"
+#include <glib.h>
+#include <X11/Xlib.h>
+
+static guint kgrabs, pgrabs;
+
+void grab_keyboard(gboolean grab)
+{
+ if (grab) {
+ if (kgrabs++ == 0)
+ XGrabKeyboard(ob_display, ob_root, 0, GrabModeAsync, GrabModeSync,
+ CurrentTime);
+ } else if (kgrabs > 0) {
+ if (--kgrabs == 0)
+ XUngrabKeyboard(ob_display, CurrentTime);
+ }
+}
+
+void grab_pointer(gboolean grab, Cursor cur)
+{
+ if (grab) {
+ if (pgrabs++ == 0)
+ XGrabPointer(ob_display, ob_root, False, 0, GrabModeAsync,
+ GrabModeSync, FALSE, cur, CurrentTime);
+ } else if (pgrabs > 0) {
+ if (--pgrabs == 0)
+ XUngrabPointer(ob_display, CurrentTime);
+ }
+}
+
+void grab_startup()
+{
+ kgrabs = pgrabs = 0;
+}
+
+void grab_shutdown()
+{
+ while (kgrabs) grab_keyboard(FALSE);
+ while (pgrabs) grab_pointer(FALSE, None);
+}
--- /dev/null
+#ifndef __grab_h
+#define __grab_h
+
+#include <glib.h>
+#include <X11/Xlib.h>
+
+void grab_startup();
+void grab_shutdown();
+
+void grab_keyboard(gboolean grab);
+void grab_pointer(gboolean grab, Cursor cur);
+
+#endif
#include "focus.h"
#include "extensions.h"
#include "gettext.h"
+#include "grab.h"
#include "engine.h"
#include "themerc.h"
#include "plugin.h"
screen_startup();
focus_startup();
client_startup();
+ grab_startup();
plugin_startup();
/* XXX load all plugins!! */
plugin_open("focus");
plugin_open("keyboard");
+ plugin_open("mouse");
/* get all the existing windows */
client_manage_all();
client_unmanage_all();
- plugin_shutdown();
+ plugin_shutdown(); /* calls all the plugins' shutdown functions */
+ grab_shutdown();
client_shutdown();
screen_shutdown();
event_shutdown();