summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-01-02 22:58:32 +0000
committerDana Jansens <danakj@orodu.net>2003-01-02 22:58:32 +0000
commite05d5f7934ce27893f900627fbd06b1679d4c0ad (patch)
tree553ced7070d991c96016e5dca53e6068991602e4 /src
parent54da8e404b0baa8b4521ce14c8eb9a28ea64e7f9 (diff)
kill button release events
Diffstat (limited to 'src')
-rw-r--r--src/actions.cc7
-rw-r--r--src/actions.hh1
-rw-r--r--src/backgroundwidget.cc33
-rw-r--r--src/backgroundwidget.hh3
-rw-r--r--src/bindings.cc20
-rw-r--r--src/bindings.hh4
-rw-r--r--src/frame.cc45
-rw-r--r--src/openbox.cc4
-rw-r--r--src/openbox.i1
-rw-r--r--src/openbox_wrap.cc6
10 files changed, 78 insertions, 46 deletions
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<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)
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<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)
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 <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);
+ }
+ }
}
}
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},