From e05d5f7934ce27893f900627fbd06b1679d4c0ad Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 2 Jan 2003 22:58:32 +0000 Subject: [PATCH] kill button release events --- scripts/clientmotion.py | 33 +++++++++++++++++++++--------- src/actions.cc | 7 +------ src/actions.hh | 1 - src/backgroundwidget.cc | 33 ++++++++++++++++++++++++++++++ src/backgroundwidget.hh | 3 +++ src/bindings.cc | 20 ++++++++++-------- src/bindings.hh | 4 +++- src/frame.cc | 45 ++++++++++++++++++----------------------- src/openbox.cc | 4 ++-- src/openbox.i | 1 - src/openbox_wrap.cc | 6 ++++-- 11 files changed, 101 insertions(+), 56 deletions(-) diff --git a/scripts/clientmotion.py b/scripts/clientmotion.py index dc584893..ec1da0ab 100644 --- a/scripts/clientmotion.py +++ b/scripts/clientmotion.py @@ -20,24 +20,37 @@ def def_motion_release(data): posqueue.remove(i) break +def def_do_move(xroot, yroot, client): + global posqueue + dx = xroot - posqueue[0][1] + dy = yroot - posqueue[0][2] + area = posqueue[0][3] # A Rect + OBClient_move(client, Rect_x(area) + dx, Rect_y(area) + dy) + +def def_do_resize(xroot, yroot, client, anchor_corner): + global posqueue + dx = xroot - posqueue[0][1] + dy = yroot - posqueue[0][2] + OBClient_resize(client, anchor_corner, + Rect_width(area) - dx, Rect_height(area) + dy) + def def_motion(data): client = Openbox_findClient(openbox, data.window()) if not client: return global posqueue - dx = data.xroot() - posqueue[0][1] - dy = data.yroot() - posqueue[0][2] - - area = posqueue[0][3] # A Rect + if not posqueue[0][0] == 1: return + type = data.target() - if (type == Type_Titlebar) or (type == Type_Label): - OBClient_move(client, Rect_x(area) + dx, Rect_y(area) + dy) + if (type == Type_Titlebar) or (type == Type_Label) or \ + (type == Type_Plate) or (type == Type_Handle): + def_do_move(data.xroot(), data.yroot(), client) elif type == Type_LeftGrip: - OBClient_resize(client, OBClient_TopRight, - Rect_width(area) - dx, Rect_height(area) + dy) + def_do_resize(data.xroot(), data.yroot(), client, + OBClient_TopRight) elif type == Type_RightGrip: - OBClient_resize(client, OBClient_TopLeft, - Rect_width(area) + dx, Rect_height(area) + dy) + def_do_resize(data.xroot(), data.yroot(), client, + OBClient_TopLeft) def def_enter(data): client = Openbox_findClient(openbox, data.window()) diff --git a/src/actions.cc b/src/actions.cc index b6f1dad8..64e763d7 100644 --- a/src/actions.cc +++ b/src/actions.cc @@ -56,11 +56,6 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e) OBWidget *w = dynamic_cast (Openbox::instance->findHandler(e.window)); - // run the RELEASE python hook - doCallback(Action_ButtonRelease, e.window, - (OBWidget::WidgetType)(w ? w->type():-1), - e.state, e.button, e.x_root, e.y_root, e.time); - // not for the button we're watching? if (_button != e.button) return; @@ -163,7 +158,7 @@ void OBActions::motionHandler(const XMotionEvent &e) // run the simple MOTION python hook for now... doCallback(Action_MouseMotion, e.window, (OBWidget::WidgetType)(w ? w->type():-1), - e.state, (unsigned)-1, e.x_root, e.y_root, e.time); + e.state, (unsigned)-1, x_root, y_root, e.time); } void OBActions::mapRequestHandler(const XMapRequestEvent &e) diff --git a/src/actions.hh b/src/actions.hh index 50df838b..98325e87 100644 --- a/src/actions.hh +++ b/src/actions.hh @@ -30,7 +30,6 @@ public: // update the same enum in openbox.i when making changes to this enum ActionType { Action_ButtonPress, - Action_ButtonRelease, Action_Click, Action_DoubleClick, Action_EnterWindow, diff --git a/src/backgroundwidget.cc b/src/backgroundwidget.cc index e7f7e732..b3649435 100644 --- a/src/backgroundwidget.cc +++ b/src/backgroundwidget.cc @@ -84,4 +84,37 @@ void OBBackgroundWidget::adjust() // nothing to adjust here. its done in OBFrame::adjustSize } +void OBBackgroundWidget::grabButtons(bool grab) +{ + if (grab) { + // grab simple button clicks on the client, but pass them through too + otk::OBDisplay::grabButton(Button1, 0, _window, true, + ButtonPressMask, GrabModeSync, GrabModeSync, + _window, None, false); + otk::OBDisplay::grabButton(Button2, 0, _window, true, + ButtonPressMask, GrabModeSync, GrabModeSync, + _window, None, false); + otk::OBDisplay::grabButton(Button3, 0, _window, true, + ButtonPressMask, GrabModeSync, GrabModeSync, + _window, None, false); + otk::OBDisplay::grabButton(Button4, 0, _window, true, + ButtonPressMask, GrabModeSync, GrabModeSync, + _window, None, false); + otk::OBDisplay::grabButton(Button5, 0, _window, true, + ButtonPressMask, GrabModeSync, GrabModeSync, + _window, None, false); + } else { + otk::OBDisplay::ungrabButton(Button1, 0, _window); + otk::OBDisplay::ungrabButton(Button2, 0, _window); + otk::OBDisplay::ungrabButton(Button3, 0, _window); + otk::OBDisplay::ungrabButton(Button4, 0, _window); + otk::OBDisplay::ungrabButton(Button5, 0, _window); + } +} + +void OBBackgroundWidget::buttonPressHandler(const XButtonEvent &e) +{ + XAllowEvents(otk::OBDisplay::display, ReplayPointer, e.time); +} + } diff --git a/src/backgroundwidget.hh b/src/backgroundwidget.hh index 7b698c15..9d833b4c 100644 --- a/src/backgroundwidget.hh +++ b/src/backgroundwidget.hh @@ -22,6 +22,9 @@ public: virtual void focus(); virtual void unfocus(); + + void grabButtons(bool grab); + virtual void buttonPressHandler(const XButtonEvent &e); }; } diff --git a/src/bindings.cc b/src/bindings.cc index fade3e69..d6bf85d0 100644 --- a/src/bindings.cc +++ b/src/bindings.cc @@ -68,7 +68,7 @@ static bool modvalue(const std::string &mod, unsigned int *val) return true; } -bool OBBindings::translate(const std::string &str, Binding &b) const +bool OBBindings::translate(const std::string &str, Binding &b,bool askey) const { // parse out the base key name std::string::size_type keybegin = str.find_last_of('-'); @@ -92,14 +92,18 @@ bool OBBindings::translate(const std::string &str, Binding &b) const // set the binding b.modifiers = modval; - KeySym sym = XStringToKeysym(const_cast(key.c_str())); - if (sym == NoSymbol) { - printf(_("Invalid Key name in key binding: %s\n"), key.c_str()); - return false; + if (askey) { + KeySym sym = XStringToKeysym(const_cast(key.c_str())); + if (sym == NoSymbol) { + printf(_("Invalid Key name in key binding: %s\n"), key.c_str()); + return false; + } + if (!(b.key = XKeysymToKeycode(otk::OBDisplay::display, sym))) + printf(_("No valid keycode for Key in key binding: %s\n"), key.c_str()); + return b.key != 0; + } else { + return buttonvalue(key, &b.key); } - if (!(b.key = XKeysymToKeycode(otk::OBDisplay::display, sym))) - printf(_("No valid keycode for Key in key binding: %s\n"), key.c_str()); - return b.key != 0; } static void destroytree(BindingTree *tree) diff --git a/src/bindings.hh b/src/bindings.hh index 9d55b751..c51d46be 100644 --- a/src/bindings.hh +++ b/src/bindings.hh @@ -63,7 +63,6 @@ private: otk::OBTimer _timer; PyObject *find(BindingTree *search, bool *conflict) const; - bool translate(const std::string &str, Binding &b) const; BindingTree *buildtree(const StringVect &keylist, PyObject *callback) const; void assimilate(BindingTree *node); @@ -75,6 +74,9 @@ public: //! Destroys the OBBinding object virtual ~OBBindings(); + //! Translates a binding string into the actual Binding + bool translate(const std::string &str, Binding &b, bool askey = true) const; + //! Adds a new key binding /*! A binding will fail to be added if the binding already exists (as part of diff --git a/src/frame.cc b/src/frame.cc index 072edc70..4dee65c3 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -13,6 +13,8 @@ extern "C" { #include "openbox.hh" #include "frame.hh" #include "client.hh" +#include "python.hh" +#include "bindings.hh" #include "otk/display.hh" #include @@ -70,33 +72,26 @@ OBFrame::~OBFrame() void OBFrame::grabButtons(bool grab) { - if (grab) { - // grab simple button clicks on the client, but pass them through too - otk::OBDisplay::grabButton(Button1, 0, _plate.window(), true, - ButtonPressMask, GrabModeSync, GrabModeSync, - _plate.window(), None, false); - otk::OBDisplay::grabButton(Button2, 0, _plate.window(), true, - ButtonPressMask, GrabModeSync, GrabModeSync, - _plate.window(), None, false); - otk::OBDisplay::grabButton(Button3, 0, _plate.window(), true, - ButtonPressMask, GrabModeSync, GrabModeSync, - _plate.window(), None, false); - otk::OBDisplay::grabButton(Button4, 0, _plate.window(), true, - ButtonPressMask, GrabModeSync, GrabModeSync, - _plate.window(), None, false); - otk::OBDisplay::grabButton(Button5, 0, _plate.window(), true, - ButtonPressMask, GrabModeSync, GrabModeSync, - _plate.window(), None, false); - } else { - } + _plate.grabButtons(grab); // grab any requested buttons on the entire frame - if (grab) { - - otk::OBDisplay::grabButton(Button1, 0, _plate.window(), true, - ButtonPressMask, GrabModeSync, GrabModeSync, - _plate.window(), None, false); - } else { + std::vector grabs; + if (python_get_stringlist("client_buttons", &grabs)) { + std::vector::iterator grab_it, grab_end = grabs.end(); + for (grab_it = grabs.begin(); grab_it != grab_end; ++grab_it) { + Binding b(0,0); + if (!Openbox::instance->bindings()->translate(*grab_it, b, false)) + continue; + printf("grabbing %d %d\n", b.key, b.modifiers); + if (grab) { + otk::OBDisplay::grabButton(b.key, b.modifiers, _window, true, + ButtonPressMask | ButtonMotionMask | + ButtonReleaseMask, GrabModeAsync, + GrabModeAsync, _window, None, false); + } else { + otk::OBDisplay::ungrabButton(b.key, b.modifiers, _window); + } + } } } diff --git a/src/openbox.cc b/src/openbox.cc index 436c09fa..437e5ead 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -134,8 +134,8 @@ Openbox::Openbox(int argc, char **argv) // load config values python_exec(SCRIPTDIR"/config.py"); // load openbox config values // run all of the python scripts - python_exec(SCRIPTDIR"/clientmotion.py"); // moving and resizing clients - python_exec(SCRIPTDIR"/clicks.py"); // titlebar/root clicks and dblclicks +// python_exec(SCRIPTDIR"/clientmotion.py"); // moving and resizing clients +// python_exec(SCRIPTDIR"/clicks.py"); // titlebar/root clicks and dblclicks // run the user's script python_exec(_scriptfilepath.c_str()); diff --git a/src/openbox.i b/src/openbox.i index c8236445..b88175d9 100644 --- a/src/openbox.i +++ b/src/openbox.i @@ -28,7 +28,6 @@ %inline %{ enum ActionType { Action_ButtonPress, - Action_ButtonRelease, Action_Click, Action_DoubleClick, Action_EnterWindow, diff --git a/src/openbox_wrap.cc b/src/openbox_wrap.cc index 146bb2a7..f4db077c 100644 --- a/src/openbox_wrap.cc +++ b/src/openbox_wrap.cc @@ -780,7 +780,6 @@ static std::string SwigString_AsString(PyObject* o) { enum ActionType { Action_ButtonPress, - Action_ButtonRelease, Action_Click, Action_DoubleClick, Action_EnterWindow, @@ -850,6 +849,10 @@ PyObject * unregister_all(int action) PyObject * bind(PyObject *keylist, PyObject *func) { + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, "Invalid callback function."); + return NULL; + } if (!PyList_Check(keylist)) { PyErr_SetString(PyExc_TypeError, "Invalid keylist. Not a list."); return NULL; @@ -2913,7 +2916,6 @@ _swigt__p_XUnmapEvent, static swig_const_info swig_const_table[] = { { SWIG_PY_INT, (char *)"Action_ButtonPress", (long) Action_ButtonPress, 0, 0, 0}, -{ SWIG_PY_INT, (char *)"Action_ButtonRelease", (long) Action_ButtonRelease, 0, 0, 0}, { SWIG_PY_INT, (char *)"Action_Click", (long) Action_Click, 0, 0, 0}, { SWIG_PY_INT, (char *)"Action_DoubleClick", (long) Action_DoubleClick, 0, 0, 0}, { SWIG_PY_INT, (char *)"Action_EnterWindow", (long) Action_EnterWindow, 0, 0, 0}, -- 2.39.2