X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fbindings.cc;h=6a135b6d6821a94c4e2b812741529371af171730;hb=cc39863363f6c424a1d5f3790ef182b52b69a53e;hp=2b81381c080925b48d15457531b150df9720a2d8;hpb=f8ea576460470ecc2e395cf43e31a67752adbbb5;p=chaz%2Fopenbox diff --git a/src/bindings.cc b/src/bindings.cc index 2b81381c..6a135b6d 100644 --- a/src/bindings.cc +++ b/src/bindings.cc @@ -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); +} + }