new python interface! using the .py shadow wrappers from swig
This commit is contained in:
parent
0d00827947
commit
b67f5e702e
7 changed files with 1910 additions and 618 deletions
|
@ -4,123 +4,101 @@
|
|||
|
||||
def state_above(data, add=2):
|
||||
"""Toggles, adds or removes the 'above' state on a window."""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
|
||||
window = OBClient_window(client)
|
||||
above = OBProperty_atom(Openbox_property(openbox),
|
||||
OBProperty_net_wm_state_above)
|
||||
send_client_msg(root, OBProperty_net_wm_state, window, add,
|
||||
above)
|
||||
if not data.client: return
|
||||
send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
|
||||
OBProperty.net_wm_state, data.client.window(), add,
|
||||
openbox.property().atom(OBProperty.net_wm_state_above))
|
||||
|
||||
def state_below(data, add=2):
|
||||
"""Toggles, adds or removes the 'below' state on a window."""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
|
||||
window = OBClient_window(client)
|
||||
below = OBProperty_atom(Openbox_property(openbox),
|
||||
OBProperty_net_wm_state_below)
|
||||
send_client_msg(root, OBProperty_net_wm_state, window, add,
|
||||
below)
|
||||
if not data.client: return
|
||||
send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
|
||||
OBProperty.net_wm_state, data.client.window(), add,
|
||||
openbox.property().atom(OBProperty.net_wm_state_below))
|
||||
|
||||
def state_shaded(data, add=2):
|
||||
"""Toggles, adds or removes the 'shaded' state on a window."""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
|
||||
window = OBClient_window(client)
|
||||
shaded = OBProperty_atom(Openbox_property(openbox),
|
||||
OBProperty_net_wm_state_shaded)
|
||||
send_client_msg(root, OBProperty_net_wm_state, window, add,
|
||||
shaded)
|
||||
if not data.client: return
|
||||
send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
|
||||
OBProperty.net_wm_state, data.client,window(), add,
|
||||
openbox.property().atom(OBProperty.net_wm_state_shaded))
|
||||
|
||||
def close(data):
|
||||
"""Closes the window on which the event occured"""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
|
||||
window = OBClient_window(client)
|
||||
send_client_msg(root, OBProperty_net_close_window, window, 0)
|
||||
if not data.client: return
|
||||
send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
|
||||
OBProperty.net_close_window, data.client.window(), 0)
|
||||
|
||||
def focus(data):
|
||||
"""Focuses the window on which the event occured"""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
type = OBClient_type(client)
|
||||
if not data.client: return
|
||||
# !normal windows dont get focus from window enter events
|
||||
if data.action() == EventEnterWindow and not OBClient_normal(client):
|
||||
if data.action == EventEnterWindow and not data.client.normal():
|
||||
return
|
||||
OBClient_focus(client)
|
||||
data.client.focus()
|
||||
|
||||
def move(data):
|
||||
"""Moves the window interactively. This should only be used with
|
||||
MouseMotion events"""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
if not data.client: return
|
||||
|
||||
# !normal windows dont get moved
|
||||
if not OBClient_normal(client): return
|
||||
if not data.client.normal(): return
|
||||
|
||||
dx = data.xroot() - data.pressx()
|
||||
dy = data.yroot() - data.pressy()
|
||||
OBClient_move(client, data.press_clientx() + dx, data.press_clienty() + dy)
|
||||
dx = data.xroot - data.pressx
|
||||
dy = data.yroot - data.pressy
|
||||
data.client.move(data.press_clientx + dx, data.press_clienty + dy)
|
||||
|
||||
def resize(data):
|
||||
"""Resizes the window interactively. This should only be used with
|
||||
MouseMotion events"""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
if not data.client: return
|
||||
|
||||
# !normal windows dont get moved
|
||||
if not OBClient_normal(client): return
|
||||
if not data.client.normal(): return
|
||||
|
||||
px = data.pressx()
|
||||
py = data.pressy()
|
||||
dx = data.xroot() - px
|
||||
dy = data.yroot() - py
|
||||
px = data.pressx
|
||||
py = data.pressy
|
||||
dx = data.xroot - px
|
||||
dy = data.yroot - py
|
||||
|
||||
# pick a corner to anchor
|
||||
if not (resize_nearest or data.context() == MC_Grip):
|
||||
corner = OBClient_TopLeft
|
||||
if not (resize_nearest or data.context == MC_Grip):
|
||||
corner = OBClient.TopLeft
|
||||
else:
|
||||
x = px - data.press_clientx()
|
||||
y = py - data.press_clienty()
|
||||
if y < data.press_clientheight() / 2:
|
||||
if x < data.press_clientwidth() / 2:
|
||||
corner = OBClient_BottomRight
|
||||
x = px - data.press_clientx
|
||||
y = py - data.press_clienty
|
||||
if y < data.press_clientheight / 2:
|
||||
if x < data.press_clientwidth / 2:
|
||||
corner = OBClient.BottomRight
|
||||
dx *= -1
|
||||
else:
|
||||
corner = OBClient_BottomLeft
|
||||
corner = OBClient.BottomLeft
|
||||
dy *= -1
|
||||
else:
|
||||
if x < data.press_clientwidth() / 2:
|
||||
corner = OBClient_TopRight
|
||||
if x < data.press_clientwidth / 2:
|
||||
corner = OBClient.TopRight
|
||||
dx *= -1
|
||||
else:
|
||||
corner = OBClient_TopLeft
|
||||
corner = OBClient.TopLeft
|
||||
|
||||
OBClient_resize(client, corner,
|
||||
data.press_clientwidth() + dx,
|
||||
data.press_clientheight() + dy);
|
||||
data.client.resize(corner,
|
||||
data.press_clientwidth + dx,
|
||||
data.press_clientheight + dy);
|
||||
|
||||
def restart(data):
|
||||
"""Restarts openbox"""
|
||||
Openbox_restart(openbox, "")
|
||||
openbox.restart("")
|
||||
|
||||
def raise_win(data):
|
||||
"""Raises the window on which the event occured"""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
screen = Openbox_screen(openbox, OBClient_screen(client))
|
||||
OBScreen_restack(screen, 1, client)
|
||||
if not data.client: return
|
||||
openbox.screen(data.screen).restack(1, data.client)
|
||||
|
||||
def lower_win(data):
|
||||
"""Lowers the window on which the event occured"""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
screen = Openbox_screen(openbox, OBClient_screen(client))
|
||||
OBScreen_restack(screen, 0, client)
|
||||
if not data.client: return
|
||||
openbox.screen(data.screen).restack(0, data.client)
|
||||
|
||||
def toggle_shade(data):
|
||||
"""Toggles the shade status of the window on which the event occured"""
|
||||
|
@ -136,15 +114,15 @@ def unshade(data):
|
|||
|
||||
def change_desktop(data, num):
|
||||
"""Switches to a specified desktop"""
|
||||
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
|
||||
send_client_msg(root, OBProperty_net_current_desktop, root, num)
|
||||
root = OBDisplay_screenInfo(data.screen).rootWindow()
|
||||
send_client_msg(root, OBProperty.net_current_desktop, root, num)
|
||||
|
||||
def next_desktop(data, no_wrap=0):
|
||||
"""Switches to the next desktop, optionally (by default) cycling around to
|
||||
the first when going past the last."""
|
||||
screen = Openbox_screen(openbox, data.screen())
|
||||
d = OBScreen_desktop(screen)
|
||||
n = OBScreen_numDesktops(screen)
|
||||
screen = openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d < (n-1)):
|
||||
d = d + 1
|
||||
elif not no_wrap:
|
||||
|
@ -154,9 +132,9 @@ def next_desktop(data, no_wrap=0):
|
|||
def prev_desktop(data, no_wrap=0):
|
||||
"""Switches to the previous desktop, optionally (by default) cycling around
|
||||
to the last when going past the first."""
|
||||
screen = Openbox_screen(openbox, data.screen())
|
||||
d = OBScreen_desktop(screen)
|
||||
n = OBScreen_numDesktops(screen)
|
||||
screen = openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d > 0):
|
||||
d = d - 1
|
||||
elif not no_wrap:
|
||||
|
@ -165,21 +143,18 @@ def prev_desktop(data, no_wrap=0):
|
|||
|
||||
def send_to_desktop(data, num):
|
||||
"""Sends a client to a specified desktop"""
|
||||
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if client:
|
||||
window = OBClient_window(client)
|
||||
send_client_msg(root, OBProperty_net_wm_desktop, window, num)
|
||||
if not data.client: return
|
||||
send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
|
||||
OBProperty.net_wm_desktop, data.client.window(), num)
|
||||
|
||||
def send_to_next_desktop(data, no_wrap=0, follow=1):
|
||||
"""Sends a window to the next desktop, optionally (by default) cycling
|
||||
around to the first when going past the last. Also optionally moving to
|
||||
the new desktop after sending the window."""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
screen = Openbox_screen(openbox, data.screen())
|
||||
d = OBScreen_desktop(screen)
|
||||
n = OBScreen_numDesktops(screen)
|
||||
if not data.client: return
|
||||
screen = openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d < (n-1)):
|
||||
d = d + 1
|
||||
elif not no_wrap:
|
||||
|
@ -192,11 +167,10 @@ def send_to_prev_desktop(data, no_wrap=0, follow=1):
|
|||
"""Sends a window to the previous desktop, optionally (by default) cycling
|
||||
around to the last when going past the first. Also optionally moving to
|
||||
the new desktop after sending the window."""
|
||||
client = Openbox_findClient(openbox, data.window())
|
||||
if not client: return
|
||||
screen = Openbox_screen(openbox, data.screen())
|
||||
d = OBScreen_desktop(screen)
|
||||
n = OBScreen_numDesktops(screen)
|
||||
if not data.client: return
|
||||
screen = openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d > 0):
|
||||
d = d - 1
|
||||
elif not no_wrap:
|
||||
|
@ -213,6 +187,6 @@ def execute(bin, screen = 0):
|
|||
"""Executes a command on the specified screen. It is recommended that you
|
||||
use this call instead of a python system call. If the specified screen
|
||||
is beyond your range of screens, the default is used instead."""
|
||||
Openbox_execute(openbox, screen, bin)
|
||||
openbox.execute(screen, bin)
|
||||
|
||||
print "Loaded builtins.py"
|
||||
|
|
|
@ -81,8 +81,8 @@ void OBActions::buttonPressHandler(const XButtonEvent &e)
|
|||
screen = c->screen();
|
||||
else
|
||||
screen = otk::OBDisplay::findScreen(e.root)->screen();
|
||||
ButtonData data(screen, c, e.time, state, e.button, w->mcontext(),
|
||||
MousePress);
|
||||
MouseData data(screen, c, e.time, state, e.button, w->mcontext(),
|
||||
MousePress);
|
||||
Openbox::instance->bindings()->fireButton(&data);
|
||||
|
||||
if (_button) return; // won't count toward CLICK events
|
||||
|
@ -124,8 +124,8 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
|
|||
screen = c->screen();
|
||||
else
|
||||
screen = otk::OBDisplay::findScreen(e.root)->screen();
|
||||
ButtonData data(screen, c, e.time, state, e.button, w->mcontext(),
|
||||
MouseClick);
|
||||
MouseData data(screen, c, e.time, state, e.button, w->mcontext(),
|
||||
MouseClick);
|
||||
Openbox::instance->bindings()->fireButton(&data);
|
||||
|
||||
|
||||
|
@ -234,9 +234,9 @@ void OBActions::motionHandler(const XMotionEvent &e)
|
|||
screen = c->screen();
|
||||
else
|
||||
screen = otk::OBDisplay::findScreen(e.root)->screen();
|
||||
MotionData data(screen, c, e.time, state, button, w->mcontext(), MouseMotion,
|
||||
x_root, y_root, _posqueue[0]->pos, _posqueue[0]->clientarea);
|
||||
Openbox::instance->bindings()->fireButton((ButtonData*)&data);
|
||||
MouseData data(screen, c, e.time, state, button, w->mcontext(), MouseMotion,
|
||||
x_root, y_root, _posqueue[0]->pos, _posqueue[0]->clientarea);
|
||||
Openbox::instance->bindings()->fireButton(&data);
|
||||
}
|
||||
|
||||
void OBActions::mapRequestHandler(const XMapRequestEvent &e)
|
||||
|
|
|
@ -390,6 +390,7 @@ void OBBindings::fireKey(int screen, unsigned int modifiers, unsigned int key,
|
|||
OBClient *c = Openbox::instance->focusedClient();
|
||||
KeyData data(screen, c, time, modifiers, key);
|
||||
CallbackList::iterator it, end = p->callbacks.end();
|
||||
printf("Firing key!\n");
|
||||
for (it = p->callbacks.begin(); it != end; ++it)
|
||||
python_callback(*it, &data);
|
||||
resetChains(this);
|
||||
|
@ -512,7 +513,7 @@ void OBBindings::grabButtons(bool grab, OBClient *client)
|
|||
}
|
||||
}
|
||||
|
||||
void OBBindings::fireButton(ButtonData *data)
|
||||
void OBBindings::fireButton(MouseData *data)
|
||||
{
|
||||
if (data->context == MC_Window) {
|
||||
// these are grabbed in Sync mode to allow the press to be normal to the
|
||||
|
@ -527,7 +528,7 @@ void OBBindings::fireButton(ButtonData *data)
|
|||
CallbackList::iterator c_it,c_end = (*it)->callbacks[data->action].end();
|
||||
for (c_it = (*it)->callbacks[data->action].begin();
|
||||
c_it != c_end; ++c_it)
|
||||
python_callback(*c_it, (PyObject*)data);
|
||||
python_callback(*c_it, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,7 @@ public:
|
|||
//! Removes all button bindings
|
||||
void removeAllButtons();
|
||||
|
||||
void fireButton(ButtonData *data);
|
||||
void fireButton(MouseData *data);
|
||||
|
||||
//! Bind a callback for an event
|
||||
bool addEvent(EventAction action, PyObject *callback);
|
||||
|
|
2296
src/openbox_wrap.cc
2296
src/openbox_wrap.cc
File diff suppressed because it is too large
Load diff
|
@ -6,6 +6,7 @@
|
|||
#include "python.hh"
|
||||
#include "bindings.hh"
|
||||
#include "otk/display.hh"
|
||||
#include "otk/util.hh"
|
||||
|
||||
extern "C" {
|
||||
// The initializer in openbox_wrap.cc
|
||||
|
@ -24,7 +25,13 @@ void python_init(char *argv0)
|
|||
Py_Initialize();
|
||||
init_otk();
|
||||
init_openbox();
|
||||
PyRun_SimpleString("from _otk import *; from _openbox import *;");
|
||||
PyRun_SimpleString("import sys");
|
||||
PyRun_SimpleString("sys.path.append('" SCRIPTDIR "')");
|
||||
PyRun_SimpleString(const_cast<char*>(((std::string)"sys.path.append('" +
|
||||
otk::expandTilde("~/.openbox/python") +
|
||||
"')").c_str()));
|
||||
// PyRun_SimpleString("from _otk import *; from _openbox import *;");
|
||||
PyRun_SimpleString("from otk import *; from openbox import *;");
|
||||
PyRun_SimpleString("openbox = Openbox_instance()");
|
||||
PyRun_SimpleString("display = OBDisplay_display()");
|
||||
|
||||
|
@ -143,6 +150,7 @@ PyObject *kbind(PyObject *keylist, ob::KeyContext context, PyObject *func)
|
|||
vectkeylist.push_back(PyString_AsString(str));
|
||||
}
|
||||
|
||||
(void)context; // XXX use this sometime!
|
||||
if (!ob::Openbox::instance->bindings()->addKey(vectkeylist, func)) {
|
||||
PyErr_SetString(PyExc_RuntimeError,"Unable to add binding.");
|
||||
return NULL;
|
||||
|
|
|
@ -65,8 +65,7 @@ enum EventAction {
|
|||
NUM_EVENTS
|
||||
};
|
||||
|
||||
// *** MotionData can be (and is) cast ButtonData!! (in actions.cc) *** //
|
||||
class MotionData {
|
||||
class MouseData {
|
||||
public:
|
||||
int screen;
|
||||
OBClient *client;
|
||||
|
@ -84,10 +83,10 @@ public:
|
|||
int press_clientwidth;
|
||||
int press_clientheight;
|
||||
|
||||
MotionData(int screen, OBClient *client, Time time, unsigned int state,
|
||||
unsigned int button, MouseContext context, MouseAction action,
|
||||
int xroot, int yroot, const otk::Point &initpos,
|
||||
const otk::Rect &initarea) {
|
||||
MouseData(int screen, OBClient *client, Time time, unsigned int state,
|
||||
unsigned int button, MouseContext context, MouseAction action,
|
||||
int xroot, int yroot, const otk::Point &initpos,
|
||||
const otk::Rect &initarea) {
|
||||
this->screen = screen;
|
||||
this->client = client;
|
||||
this->time = time;
|
||||
|
@ -104,21 +103,8 @@ public:
|
|||
this->press_clientwidth = initarea.width();
|
||||
this->press_clientheight = initarea.height();
|
||||
}
|
||||
};
|
||||
|
||||
// *** MotionData can be (and is) cast ButtonData!! (in actions.cc) *** //
|
||||
class ButtonData {
|
||||
public:
|
||||
int screen;
|
||||
OBClient *client;
|
||||
Time time;
|
||||
unsigned int state;
|
||||
unsigned int button;
|
||||
MouseContext context;
|
||||
MouseAction action;
|
||||
|
||||
ButtonData(int screen, OBClient *client, Time time, unsigned int state,
|
||||
unsigned int button, MouseContext context, MouseAction action) {
|
||||
MouseData(int screen, OBClient *client, Time time, unsigned int state,
|
||||
unsigned int button, MouseContext context, MouseAction action) {
|
||||
this->screen = screen;
|
||||
this->client = client;
|
||||
this->time = time;
|
||||
|
@ -126,6 +112,14 @@ public:
|
|||
this->button = button;
|
||||
this->context= context;
|
||||
this->action = action;
|
||||
this->xroot = xroot;
|
||||
this->yroot = yroot;
|
||||
this->pressx = 0;
|
||||
this->pressy = 0;
|
||||
this->press_clientx = 0;
|
||||
this->press_clienty = 0;
|
||||
this->press_clientwidth = 0;
|
||||
this->press_clientheight = 0;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -177,8 +171,7 @@ bool python_get_stringlist(const char *name, std::vector<std::string> *value);
|
|||
/***********************************************
|
||||
* These are found in openbox.i, not python.cc *
|
||||
***********************************************/
|
||||
void python_callback(PyObject *func, MotionData *data);
|
||||
void python_callback(PyObject *func, ButtonData *data);
|
||||
void python_callback(PyObject *func, MouseData *data);
|
||||
void python_callback(PyObject *func, EventData *data);
|
||||
void python_callback(PyObject *func, KeyData *data);
|
||||
|
||||
|
|
Loading…
Reference in a new issue