diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-01-30 21:39:12 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-01-30 21:39:12 +0000 |
| commit | f7a0eb7624fa323a37f9fb0e306d7e1bbc745e15 (patch) | |
| tree | 65d4d080f359dff7a3a3de099f1bfc03bfe207ee /src | |
| parent | 3409b046a043d8ffabf2e9c33ea037c2e5be15e4 (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.cc | 21 | ||||
| -rw-r--r-- | src/bindings.hh | 3 | ||||
| -rw-r--r-- | src/python.cc | 15 | ||||
| -rw-r--r-- | src/python.hh | 3 |
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); |
