summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-01-30 21:39:12 +0000
committerDana Jansens <danakj@orodu.net>2003-01-30 21:39:12 +0000
commitf7a0eb7624fa323a37f9fb0e306d7e1bbc745e15 (patch)
tree65d4d080f359dff7a3a3de099f1bfc03bfe207ee /src
parent3409b046a043d8ffabf2e9c33ea037c2e5be15e4 (diff)
grab the keyboard during move/resize to make sure the popup doesnt get left onscreen if the modifiers are released before the button
Diffstat (limited to 'src')
-rw-r--r--src/bindings.cc21
-rw-r--r--src/bindings.hh3
-rw-r--r--src/python.cc15
-rw-r--r--src/python.hh3
4 files changed, 39 insertions, 3 deletions
diff --git a/src/bindings.cc b/src/bindings.cc
index 783b6479..a3694102 100644
--- a/src/bindings.cc
+++ b/src/bindings.cc
@@ -385,9 +385,6 @@ bool Bindings::grabKeyboard(int screen, PyObject *callback)
if (XGrabKeyboard(**otk::display, root, false, GrabModeAsync,
GrabModeAsync, CurrentTime))
return false;
- // the pointer grab causes pointer events during the keyboard grab to go away
- XGrabPointer(**otk::display, root, false, 0, GrabModeAsync,
- GrabModeAsync, None, None, CurrentTime);
_keybgrab_callback = callback;
return true;
}
@@ -403,6 +400,24 @@ void Bindings::ungrabKeyboard()
}
+bool Bindings::grabPointer(int screen)
+{
+ if (!openbox->screen(screen))
+ return false; // the screen is not managed
+
+ Window root = otk::display->screenInfo(screen)->rootWindow();
+ XGrabPointer(**otk::display, root, false, 0, GrabModeAsync,
+ GrabModeAsync, None, None, CurrentTime);
+ return true;
+}
+
+
+void Bindings::ungrabPointer()
+{
+ XUngrabPointer(**otk::display, CurrentTime);
+}
+
+
void Bindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
Time time, KeyAction::KA action)
{
diff --git a/src/bindings.hh b/src/bindings.hh
index 2b2260e2..d120ffc0 100644
--- a/src/bindings.hh
+++ b/src/bindings.hh
@@ -123,6 +123,9 @@ public:
bool grabKeyboard(int screen, PyObject *callback);
void ungrabKeyboard();
+ bool grabPointer(int screen);
+ void ungrabPointer();
+
bool addButton(const std::string &but, MouseContext::MC context,
MouseAction::MA action, PyObject *callback);
diff --git a/src/python.cc b/src/python.cc
index 9feddbd8..2a9a912a 100644
--- a/src/python.cc
+++ b/src/python.cc
@@ -144,6 +144,21 @@ PyObject *kungrab()
Py_INCREF(Py_None); return Py_None;
}
+PyObject *mgrab(int screen)
+{
+ if (!ob::openbox->bindings()->grabPointer(screen)) {
+ PyErr_SetString(PyExc_RuntimeError,"Unable to grab pointer.");
+ return NULL;
+ }
+ Py_INCREF(Py_None); return Py_None;
+}
+
+PyObject *mungrab()
+{
+ ob::openbox->bindings()->ungrabPointer();
+ Py_INCREF(Py_None); return Py_None;
+}
+
PyObject *kbind(PyObject *keylist, ob::KeyContext::KC context, PyObject *func)
{
if (!PyCallable_Check(func)) {
diff --git a/src/python.hh b/src/python.hh
index 90df3e10..8b6c4ae8 100644
--- a/src/python.hh
+++ b/src/python.hh
@@ -249,6 +249,9 @@ PyObject *kbind(PyObject *keylist, ob::KeyContext::KC context, PyObject *func);
PyObject *kgrab(int screen, PyObject *func);
PyObject *kungrab();
+PyObject *mgrab(int screen);
+PyObject *mungrab();
+
PyObject *ebind(ob::EventAction::EA action, PyObject *func);
void set_reset_key(const std::string &key);