summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-01-03 05:26:04 +0000
committerDana Jansens <danakj@orodu.net>2003-01-03 05:26:04 +0000
commitca3e463057ebf8a7a48a5997aedc062cdac72f3f (patch)
tree38c809333c9e11626d87bbd78a08cbe05169d43b /src
parentb35dae95a5cdb902f1661b9572af47c3f55c975c (diff)
moving a window is possible once again
Diffstat (limited to 'src')
-rw-r--r--src/actions.cc82
-rw-r--r--src/actions.hh3
-rw-r--r--src/bindings.cc78
-rw-r--r--src/bindings.hh4
-rw-r--r--src/openbox_wrap.cc1
-rw-r--r--src/python.cc305
-rw-r--r--src/python.hh61
-rw-r--r--src/widget.hh35
8 files changed, 323 insertions, 246 deletions
diff --git a/src/actions.cc b/src/actions.cc
index c04457da..27f4ccae 100644
--- a/src/actions.cc
+++ b/src/actions.cc
@@ -45,6 +45,7 @@ void OBActions::insertPress(const XButtonEvent &e)
OBClient *c = Openbox::instance->findClient(e.window);
if (c) a->clientarea = c->area();
+ printf("press %d x:%d y:%d winx:%d winy:%d\n", e.button, e.x_root, e.y_root, c->area().x(), c->area().y());
}
void OBActions::removePress(const XButtonEvent &e)
@@ -70,16 +71,14 @@ void OBActions::buttonPressHandler(const XButtonEvent &e)
// run the PRESS python hook
OBWidget *w = dynamic_cast<OBWidget*>
(Openbox::instance->findHandler(e.window));
-
-/* doCallback(Action_ButtonPress, e.window,
- (OBWidget::WidgetType)(w ? w->type():-1),
- e.state, e.button, e.x_root, e.y_root, e.time);*/
- if (w) {
- Openbox::instance->bindings()->fire(MousePress, w->type(), e.window,
- e.state, e.button,
- e.x_root, e.y_root, e.time);
- } else
- assert(false); // why isnt there a type?
+ assert(w); // everything should be a widget
+
+ unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
+ Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
+ ButtonData *data = new_button_data(e.window, e.time, state, e.button,
+ w->mcontext(), MousePress);
+ Openbox::instance->bindings()->fire(data);
+ Py_DECREF((PyObject*)data);
if (_button) return; // won't count toward CLICK events
@@ -94,6 +93,7 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
OBWidget *w = dynamic_cast<OBWidget*>
(Openbox::instance->findHandler(e.window));
+ assert(w); // everything should be a widget
// not for the button we're watching?
if (_button != e.button) return;
@@ -110,29 +110,19 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
return;
// run the CLICK python hook
-/* doCallback(Action_Click, e.window,
- (OBWidget::WidgetType)(w ? w->type():-1),
- e.state, e.button, e.x_root, e.y_root, e.time);*/
- if (w) {
- Openbox::instance->bindings()->fire(MouseClick, w->type(), e.window,
- e.state, e.button,
- e.x_root, e.y_root, e.time);
- } else
- assert(false); // why isnt there a type?
+ unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
+ Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
+ ButtonData *data = new_button_data(e.window, e.time, state, e.button,
+ w->mcontext(), MouseClick);
+ Openbox::instance->bindings()->fire(data);
+
if (e.time - _release.time < DOUBLECLICKDELAY &&
_release.win == e.window && _release.button == e.button) {
// run the DOUBLECLICK python hook
-/* doCallback(Action_DoubleClick, e.window,
- (OBWidget::WidgetType)(w ? w->type():-1),
- e.state, e.button, e.x_root, e.y_root, e.time);*/
- if (w) {
- Openbox::instance->bindings()->fire(MouseDoubleClick, w->type(),
- e.window, e.state, e.button,
- e.x_root, e.y_root, e.time);
- } else
- assert(false); // why isnt there a type?
+ data->action = MouseDoubleClick;
+ Openbox::instance->bindings()->fire(data);
// reset so you cant triple click for 2 doubleclicks
_release.win = 0;
@@ -144,6 +134,8 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
_release.button = e.button;
_release.time = e.time;
}
+
+ Py_DECREF((PyObject*)data);
}
@@ -178,7 +170,9 @@ void OBActions::keyPressHandler(const XKeyEvent &e)
// OBWidget *w = dynamic_cast<OBWidget*>
// (Openbox::instance->findHandler(e.window));
- Openbox::instance->bindings()->fire(e.state, e.keycode, e.time);
+ unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
+ Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
+ Openbox::instance->bindings()->fire(state, e.keycode, e.time);
}
@@ -200,24 +194,22 @@ void OBActions::motionHandler(const XMotionEvent &e)
}
}
- _dx = x_root - _posqueue[0]->pos.x(); _posqueue[0]->pos.setX(x_root);
- _dy = y_root - _posqueue[0]->pos.y(); _posqueue[0]->pos.setY(y_root);
-
OBWidget *w = dynamic_cast<OBWidget*>
(Openbox::instance->findHandler(e.window));
-
- // XXX: i can envision all sorts of crazy shit with this.. gestures, etc
- // maybe that should all be done via python tho.. (or radial menus!)
- // run the simple MOTION python hook for now...
-/* doCallback(Action_MouseMotion, e.window,
- (OBWidget::WidgetType)(w ? w->type():-1),
- e.state, (unsigned)-1, x_root, y_root, e.time);*/
- if (w) {
- Openbox::instance->bindings()->fire(MouseMotion, w->type(), e.window,
- e.state, _posqueue[0]->button,
- _dx, _dy, e.time);
- } else
- assert(false); // why isnt there a type?
+ assert(w); // everything should be a widget
+
+ // run the MOTION python hook
+ unsigned int state = e.state & (ControlMask | ShiftMask | Mod1Mask |
+ Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask);
+ unsigned int button = _posqueue[0]->button;
+ printf("motion %d x:%d y:%d winx:%d winy:%d\n", button, x_root, y_root,
+ _posqueue[0]->clientarea.x(), _posqueue[0]->clientarea.y());
+ MotionData *data = new_motion_data(e.window, e.time, state, button,
+ w->mcontext(), MouseMotion,
+ x_root, y_root, _posqueue[0]->pos,
+ _posqueue[0]->clientarea);
+ Openbox::instance->bindings()->fire((ButtonData*)data);
+ Py_DECREF((PyObject*)data);
}
void OBActions::mapRequestHandler(const XMapRequestEvent &e)
diff --git a/src/actions.hh b/src/actions.hh
index 4a658061..2b68153a 100644
--- a/src/actions.hh
+++ b/src/actions.hh
@@ -64,8 +64,6 @@ private:
Used for motion events as the starting position.
*/
ButtonPressAction *_posqueue[BUTTONS];
- //! The delta x/y of the last motion sequence
- int _dx, _dy;
void insertPress(const XButtonEvent &e);
@@ -99,7 +97,6 @@ public:
virtual void unmapHandler(const XUnmapEvent &e);
virtual void destroyHandler(const XDestroyWindowEvent &e);
-
//! Add a callback funtion to the back of the hook list
/*!
Registering functions for KeyPress events is pointless. Use
diff --git a/src/bindings.cc b/src/bindings.cc
index ba92b4c9..1db4886b 100644
--- a/src/bindings.cc
+++ b/src/bindings.cc
@@ -350,7 +350,9 @@ void OBBindings::fire(unsigned int modifiers, unsigned int key, Time time)
Window win = None;
OBClient *c = Openbox::instance->focusedClient();
if (c) win = c->window();
- python_callback(p->callback, win, modifiers, key, time);
+ KeyData *data = new_key_data(win, time, modifiers, key);
+ python_callback(p->callback, (PyObject*)data);
+ Py_DECREF((PyObject*)data);
reset(this);
}
break;
@@ -424,25 +426,15 @@ void OBBindings::grabButtons(bool grab, OBClient *client)
case MC_Window:
win[0] = client->frame->plate();
break;
- case MC_MaximizeButton:
-// win[0] = client->frame->button_max();
+ case MC_Handle:
+ win[0] = client->frame->handle();
break;
+ case MC_MaximizeButton:
case MC_CloseButton:
-// win[0] = client->frame->button_close();
- break;
case MC_IconifyButton:
-// win[0] = client->frame->button_iconify();
- break;
case MC_StickyButton:
-// win[0] = client->frame->button_stick();
- break;
case MC_Grip:
-// win[0] = client->frame->grip_left();
-// win[1] = client->frame->grip_right();
- break;
case MC_Root:
-// win[0] = otk::OBDisplay::screenInfo(client->screen())->rootWindow();
- break;
case MC_MenuItem:
break;
default:
@@ -465,58 +457,18 @@ void OBBindings::grabButtons(bool grab, OBClient *client)
}
}
-void OBBindings::fire(MouseAction action, OBWidget::WidgetType type,
- Window win, unsigned int modifiers, unsigned int button,
- int xroot, int yroot, Time time)
+void OBBindings::fire(ButtonData *data)
{
- assert(action >= 0 && action < NUM_MOUSE_ACTION);
-
- MouseContext context;
- switch (type) {
- case OBWidget::Type_Frame:
- context = MC_Frame; break;
- case OBWidget::Type_Titlebar:
- context = MC_Titlebar; break;
- case OBWidget::Type_Handle:
- context = MC_Frame; break;
- case OBWidget::Type_Plate:
- context = MC_Window; break;
- case OBWidget::Type_Label:
- context = MC_Titlebar; break;
- case OBWidget::Type_MaximizeButton:
- context = MC_MaximizeButton; break;
- case OBWidget::Type_CloseButton:
- context = MC_CloseButton; break;
- case OBWidget::Type_IconifyButton:
- context = MC_IconifyButton; break;
- case OBWidget::Type_StickyButton:
- context = MC_StickyButton; break;
- case OBWidget::Type_LeftGrip:
- context = MC_Grip; break;
- case OBWidget::Type_RightGrip:
- context = MC_Grip; break;
- case OBWidget::Type_Client:
- context = MC_Window; break;
- case OBWidget::Type_Root:
- context = MC_Root; break;
- default:
- assert(false); // unhandled type
- }
-
- modifiers &= (ControlMask | ShiftMask | Mod1Mask | Mod2Mask | Mod3Mask |
- Mod4Mask | Mod5Mask);
-
- printf("but.mods %d.%d\n", button, modifiers);
+ printf("but.mods %d.%d\n", data->button, data->state);
- ButtonBindingList::iterator it, end = _buttons[context].end();
- for (it = _buttons[context].begin(); it != end; ++it)
- if ((*it)->binding.key == button &&
- (*it)->binding.modifiers == modifiers) {
+ ButtonBindingList::iterator it, end = _buttons[data->context].end();
+ 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[action].end();
- for (c_it = (*it)->callback[action].begin(); c_it != c_end; ++c_it)
- python_callback(*c_it, action, win, context, modifiers,
- button, xroot, yroot, time);
+ 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);
}
}
diff --git a/src/bindings.hh b/src/bindings.hh
index 51e2b213..5d1df29b 100644
--- a/src/bindings.hh
+++ b/src/bindings.hh
@@ -120,9 +120,7 @@ public:
void grabButtons(bool grab, OBClient *client);
- void fire(MouseAction action, OBWidget::WidgetType type, Window win,
- unsigned int modifiers, unsigned int button,
- int xroot, int yroot, Time time);
+ void fire(ButtonData *data);
};
}
diff --git a/src/openbox_wrap.cc b/src/openbox_wrap.cc
index 00dbdf71..90cd3a97 100644
--- a/src/openbox_wrap.cc
+++ b/src/openbox_wrap.cc
@@ -2805,6 +2805,7 @@ static swig_const_info swig_const_table[] = {
{ SWIG_PY_INT, (char *)"OBClient_no_propagate_mask", (long) ob::OBClient::no_propagate_mask, 0, 0, 0},
{ SWIG_PY_INT, (char *)"MC_Frame", (long) ob::MC_Frame, 0, 0, 0},
{ SWIG_PY_INT, (char *)"MC_Titlebar", (long) ob::MC_Titlebar, 0, 0, 0},
+{ SWIG_PY_INT, (char *)"MC_Handle", (long) ob::MC_Handle, 0, 0, 0},
{ SWIG_PY_INT, (char *)"MC_Window", (long) ob::MC_Window, 0, 0, 0},
{ SWIG_PY_INT, (char *)"MC_MaximizeButton", (long) ob::MC_MaximizeButton, 0, 0, 0},
{ SWIG_PY_INT, (char *)"MC_CloseButton", (long) ob::MC_CloseButton, 0, 0, 0},
diff --git a/src/python.cc b/src/python.cc
index edadbc25..7ff12452 100644
--- a/src/python.cc
+++ b/src/python.cc
@@ -22,61 +22,36 @@ static PyObject *obdict = NULL;
// Define some custom types which are passed to python callbacks //
// ************************************************************* //
-typedef struct {
- PyObject_HEAD;
- MouseAction action;
- Window window;
- MouseContext context;
- unsigned int state;
- unsigned int button;
- int xroot;
- int yroot;
- Time time;
-} ActionData;
-
-typedef struct {
- PyObject_HEAD;
- Window window;
- unsigned int state;
- unsigned int key;
- Time time;
-} BindingData;
-
-static void ActionDataDealloc(ActionData *self)
-{
- PyObject_Del((PyObject*)self);
-}
-
-static void BindingDataDealloc(BindingData *self)
+static void dealloc(PyObject *self)
{
- PyObject_Del((PyObject*)self);
+ PyObject_Del(self);
}
-PyObject *ActionData_action(ActionData *self, PyObject *args)
-{
- if(!PyArg_ParseTuple(args,":action")) return NULL;
- return PyLong_FromLong((int)self->action);
-}
-
-PyObject *ActionData_window(ActionData *self, PyObject *args)
+PyObject *MotionData_window(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":window")) return NULL;
return PyLong_FromLong(self->window);
}
-PyObject *ActionData_context(ActionData *self, PyObject *args)
+PyObject *MotionData_context(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":context")) return NULL;
return PyLong_FromLong((int)self->context);
}
-PyObject *ActionData_modifiers(ActionData *self, PyObject *args)
+PyObject *MotionData_action(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":action")) return NULL;
+ return PyLong_FromLong((int)self->action);
+}
+
+PyObject *MotionData_modifiers(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":modifiers")) return NULL;
return PyLong_FromUnsignedLong(self->state);
}
-PyObject *ActionData_button(ActionData *self, PyObject *args)
+PyObject *MotionData_button(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":button")) return NULL;
int b = 0;
@@ -91,57 +66,112 @@ PyObject *ActionData_button(ActionData *self, PyObject *args)
return PyLong_FromLong(b);
}
-PyObject *ActionData_xroot(ActionData *self, PyObject *args)
+PyObject *MotionData_xroot(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":xroot")) return NULL;
return PyLong_FromLong(self->xroot);
}
-PyObject *ActionData_yroot(ActionData *self, PyObject *args)
+PyObject *MotionData_yroot(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":yroot")) return NULL;
return PyLong_FromLong(self->yroot);
}
-PyObject *ActionData_time(ActionData *self, PyObject *args)
+PyObject *MotionData_pressx(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":pressx")) return NULL;
+ return PyLong_FromLong(self->pressx);
+}
+
+PyObject *MotionData_pressy(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":pressy")) return NULL;
+ return PyLong_FromLong(self->pressy);
+}
+
+
+PyObject *MotionData_press_clientx(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clientx")) return NULL;
+ return PyLong_FromLong(self->press_clientx);
+}
+
+PyObject *MotionData_press_clienty(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clienty")) return NULL;
+ return PyLong_FromLong(self->press_clienty);
+}
+
+PyObject *MotionData_press_clientwidth(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clientwidth")) return NULL;
+ return PyLong_FromLong(self->press_clientwidth);
+}
+
+PyObject *MotionData_press_clientheight(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clientheight")) return NULL;
+ return PyLong_FromLong(self->press_clientheight);
+}
+
+PyObject *MotionData_time(MotionData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":time")) return NULL;
return PyLong_FromLong(self->time);
}
-static PyMethodDef ActionData_methods[] = {
- {"action", (PyCFunction)ActionData_action, METH_VARARGS,
+static PyMethodDef MotionData_methods[] = {
+ {"action", (PyCFunction)MotionData_action, METH_VARARGS,
"Return the action being executed."},
- {"window", (PyCFunction)ActionData_window, METH_VARARGS,
+ {"window", (PyCFunction)MotionData_window, METH_VARARGS,
"Return the client window id."},
- {"context", (PyCFunction)ActionData_context, METH_VARARGS,
+ {"context", (PyCFunction)MotionData_context, METH_VARARGS,
"Return the context that the action is occuring in."},
- {"modifiers", (PyCFunction)ActionData_modifiers, METH_VARARGS,
+ {"modifiers", (PyCFunction)MotionData_modifiers, METH_VARARGS,
"Return the modifier keys state."},
- {"button", (PyCFunction)ActionData_button, METH_VARARGS,
+ {"button", (PyCFunction)MotionData_button, METH_VARARGS,
"Return the number of the pressed button (1-5)."},
- {"xroot", (PyCFunction)ActionData_xroot, METH_VARARGS,
+ {"xroot", (PyCFunction)MotionData_xroot, METH_VARARGS,
"Return the X-position of the mouse cursor on the root window."},
- {"yroot", (PyCFunction)ActionData_yroot, METH_VARARGS,
+ {"yroot", (PyCFunction)MotionData_yroot, METH_VARARGS,
"Return the Y-position of the mouse cursor on the root window."},
- {"time", (PyCFunction)ActionData_time, METH_VARARGS,
+ {"pressx", (PyCFunction)MotionData_pressx, METH_VARARGS,
+ "Return the X-position of the mouse cursor at the start of the drag."},
+ {"pressy", (PyCFunction)MotionData_pressy, METH_VARARGS,
+ "Return the Y-position of the mouse cursor at the start of the drag."},
+ {"press_clientx", (PyCFunction)MotionData_press_clientx, METH_VARARGS,
+ "Return the X-position of the client at the start of the drag."},
+ {"press_clienty", (PyCFunction)MotionData_press_clienty, METH_VARARGS,
+ "Return the Y-position of the client at the start of the drag."},
+ {"press_clientwidth", (PyCFunction)MotionData_press_clientwidth,
+ METH_VARARGS,
+ "Return the width of the client at the start of the drag."},
+ {"press_clientheight", (PyCFunction)MotionData_press_clientheight,
+ METH_VARARGS,
+ "Return the height of the client at the start of the drag."},
+ {"time", (PyCFunction)MotionData_time, METH_VARARGS,
"Return the time at which the event occured."},
{NULL, NULL, 0, NULL}
};
-PyObject *BindingData_window(BindingData *self, PyObject *args)
-{
- if(!PyArg_ParseTuple(args,":window")) return NULL;
- return PyLong_FromLong(self->window);
-}
-
-PyObject *BindingData_modifiers(BindingData *self, PyObject *args)
-{
- if(!PyArg_ParseTuple(args,":modifiers")) return NULL;
- return PyLong_FromUnsignedLong(self->state);
-}
+static PyMethodDef ButtonData_methods[] = {
+ {"action", (PyCFunction)MotionData_action, METH_VARARGS,
+ "Return the action being executed."},
+ {"context", (PyCFunction)MotionData_context, METH_VARARGS,
+ "Return the context that the action is occuring in."},
+ {"window", (PyCFunction)MotionData_window, METH_VARARGS,
+ "Return the client window id."},
+ {"modifiers", (PyCFunction)MotionData_modifiers, METH_VARARGS,
+ "Return the modifier keys state."},
+ {"button", (PyCFunction)MotionData_button, METH_VARARGS,
+ "Return the number of the pressed button (1-5)."},
+ {"time", (PyCFunction)MotionData_time, METH_VARARGS,
+ "Return the time at which the event occured."},
+ {NULL, NULL, 0, NULL}
+};
-PyObject *BindingData_key(BindingData *self, PyObject *args)
+PyObject *KeyData_key(KeyData *self, PyObject *args)
{
if(!PyArg_ParseTuple(args,":key")) return NULL;
return PyString_FromString(
@@ -149,58 +179,117 @@ PyObject *BindingData_key(BindingData *self, PyObject *args)
}
-PyObject *BindingData_time(BindingData *self, PyObject *args)
-{
- if(!PyArg_ParseTuple(args,":time")) return NULL;
- return PyLong_FromLong(self->time);
-}
-
-static PyMethodDef BindingData_methods[] = {
- {"window", (PyCFunction)BindingData_window, METH_VARARGS,
+static PyMethodDef KeyData_methods[] = {
+ {"window", (PyCFunction)MotionData_window, METH_VARARGS,
"Return the client window id."},
- {"modifiers", (PyCFunction)BindingData_modifiers, METH_VARARGS,
+ {"modifiers", (PyCFunction)MotionData_modifiers, METH_VARARGS,
"Return the modifier keys state."},
- {"key", (PyCFunction)BindingData_key, METH_VARARGS,
+ {"key", (PyCFunction)KeyData_key, METH_VARARGS,
"Return the name of the pressed key."},
- {"time", (PyCFunction)BindingData_time, METH_VARARGS,
+ {"time", (PyCFunction)MotionData_time, METH_VARARGS,
"Return the time at which the event occured."},
{NULL, NULL, 0, NULL}
};
-static PyObject *ActionDataGetAttr(PyObject *obj, char *name)
+static PyObject *MotionDataGetAttr(PyObject *obj, char *name)
+{
+ return Py_FindMethod(MotionData_methods, obj, name);
+}
+
+static PyObject *ButtonDataGetAttr(PyObject *obj, char *name)
{
- return Py_FindMethod(ActionData_methods, obj, name);
+ return Py_FindMethod(ButtonData_methods, obj, name);
}
-static PyObject *BindingDataGetAttr(PyObject *obj, char *name)
+static PyObject *KeyDataGetAttr(PyObject *obj, char *name)
{
- return Py_FindMethod(BindingData_methods, obj, name);
+ return Py_FindMethod(KeyData_methods, obj, name);
}
-static PyTypeObject ActionData_Type = {
+static PyTypeObject MotionData_Type = {
+ PyObject_HEAD_INIT(NULL)
+ 0,
+ "MotionData",
+ sizeof(MotionData),
+ 0,
+ dealloc,
+ 0,
+ (getattrfunc)MotionDataGetAttr,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+static PyTypeObject ButtonData_Type = {
PyObject_HEAD_INIT(NULL)
0,
- "ActionData",
- sizeof(ActionData),
+ "ButtonData",
+ sizeof(ButtonData),
0,
- (destructor)ActionDataDealloc,
+ dealloc,
0,
- (getattrfunc)ActionDataGetAttr,
+ (getattrfunc)ButtonDataGetAttr,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
-static PyTypeObject BindingData_Type = {
+static PyTypeObject KeyData_Type = {
PyObject_HEAD_INIT(NULL)
0,
- "BindingData",
- sizeof(BindingData),
+ "KeyData",
+ sizeof(KeyData),
0,
- (destructor)BindingDataDealloc,
+ dealloc,
0,
- (getattrfunc)BindingDataGetAttr,
+ (getattrfunc)KeyDataGetAttr,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
+MotionData *new_motion_data(Window window, Time time, unsigned int state,
+ unsigned int button, MouseContext context,
+ MouseAction action, int xroot, int yroot,
+ const otk::Point &initpos, const otk::Rect &initarea)
+{
+ MotionData *data = PyObject_New(MotionData, &MotionData_Type);
+ data->window = window;
+ data->time = time;
+ data->state = state;
+ data->button = button;
+ data->context= context;
+ data->action = action;
+ data->xroot = xroot;
+ data->yroot = yroot;
+ data->pressx = initpos.x();
+ data->pressy = initpos.y();
+ data->press_clientx = initarea.x();
+ data->press_clienty = initarea.y();
+ data->press_clientwidth = initarea.width();
+ data->press_clientheight = initarea.height();
+ return data;
+}
+
+ButtonData *new_button_data(Window window, Time time, unsigned int state,
+ unsigned int button, MouseContext context,
+ MouseAction action)
+{
+ ButtonData *data = PyObject_New(ButtonData, &ButtonData_Type);
+ data->window = window;
+ data->time = time;
+ data->state = state;
+ data->button = button;
+ data->context= context;
+ data->action = action;
+ return data;
+}
+
+KeyData *new_key_data(Window window, Time time, unsigned int state,
+ unsigned int key)
+{
+ KeyData *data = PyObject_New(KeyData, &KeyData_Type);
+ data->window = window;
+ data->time = time;
+ data->state = state;
+ data->key = key;
+ return data;
+}
+
// **************** //
// End custom types //
// **************** //
@@ -219,8 +308,9 @@ void python_init(char *argv0)
obdict = PyModule_GetDict(obmodule);
// set up the custom types
- ActionData_Type.ob_type = &PyType_Type;
- BindingData_Type.ob_type = &PyType_Type;
+ MotionData_Type.ob_type = &PyType_Type;
+ ButtonData_Type.ob_type = &PyType_Type;
+ KeyData_Type.ob_type = &PyType_Type;
}
void python_destroy()
@@ -240,7 +330,7 @@ bool python_exec(const std::string &path)
return true;
}
-static void call(PyObject *func, PyObject *data)
+void python_callback(PyObject *func, PyObject *data)
{
PyObject *arglist;
PyObject *result;
@@ -258,42 +348,6 @@ static void call(PyObject *func, PyObject *data)
Py_DECREF(arglist);
}
-void python_callback(PyObject *func, MouseAction action,
- Window window, MouseContext context,
- unsigned int state, unsigned int button,
- int xroot, int yroot, Time time)
-{
- assert(func);
-
- ActionData *data = PyObject_New(ActionData, &ActionData_Type);
- data->action = action;
- data->window = window;
- data->context= context;
- data->state = state;
- data->button = button;
- data->xroot = xroot;
- data->yroot = yroot;
- data->time = time;
-
- call(func, (PyObject*)data);
- Py_DECREF(data);
-}
-
-void python_callback(PyObject *func, Window window, unsigned int state,
- unsigned int key, Time time)
-{
- if (!func) return;
-
- BindingData *data = PyObject_New(BindingData, &BindingData_Type);
- data->window = window;
- data->state = state;
- data->key = key;
- data->time = time;
-
- call(func, (PyObject*)data);
- Py_DECREF(data);
-}
-
bool python_get_string(const char *name, std::string *value)
{
PyObject *val = PyDict_GetItemString(obdict, const_cast<char*>(name));
@@ -438,4 +492,5 @@ void set_reset_key(const std::string &key)
{
ob::Openbox::instance->bindings()->setResetKey(key);
}
+
}
diff --git a/src/python.hh b/src/python.hh
index c5e566f4..67943a84 100644
--- a/src/python.hh
+++ b/src/python.hh
@@ -6,6 +6,9 @@
@brief wee
*/
+#include "otk/point.hh"
+#include "otk/rect.hh"
+
extern "C" {
#include <X11/Xlib.h>
#include <Python.h>
@@ -19,6 +22,7 @@ namespace ob {
enum MouseContext {
MC_Frame,
MC_Titlebar,
+ MC_Handle,
MC_Window,
MC_MaximizeButton,
MC_CloseButton,
@@ -45,18 +49,61 @@ enum KeyContext {
};
#ifndef SWIG
+
+// *** MotionData can be (and is) cast ButtonData!! (in actions.cc) *** //
+typedef struct {
+ PyObject_HEAD;
+ Window window;
+ Time time;
+ unsigned int state;
+ unsigned int button;
+ MouseContext context;
+ MouseAction action;
+ int xroot;
+ int yroot;
+ int pressx;
+ int pressy;
+ int press_clientx;
+ int press_clienty;
+ int press_clientwidth;
+ int press_clientheight;
+} MotionData;
+
+// *** MotionData can be (and is) cast ButtonData!! (in actions.cc) *** //
+typedef struct {
+ PyObject_HEAD;
+ Window window;
+ Time time;
+ unsigned int state;
+ unsigned int button;
+ MouseContext context;
+ MouseAction action;
+} ButtonData;
+
+typedef struct {
+ PyObject_HEAD;
+ Window window;
+ Time time;
+ unsigned int state;
+ unsigned int key;
+} KeyData;
+
void python_init(char *argv0);
void python_destroy();
bool python_exec(const std::string &path);
-void python_callback(PyObject *func, MouseAction action,
- Window window, MouseContext context,
- unsigned int state, unsigned int button,
- int xroot, int yroot, Time time);
-
-void python_callback(PyObject *func, Window window, unsigned int state,
- unsigned int key, Time time);
+MotionData *new_motion_data(Window window, Time time, unsigned int state,
+ unsigned int button, MouseContext context,
+ MouseAction action, int xroot, int yroot,
+ const otk::Point &initpos,
+ const otk::Rect &initarea);
+ButtonData *new_button_data(Window window, Time time, unsigned int state,
+ unsigned int button, MouseContext context,
+ MouseAction action);
+KeyData *new_key_data(Window window, Time time, unsigned int state,
+ unsigned int key);
+void python_callback(PyObject *func, PyObject *data);
bool python_get_string(const char *name, std::string *value);
bool python_get_stringlist(const char *name, std::vector<std::string> *value);
diff --git a/src/widget.hh b/src/widget.hh
index e51189d6..85b9dcc5 100644
--- a/src/widget.hh
+++ b/src/widget.hh
@@ -2,6 +2,8 @@
#ifndef __obwidget_hh
#define __obwidget_hh
+#include "python.hh"
+
namespace ob {
class OBWidget {
@@ -30,6 +32,39 @@ public:
OBWidget(WidgetType type) : _type(type) {}
inline WidgetType type() const { return _type; }
+
+ inline MouseContext mcontext() const {
+ switch (_type) {
+ case Type_Frame:
+ return MC_Frame;
+ case Type_Titlebar:
+ return MC_Titlebar;
+ case Type_Handle:
+ return MC_Handle;
+ case Type_Plate:
+ return MC_Window;
+ case Type_Label:
+ return MC_Titlebar;
+ case Type_MaximizeButton:
+ return MC_MaximizeButton;
+ case Type_CloseButton:
+ return MC_CloseButton;
+ case Type_IconifyButton:
+ return MC_IconifyButton;
+ case Type_StickyButton:
+ return MC_StickyButton;
+ case Type_LeftGrip:
+ return MC_Grip;
+ case Type_RightGrip:
+ return MC_Grip;
+ case Type_Client:
+ return MC_Window;
+ case Type_Root:
+ return MC_Root;
+ default:
+ assert(false); // unhandled type
+ }
+ }
};
}