]> Dogcows Code - chaz/openbox/blobdiff - src/bindings.cc
handle maprequests after mapped correctly. thus making gaim happy again
[chaz/openbox] / src / bindings.cc
index 2b81381c080925b48d15457531b150df9720a2d8..6a135b6d6821a94c4e2b812741529371af171730 100644 (file)
@@ -146,7 +146,10 @@ OBBindings::OBBindings()
 {
   _timer.setTimeout(5000); // chains reset after 5 seconds
   
-  setResetKey("C-g"); // set the default reset key
+//  setResetKey("C-g"); // set the default reset key
+
+  for (int i = 0; i < NUM_EVENTS; ++i)
+    _events[i] = 0;
 }
 
 
@@ -155,6 +158,7 @@ OBBindings::~OBBindings()
   grabKeys(false);
   removeAllKeys();
   removeAllButtons();
+  removeAllEvents();
 }
 
 
@@ -325,13 +329,14 @@ void OBBindings::grabKeys(bool grab)
       p = p->next_sibling;
     }
 
-    if (grab)
-      otk::OBDisplay::grabKey(_resetkey.key, _resetkey.modifiers,
-                              root, true, GrabModeAsync, GrabModeAsync,
-                              false);
-    else
-      otk::OBDisplay::ungrabKey(_resetkey.key, _resetkey.modifiers,
-                                root);
+    if (_resetkey.key)
+      if (grab)
+        otk::OBDisplay::grabKey(_resetkey.key, _resetkey.modifiers,
+                                root, false, GrabModeAsync, GrabModeAsync,
+                                false);
+      else
+        otk::OBDisplay::ungrabKey(_resetkey.key, _resetkey.modifiers,
+                                  root);
   }
 }
 
@@ -405,7 +410,7 @@ bool OBBindings::addButton(const std::string &but, MouseContext context,
     // grab the button on all clients
     for (int sn = 0; sn < Openbox::instance->screenCount(); ++sn) {
       OBScreen *s = Openbox::instance->screen(sn);
-      OBScreen::ClientList::iterator c_it, c_end = s->clients.end();
+      OBClient::List::iterator c_it, c_end = s->clients.end();
       for (c_it = s->clients.begin(); c_it != c_end; ++c_it) {
         grabButton(true, bind->binding, context, *c_it);
       }
@@ -430,7 +435,7 @@ void OBBindings::removeAllButtons()
       // ungrab the button on all clients
       for (int sn = 0; sn < Openbox::instance->screenCount(); ++sn) {
         OBScreen *s = Openbox::instance->screen(sn);
-        OBScreen::ClientList::iterator c_it, c_end = s->clients.end();
+        OBClient::List::iterator c_it, c_end = s->clients.end();
         for (c_it = s->clients.begin(); c_it != c_end; ++c_it) {
           grabButton(false, (*it)->binding, (MouseContext)i, *c_it);
         }
@@ -476,8 +481,6 @@ void OBBindings::grabButtons(bool grab, OBClient *client)
 
 void OBBindings::fireButton(ButtonData *data)
 {
-  printf("but.mods %d.%d\n", data->button, data->state);
-  
   if (data->context == MC_Window) {
     // these are grabbed in Sync mode to allow the press to be normal to the
     // client
@@ -493,4 +496,42 @@ void OBBindings::fireButton(ButtonData *data)
     }
 }
 
+
+bool OBBindings::addEvent(EventAction action, PyObject *callback)
+{
+  if (action < 0 || action >= NUM_EVENTS) {
+    return false;
+  }
+
+  Py_XDECREF(_events[action]);
+  _events[action] = callback;
+  Py_INCREF(callback);
+  return true;
+}
+
+bool OBBindings::removeEvent(EventAction action)
+{
+  if (action < 0 || action >= NUM_EVENTS) {
+    return false;
+  }
+  
+  Py_XDECREF(_events[action]);
+  _events[action] = 0;
+  return true;
+}
+
+void OBBindings::removeAllEvents()
+{
+  for (int i = 0; i < NUM_EVENTS; ++i) {
+    Py_XDECREF(_events[i]);
+    _events[i] = 0;
+  }
+}
+
+void OBBindings::fireEvent(EventData *data)
+{
+  if (_events[data->action])
+    python_callback(_events[data->action], (PyObject*)data);
+}
+
 }
This page took 0.024375 seconds and 4 git commands to generate.