]> Dogcows Code - chaz/openbox/commitdiff
grab the server around key ungrab/grabs to prevent losing keys
authorDana Jansens <danakj@orodu.net>
Wed, 8 Jan 2003 06:41:31 +0000 (06:41 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 8 Jan 2003 06:41:31 +0000 (06:41 +0000)
src/bindings.cc

index 6e5b147e612191eb053045c12020c7b2db8da268..108a4ef08eb322f546d74049938bdcabc347d1f6 100644 (file)
@@ -243,12 +243,15 @@ bool OBBindings::addKey(const StringVect &keylist, PyObject *callback)
     t->callbacks.push_back(callback);
     destroytree(tree);
   } else {
+    // grab the server here to make sure no key pressed go missed
+    otk::OBDisplay::grab();
     grabKeys(false);
 
     // assimilate this built tree into the main tree
     assimilate(tree); // assimilation destroys/uses the tree
 
     grabKeys(true); 
+    otk::OBDisplay::ungrab();
   }
  
   Py_INCREF(callback);
@@ -273,6 +276,8 @@ bool OBBindings::removeKey(const StringVect &keylist, PyObject *callback)
                                           t->callbacks.end(),
                                           callback);
     if (it != t->callbacks.end()) {
+      // grab the server here to make sure no key pressed go missed
+      otk::OBDisplay::grab();
       grabKeys(false);
       
       _curpos = &_keytree;
@@ -281,6 +286,8 @@ bool OBBindings::removeKey(const StringVect &keylist, PyObject *callback)
       Py_XDECREF(*it);
       
       grabKeys(true);
+      otk::OBDisplay::ungrab();
+      
       return true;
     }
   }
@@ -292,10 +299,13 @@ void OBBindings::setResetKey(const std::string &key)
 {
   Binding b(0, 0);
   if (translate(key, b)) {
+    // grab the server here to make sure no key pressed go missed
+    otk::OBDisplay::grab();
     grabKeys(false);
     _resetkey.key = b.key;
     _resetkey.modifiers = b.modifiers;
     grabKeys(true);
+    otk::OBDisplay::ungrab();
   }
 }
 
@@ -370,9 +380,12 @@ void OBBindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
       if (p->binding.key == key && p->binding.modifiers == modifiers) {
         if (p->chain) {
           _timer.start(); // start/restart the timer
+          // grab the server here to make sure no key pressed go missed
+          otk::OBDisplay::grab();
           grabKeys(false);
           _curpos = p;
           grabKeys(true);
+          otk::OBDisplay::ungrab();
         } else {
           Window win = None;
           OBClient *c = Openbox::instance->focusedClient();
@@ -394,9 +407,12 @@ void OBBindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
 void OBBindings::resetChains(OBBindings *self)
 {
   self->_timer.stop();
+  // grab the server here to make sure no key pressed go missed
+  otk::OBDisplay::grab();
   self->grabKeys(false);
   self->_curpos = &self->_keytree;
   self->grabKeys(true);
+  otk::OBDisplay::ungrab();
 }
 
 
This page took 0.0237 seconds and 4 git commands to generate.