From 598c5d6c07118517b47d7c416a79dc9743271aa8 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 18 Mar 2003 19:51:56 +0000 Subject: [PATCH] provide functions for grabbing and ungrabbing the keyboard and pointer --- openbox/Makefile.am | 4 ++-- openbox/grab.c | 40 ++++++++++++++++++++++++++++++++++++++++ openbox/grab.h | 13 +++++++++++++ openbox/openbox.c | 6 +++++- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 openbox/grab.c create mode 100644 openbox/grab.h 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 +#include + +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 +#include + +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(); -- 2.39.2