]> Dogcows Code - chaz/openbox/commitdiff
grab the keyboard during move/resize to make sure the popup doesnt get left onscreen...
authorDana Jansens <danakj@orodu.net>
Thu, 30 Jan 2003 21:39:12 +0000 (21:39 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 30 Jan 2003 21:39:12 +0000 (21:39 +0000)
scripts/focus.py
scripts/motion.py
src/bindings.cc
src/bindings.hh
src/python.cc
src/python.hh

index adba37258fb89ed93a885e010b9165c9abad065e..00e53cbc33665144828bee2a9071484ef28f5654 100644 (file)
@@ -136,7 +136,8 @@ def _focus_stacked_ungrab(data):
         # have all the modifiers this started with been released?
         if not _cyc_mask & data.state:
             _destroy_popup_list()
-            ob.kungrab() # ungrab ourself
+            ob.kungrab()
+            ob.mungrab()
             _doing_stacked = 0;
             if cycle_raise:
                 client = ob.openbox.findClient(_cyc_w)
@@ -246,6 +247,10 @@ def focus_next_stacked(data, forward=1):
             _create_popup_list(data)
 
         ob.kgrab(data.screen, _focus_stacked_ungrab)
+        # the pointer grab causes pointer events during the keyboard grab to
+        # go away, which means we don't get enter notifies when the popup
+        # disappears, screwing up the focus
+        ob.mgrab(data.screen)
         focus_next_stacked(data, forward) # start with the first press
 
 def focus_prev_stacked(data):
index 69ae99b423a67032b09a63a2ab135751c213d197..e8aa1f3e97143d3d993d7e784f9a0f4701d38806 100644 (file)
@@ -37,7 +37,8 @@ _popwidget = 0
 _poplabel = 0
 
 # motion state
-_inmotion = 0
+_inmove = 0
+_inresize = 0
 
 # last motion data
 _cx = 0
@@ -51,6 +52,21 @@ _dy = 0
 _client = 0
 _screen = 0
 
+_motion_mask = 0
+
+def _motion_grab(data):
+    global _motion_mask, _inmove, _inresize;
+
+    if data.action == ob.KeyAction.Release:
+        # have all the modifiers this started with been released?
+        if not _motion_mask & data.state:
+            if _inmove:
+                end_move(data)
+            elif _inresize:
+                end_resize(data)
+            else:
+                raise RuntimeError
+
 def _do_move():
     global _screen, _client, _cx, _cy, _dx, _dy
 
@@ -105,20 +121,26 @@ def move(data):
     _dx = data.xroot - data.pressx
     _dy = data.yroot - data.pressy
     _do_move()
-    _inmotion = 1
+    global _inmove
+    if not _inmove:
+        ob.kgrab(_screen, _motion_grab)
+        print "GRAB"
+        _inmove = 1
 
 def end_move(data):
     """Complete the interactive move of a window."""
-    global move_rubberband, _inmotion
+    global move_rubberband, _inmove
     global _popwidget, _poplabel
-    if _inmotion:
+    if _inmove:
         r = move_rubberband
         move_rubberband = 0
         _do_move()
         move_rubberband = r
-        _inmotion = 0
+        _inmove = 0
     _poplabel = 0
     _popwidget = 0
+    print "UNGRAB"
+    ob.kungrab()
 
 def _do_resize():
     global _screen, _client, _cx, _cy, _cw, _ch, _px, _py, _dx, _dy
@@ -196,17 +218,21 @@ def resize(data):
     _dx = data.xroot - _px
     _dy = data.yroot - _py
     _do_resize()
-    _inmotion = 1
+    global _inresize
+    if not _inresize:
+        ob.kgrab(_screen, _motion_grab)
+        _inresize = 1
 
 def end_resize(data):
     """Complete the interactive resize of a window."""
-    global resize_rubberband, _inmotion
+    global resize_rubberband, _inresize
     global _popwidget, _poplabel
-    if _inmotion:
+    if _inresize:
         r = resize_rubberband
         resize_rubberband = 0
         _do_resize()
         resize_rubberband = r
-        _inmotion = 0
+        _inresize = 0
     _poplabel = 0
     _popwidget = 0
+    ob.kungrab()
index 783b6479c2b2d03cdea56828dc80f423346c2405..a369410294786d003772097aeb910c94baa8b504 100644 (file)
@@ -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)
 {
index 2b2260e26aeeb40602a169e73a0caa110dbcc3d7..d120ffc0110f4797e86ff1bb0a429f65643c2ea0 100644 (file)
@@ -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);
 
index 9feddbd8fb9b97ebcb4684fd7fea24917aac1d36..2a9a912a2b583bd457b9000bd99078a528bb92a6 100644 (file)
@@ -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)) {
index 90df3e10c34118e1b2a4c44db9f61cbcedaa47e8..8b6c4ae88e3d7031874d45c66124227055891b36 100644 (file)
@@ -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);
This page took 0.033403 seconds and 4 git commands to generate.