]> Dogcows Code - chaz/openbox/commitdiff
kill button release events
authorDana Jansens <danakj@orodu.net>
Thu, 2 Jan 2003 22:58:32 +0000 (22:58 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 2 Jan 2003 22:58:32 +0000 (22:58 +0000)
scripts/clientmotion.py
src/actions.cc
src/actions.hh
src/backgroundwidget.cc
src/backgroundwidget.hh
src/bindings.cc
src/bindings.hh
src/frame.cc
src/openbox.cc
src/openbox.i
src/openbox_wrap.cc

index dc58489366d3e8d5243e062ca251ebd246702dfe..ec1da0abb34ec880b0e0c13044a49750ff4475ae 100644 (file)
@@ -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())
index b6f1dad8a1026c4ff00b75b72ef54acd5bdfcf92..64e763d76c2838699fa7d80796a4c55dcc96c76e 100644 (file)
@@ -56,11 +56,6 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
   OBWidget *w = dynamic_cast<OBWidget*>
     (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)
index 50df838b22dd3eada79ba6f8f416b0d2b333a904..98325e874e93d0560650949eddee96df9eb5974c 100644 (file)
@@ -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,
index e7f7e732086f185843b4215528cae5a8322af46f..b3649435c6a632ea5dce68d5d952d1da42dd130d 100644 (file)
@@ -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);
+}
+
 }
index 7b698c1594ae529b88148a41b006efa20f15d4fc..9d833b4c2f1e5de8a5d0cde2d0dd2d7215a5baae 100644 (file)
@@ -22,6 +22,9 @@ public:
 
   virtual void focus();
   virtual void unfocus();
+
+  void grabButtons(bool grab);
+  virtual void buttonPressHandler(const XButtonEvent &e);
 };
 
 }
index fade3e6957db76ff8e7e72584b70f0cc730d4998..d6bf85d0bbf49a6f3bea5214abc2fb802fa148b8 100644 (file)
@@ -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<char *>(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<char *>(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)
index 9d55b7512c2b58ce4ea539ed88565988eb9c7971..c51d46be1d9e2c6eba417e8fb9a2a3057fab8f21 100644 (file)
@@ -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
index 072edc70bf695aff52b9335186257ab807162922..4dee65c3b19a761902983b22645012c383bc560f 100644 (file)
@@ -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 <string>
@@ -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<std::string> grabs;
+  if (python_get_stringlist("client_buttons", &grabs)) {
+    std::vector<std::string>::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);
+      }
+    }
   }
 }
 
index 436c09fadb6ec9c6eb5bfd3976b812bc790adebe..437e5ead23c0b94f3e561cb507737946e4a116db 100644 (file)
@@ -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());
 
index c82364452807907df62ef345bea326bde8cce96c..b88175d90e6565d7f984aa9d080e95fa8988ce25 100644 (file)
@@ -28,7 +28,6 @@
 %inline %{
   enum ActionType {
     Action_ButtonPress,
-    Action_ButtonRelease,
     Action_Click,
     Action_DoubleClick,
     Action_EnterWindow,
index 146bb2a759f3ecc881e63d63991f3599cb431b1a..f4db077c2120ba4d8c4d88f3804c26aeb4cb8b91 100644 (file)
@@ -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},
This page took 0.035697 seconds and 4 git commands to generate.