summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-03-18 19:51:56 +0000
committerDana Jansens <danakj@orodu.net>2003-03-18 19:51:56 +0000
commit598c5d6c07118517b47d7c416a79dc9743271aa8 (patch)
tree66e56ab23f40c9bbf894c337bec7b8bd8a0950d7 /openbox
parent3dfe9f4ebeb7abd8446c52db0232b9f610a78846 (diff)
provide functions for grabbing and ungrabbing the keyboard and pointer
Diffstat (limited to 'openbox')
-rw-r--r--openbox/Makefile.am4
-rw-r--r--openbox/grab.c40
-rw-r--r--openbox/grab.h13
-rw-r--r--openbox/openbox.c6
4 files changed, 60 insertions, 3 deletions
diff --git a/openbox/Makefile.am b/openbox/Makefile.am
index 0958c83b..82775855 100644
--- a/openbox/Makefile.am
+++ b/openbox/Makefile.am
@@ -20,11 +20,11 @@ ob3_LDADD=@LIBINTL@ ../render/librender.a
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
diff --git a/openbox/grab.c b/openbox/grab.c
new file mode 100644
index 00000000..3bba14b3
--- /dev/null
+++ b/openbox/grab.c
@@ -0,0 +1,40 @@
+#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);
+}
diff --git a/openbox/grab.h b/openbox/grab.h
new file mode 100644
index 00000000..49c6a436
--- /dev/null
+++ b/openbox/grab.h
@@ -0,0 +1,13 @@
+#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
diff --git a/openbox/openbox.c b/openbox/openbox.c
index bf8913bc..fd4973da 100644
--- a/openbox/openbox.c
+++ b/openbox/openbox.c
@@ -8,6 +8,7 @@
#include "focus.h"
#include "extensions.h"
#include "gettext.h"
+#include "grab.h"
#include "engine.h"
#include "themerc.h"
#include "plugin.h"
@@ -137,11 +138,13 @@ int main(int argc, char **argv)
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();
@@ -154,7 +157,8 @@ int main(int argc, char **argv)
client_unmanage_all();
- plugin_shutdown();
+ plugin_shutdown(); /* calls all the plugins' shutdown functions */
+ grab_shutdown();
client_shutdown();
screen_shutdown();
event_shutdown();