new python interface! using the .py shadow wrappers from swig

This commit is contained in:
Dana Jansens 2003-01-10 03:11:48 +00:00
parent 0d00827947
commit b67f5e702e
7 changed files with 1910 additions and 618 deletions

View file

@ -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"

View file

@ -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)

View file

@ -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);
}
}

View file

@ -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);

File diff suppressed because it is too large Load diff

View file

@ -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;

View file

@ -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);