X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbindings.cc;h=3e9358d5bd33edcc4829f2f6f6c161066e7fd90d;hb=7db3ffecc980821ada3e805e2471716896e2410a;hp=1db4886b88dc963565f56b3f609857fc40e060eb;hpb=ca3e463057ebf8a7a48a5997aedc062cdac72f3f;p=chaz%2Fopenbox diff --git a/src/bindings.cc b/src/bindings.cc index 1db4886b..3e9358d5 100644 --- a/src/bindings.cc +++ b/src/bindings.cc @@ -386,11 +386,8 @@ bool OBBindings::addButton(const std::string &but, MouseContext context, for (it = _buttons[context].begin(); it != end; ++it) if ((*it)->binding.key == b.key && (*it)->binding.modifiers == b.modifiers) { - ButtonBinding::CallbackList::iterator c_it, - c_end = (*it)->callback[action].end(); - for (c_it = (*it)->callback[action].begin(); c_it != c_end; ++c_it) - if (*c_it == callback) - return true; // already bound + if ((*it)->callback[action] == callback) + return true; // already bound break; } @@ -402,11 +399,11 @@ bool OBBindings::addButton(const std::string &but, MouseContext context, bind->binding.key = b.key; bind->binding.modifiers = b.modifiers; _buttons[context].push_back(bind); - printf("adding %d.%d to %d\n", b.key, b.modifiers, context); // XXX GRAB the new button everywhere! } else bind = *it; - bind->callback[action].push_back(callback); + Py_XDECREF(bind->callback[action]); // if it was already bound, unbind it + bind->callback[action] = callback; Py_INCREF(callback); return true; } @@ -414,46 +411,31 @@ bool OBBindings::addButton(const std::string &but, MouseContext context, void OBBindings::grabButtons(bool grab, OBClient *client) { for (int i = 0; i < NUM_MOUSE_CONTEXT; ++i) { - Window win[3] = {0, 0, 0}; // at most 2 windows + Window win; + int mode = GrabModeAsync; switch (i) { case MC_Frame: - win[0] = client->frame->window(); - break; - case MC_Titlebar: - win[0] = client->frame->titlebar(); - win[1] = client->frame->label(); + win = client->frame->window(); break; case MC_Window: - win[0] = client->frame->plate(); - break; - case MC_Handle: - win[0] = client->frame->handle(); - break; - case MC_MaximizeButton: - case MC_CloseButton: - case MC_IconifyButton: - case MC_StickyButton: - case MC_Grip: - case MC_Root: - case MC_MenuItem: + win = client->frame->plate(); + mode = GrabModeSync; // this is handled in the plate's buttonPressHandler break; default: - assert(false); // invalid mouse context + // 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) - for (Window *w = win; *w; ++w) { - if (grab) { - otk::OBDisplay::grabButton((*it)->binding.key, - (*it)->binding.modifiers, *w, false, - ButtonPressMask | ButtonMotionMask | - ButtonReleaseMask, GrabModeAsync, - GrabModeAsync, None, None, false); - } - else - otk::OBDisplay::ungrabButton((*it)->binding.key, - (*it)->binding.modifiers, *w); - } + 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); } } @@ -465,10 +447,8 @@ void OBBindings::fire(ButtonData *data) for (it = _buttons[data->context].begin(); it != end; ++it) if ((*it)->binding.key == data->button && (*it)->binding.modifiers == data->state) { - ButtonBinding::CallbackList::iterator c_it, - c_end = (*it)->callback[data->action].end(); - for (c_it = (*it)->callback[data->action].begin(); c_it != c_end; ++c_it) - python_callback(*c_it, (PyObject*)data); + if ((*it)->callback[data->action]) + python_callback((*it)->callback[data->action], (PyObject*)data); } }