From f8ea576460470ecc2e395cf43e31a67752adbbb5 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 3 Jan 2003 19:36:41 +0000 Subject: rm the old bb src --- src/bindings.cc | 73 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 27 deletions(-) (limited to 'src/bindings.cc') diff --git a/src/bindings.cc b/src/bindings.cc index 007b0334..2b81381c 100644 --- a/src/bindings.cc +++ b/src/bindings.cc @@ -142,7 +142,7 @@ OBBindings::OBBindings() : _curpos(&_keytree), _resetkey(0,0), _timer(Openbox::instance->timerManager(), - (otk::OBTimeoutHandler)reset, this) + (otk::OBTimeoutHandler)resetChains, this) { _timer.setTimeout(5000); // chains reset after 5 seconds @@ -402,7 +402,14 @@ bool OBBindings::addButton(const std::string &but, MouseContext context, bind->binding.key = b.key; bind->binding.modifiers = b.modifiers; _buttons[context].push_back(bind); - // XXX GRAB the new button everywhere! + // 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(); + for (c_it = s->clients.begin(); c_it != c_end; ++c_it) { + grabButton(true, bind->binding, context, *c_it); + } + } } else bind = *it; Py_XDECREF(bind->callback[action]); // if it was already bound, unbind it @@ -413,45 +420,57 @@ bool OBBindings::addButton(const std::string &but, MouseContext context, void OBBindings::removeAllButtons() { - // XXX: UNGRAB shits for (int i = i; i < NUM_MOUSE_CONTEXT; ++i) { ButtonBindingList::iterator it, end = _buttons[i].end(); - for (it = _buttons[i].begin(); it != end; ++it) + for (it = _buttons[i].begin(); it != end; ++it) { for (int a = 0; a < NUM_MOUSE_ACTION; ++a) { Py_XDECREF((*it)->callback[a]); (*it)->callback[a] = 0; } + // 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(); + for (c_it = s->clients.begin(); c_it != c_end; ++c_it) { + grabButton(false, (*it)->binding, (MouseContext)i, *c_it); + } + } + } + } +} + +void OBBindings::grabButton(bool grab, const Binding &b, MouseContext context, + OBClient *client) +{ + Window win; + int mode = GrabModeAsync; + switch(context) { + case MC_Frame: + win = client->frame->window(); + break; + case MC_Window: + win = client->frame->plate(); + mode = GrabModeSync; // this is handled in fireButton + break; + default: + // any other elements already get button events, don't grab on them + return; } + if (grab) + otk::OBDisplay::grabButton(b.key, b.modifiers, win, false, + ButtonPressMask | ButtonMotionMask | + ButtonReleaseMask, mode, GrabModeAsync, + None, None, false); + else + otk::OBDisplay::ungrabButton(b.key, b.modifiers, win); } void OBBindings::grabButtons(bool grab, OBClient *client) { for (int i = 0; i < NUM_MOUSE_CONTEXT; ++i) { - Window win; - int mode = GrabModeAsync; - switch (i) { - case MC_Frame: - win = client->frame->window(); - break; - case MC_Window: - win = client->frame->plate(); - mode = GrabModeSync; // this is handled in fireButton - break; - default: - // any other elements already get button events, don't grab on them - continue; - } ButtonBindingList::iterator it, end = _buttons[i].end(); for (it = _buttons[i].begin(); it != end; ++it) - if (grab) - otk::OBDisplay::grabButton((*it)->binding.key, - (*it)->binding.modifiers, win, false, - ButtonPressMask | ButtonMotionMask | - ButtonReleaseMask, mode, GrabModeAsync, - None, None, false); - else - otk::OBDisplay::ungrabButton((*it)->binding.key, - (*it)->binding.modifiers, win); + grabButton(grab, (*it)->binding, (MouseContext)i, client); } } -- cgit v1.2.3