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): def state_above(data, add=2):
"""Toggles, adds or removes the 'above' state on a window.""" """Toggles, adds or removes the 'above' state on a window."""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen())) OBProperty.net_wm_state, data.client.window(), add,
window = OBClient_window(client) openbox.property().atom(OBProperty.net_wm_state_above))
above = OBProperty_atom(Openbox_property(openbox),
OBProperty_net_wm_state_above)
send_client_msg(root, OBProperty_net_wm_state, window, add,
above)
def state_below(data, add=2): def state_below(data, add=2):
"""Toggles, adds or removes the 'below' state on a window.""" """Toggles, adds or removes the 'below' state on a window."""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen())) OBProperty.net_wm_state, data.client.window(), add,
window = OBClient_window(client) openbox.property().atom(OBProperty.net_wm_state_below))
below = OBProperty_atom(Openbox_property(openbox),
OBProperty_net_wm_state_below)
send_client_msg(root, OBProperty_net_wm_state, window, add,
below)
def state_shaded(data, add=2): def state_shaded(data, add=2):
"""Toggles, adds or removes the 'shaded' state on a window.""" """Toggles, adds or removes the 'shaded' state on a window."""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen())) OBProperty.net_wm_state, data.client,window(), add,
window = OBClient_window(client) openbox.property().atom(OBProperty.net_wm_state_shaded))
shaded = OBProperty_atom(Openbox_property(openbox),
OBProperty_net_wm_state_shaded)
send_client_msg(root, OBProperty_net_wm_state, window, add,
shaded)
def close(data): def close(data):
"""Closes the window on which the event occured""" """Closes the window on which the event occured"""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen())) OBProperty.net_close_window, data.client.window(), 0)
window = OBClient_window(client)
send_client_msg(root, OBProperty_net_close_window, window, 0)
def focus(data): def focus(data):
"""Focuses the window on which the event occured""" """Focuses the window on which the event occured"""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return
type = OBClient_type(client)
# !normal windows dont get focus from window enter events # !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 return
OBClient_focus(client) data.client.focus()
def move(data): def move(data):
"""Moves the window interactively. This should only be used with """Moves the window interactively. This should only be used with
MouseMotion events""" MouseMotion events"""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return
# !normal windows dont get moved # !normal windows dont get moved
if not OBClient_normal(client): return if not data.client.normal(): return
dx = data.xroot() - data.pressx() dx = data.xroot - data.pressx
dy = data.yroot() - data.pressy() dy = data.yroot - data.pressy
OBClient_move(client, data.press_clientx() + dx, data.press_clienty() + dy) data.client.move(data.press_clientx + dx, data.press_clienty + dy)
def resize(data): def resize(data):
"""Resizes the window interactively. This should only be used with """Resizes the window interactively. This should only be used with
MouseMotion events""" MouseMotion events"""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return
# !normal windows dont get moved # !normal windows dont get moved
if not OBClient_normal(client): return if not data.client.normal(): return
px = data.pressx() px = data.pressx
py = data.pressy() py = data.pressy
dx = data.xroot() - px dx = data.xroot - px
dy = data.yroot() - py dy = data.yroot - py
# pick a corner to anchor # pick a corner to anchor
if not (resize_nearest or data.context() == MC_Grip): if not (resize_nearest or data.context == MC_Grip):
corner = OBClient_TopLeft corner = OBClient.TopLeft
else: else:
x = px - data.press_clientx() x = px - data.press_clientx
y = py - data.press_clienty() y = py - data.press_clienty
if y < data.press_clientheight() / 2: if y < data.press_clientheight / 2:
if x < data.press_clientwidth() / 2: if x < data.press_clientwidth / 2:
corner = OBClient_BottomRight corner = OBClient.BottomRight
dx *= -1 dx *= -1
else: else:
corner = OBClient_BottomLeft corner = OBClient.BottomLeft
dy *= -1 dy *= -1
else: else:
if x < data.press_clientwidth() / 2: if x < data.press_clientwidth / 2:
corner = OBClient_TopRight corner = OBClient.TopRight
dx *= -1 dx *= -1
else: else:
corner = OBClient_TopLeft corner = OBClient.TopLeft
OBClient_resize(client, corner, data.client.resize(corner,
data.press_clientwidth() + dx, data.press_clientwidth + dx,
data.press_clientheight() + dy); data.press_clientheight + dy);
def restart(data): def restart(data):
"""Restarts openbox""" """Restarts openbox"""
Openbox_restart(openbox, "") openbox.restart("")
def raise_win(data): def raise_win(data):
"""Raises the window on which the event occured""" """Raises the window on which the event occured"""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return openbox.screen(data.screen).restack(1, data.client)
screen = Openbox_screen(openbox, OBClient_screen(client))
OBScreen_restack(screen, 1, client)
def lower_win(data): def lower_win(data):
"""Lowers the window on which the event occured""" """Lowers the window on which the event occured"""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return openbox.screen(data.screen).restack(0, data.client)
screen = Openbox_screen(openbox, OBClient_screen(client))
OBScreen_restack(screen, 0, client)
def toggle_shade(data): def toggle_shade(data):
"""Toggles the shade status of the window on which the event occured""" """Toggles the shade status of the window on which the event occured"""
@ -136,15 +114,15 @@ def unshade(data):
def change_desktop(data, num): def change_desktop(data, num):
"""Switches to a specified desktop""" """Switches to a specified desktop"""
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen())) root = OBDisplay_screenInfo(data.screen).rootWindow()
send_client_msg(root, OBProperty_net_current_desktop, root, num) send_client_msg(root, OBProperty.net_current_desktop, root, num)
def next_desktop(data, no_wrap=0): def next_desktop(data, no_wrap=0):
"""Switches to the next desktop, optionally (by default) cycling around to """Switches to the next desktop, optionally (by default) cycling around to
the first when going past the last.""" the first when going past the last."""
screen = Openbox_screen(openbox, data.screen()) screen = openbox.screen(data.screen)
d = OBScreen_desktop(screen) d = screen.desktop()
n = OBScreen_numDesktops(screen) n = screen.numDesktops()
if (d < (n-1)): if (d < (n-1)):
d = d + 1 d = d + 1
elif not no_wrap: elif not no_wrap:
@ -154,9 +132,9 @@ def next_desktop(data, no_wrap=0):
def prev_desktop(data, no_wrap=0): def prev_desktop(data, no_wrap=0):
"""Switches to the previous desktop, optionally (by default) cycling around """Switches to the previous desktop, optionally (by default) cycling around
to the last when going past the first.""" to the last when going past the first."""
screen = Openbox_screen(openbox, data.screen()) screen = openbox.screen(data.screen)
d = OBScreen_desktop(screen) d = screen.desktop()
n = OBScreen_numDesktops(screen) n = screen.numDesktops()
if (d > 0): if (d > 0):
d = d - 1 d = d - 1
elif not no_wrap: elif not no_wrap:
@ -165,21 +143,18 @@ def prev_desktop(data, no_wrap=0):
def send_to_desktop(data, num): def send_to_desktop(data, num):
"""Sends a client to a specified desktop""" """Sends a client to a specified desktop"""
root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen())) if not data.client: return
client = Openbox_findClient(openbox, data.window()) send_client_msg(OBDisplay_screenInfo(data.screen).rootWindow(),
if client: OBProperty.net_wm_desktop, data.client.window(), num)
window = OBClient_window(client)
send_client_msg(root, OBProperty_net_wm_desktop, window, num)
def send_to_next_desktop(data, no_wrap=0, follow=1): def send_to_next_desktop(data, no_wrap=0, follow=1):
"""Sends a window to the next desktop, optionally (by default) cycling """Sends a window to the next desktop, optionally (by default) cycling
around to the first when going past the last. Also optionally moving to around to the first when going past the last. Also optionally moving to
the new desktop after sending the window.""" the new desktop after sending the window."""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return screen = openbox.screen(data.screen)
screen = Openbox_screen(openbox, data.screen()) d = screen.desktop()
d = OBScreen_desktop(screen) n = screen.numDesktops()
n = OBScreen_numDesktops(screen)
if (d < (n-1)): if (d < (n-1)):
d = d + 1 d = d + 1
elif not no_wrap: 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 """Sends a window to the previous desktop, optionally (by default) cycling
around to the last when going past the first. Also optionally moving to around to the last when going past the first. Also optionally moving to
the new desktop after sending the window.""" the new desktop after sending the window."""
client = Openbox_findClient(openbox, data.window()) if not data.client: return
if not client: return screen = openbox.screen(data.screen)
screen = Openbox_screen(openbox, data.screen()) d = screen.desktop()
d = OBScreen_desktop(screen) n = screen.numDesktops()
n = OBScreen_numDesktops(screen)
if (d > 0): if (d > 0):
d = d - 1 d = d - 1
elif not no_wrap: 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 """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 use this call instead of a python system call. If the specified screen
is beyond your range of screens, the default is used instead.""" is beyond your range of screens, the default is used instead."""
Openbox_execute(openbox, screen, bin) openbox.execute(screen, bin)
print "Loaded builtins.py" print "Loaded builtins.py"

View file

@ -81,8 +81,8 @@ void OBActions::buttonPressHandler(const XButtonEvent &e)
screen = c->screen(); screen = c->screen();
else else
screen = otk::OBDisplay::findScreen(e.root)->screen(); screen = otk::OBDisplay::findScreen(e.root)->screen();
ButtonData data(screen, c, e.time, state, e.button, w->mcontext(), MouseData data(screen, c, e.time, state, e.button, w->mcontext(),
MousePress); MousePress);
Openbox::instance->bindings()->fireButton(&data); Openbox::instance->bindings()->fireButton(&data);
if (_button) return; // won't count toward CLICK events if (_button) return; // won't count toward CLICK events
@ -124,8 +124,8 @@ void OBActions::buttonReleaseHandler(const XButtonEvent &e)
screen = c->screen(); screen = c->screen();
else else
screen = otk::OBDisplay::findScreen(e.root)->screen(); screen = otk::OBDisplay::findScreen(e.root)->screen();
ButtonData data(screen, c, e.time, state, e.button, w->mcontext(), MouseData data(screen, c, e.time, state, e.button, w->mcontext(),
MouseClick); MouseClick);
Openbox::instance->bindings()->fireButton(&data); Openbox::instance->bindings()->fireButton(&data);
@ -234,9 +234,9 @@ void OBActions::motionHandler(const XMotionEvent &e)
screen = c->screen(); screen = c->screen();
else else
screen = otk::OBDisplay::findScreen(e.root)->screen(); screen = otk::OBDisplay::findScreen(e.root)->screen();
MotionData data(screen, c, e.time, state, button, w->mcontext(), MouseMotion, MouseData data(screen, c, e.time, state, button, w->mcontext(), MouseMotion,
x_root, y_root, _posqueue[0]->pos, _posqueue[0]->clientarea); x_root, y_root, _posqueue[0]->pos, _posqueue[0]->clientarea);
Openbox::instance->bindings()->fireButton((ButtonData*)&data); Openbox::instance->bindings()->fireButton(&data);
} }
void OBActions::mapRequestHandler(const XMapRequestEvent &e) 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(); OBClient *c = Openbox::instance->focusedClient();
KeyData data(screen, c, time, modifiers, key); KeyData data(screen, c, time, modifiers, key);
CallbackList::iterator it, end = p->callbacks.end(); CallbackList::iterator it, end = p->callbacks.end();
printf("Firing key!\n");
for (it = p->callbacks.begin(); it != end; ++it) for (it = p->callbacks.begin(); it != end; ++it)
python_callback(*it, &data); python_callback(*it, &data);
resetChains(this); 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) { if (data->context == MC_Window) {
// these are grabbed in Sync mode to allow the press to be normal to the // 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(); CallbackList::iterator c_it,c_end = (*it)->callbacks[data->action].end();
for (c_it = (*it)->callbacks[data->action].begin(); for (c_it = (*it)->callbacks[data->action].begin();
c_it != c_end; ++c_it) 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 //! Removes all button bindings
void removeAllButtons(); void removeAllButtons();
void fireButton(ButtonData *data); void fireButton(MouseData *data);
//! Bind a callback for an event //! Bind a callback for an event
bool addEvent(EventAction action, PyObject *callback); 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 "python.hh"
#include "bindings.hh" #include "bindings.hh"
#include "otk/display.hh" #include "otk/display.hh"
#include "otk/util.hh"
extern "C" { extern "C" {
// The initializer in openbox_wrap.cc // The initializer in openbox_wrap.cc
@ -24,7 +25,13 @@ void python_init(char *argv0)
Py_Initialize(); Py_Initialize();
init_otk(); init_otk();
init_openbox(); 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("openbox = Openbox_instance()");
PyRun_SimpleString("display = OBDisplay_display()"); PyRun_SimpleString("display = OBDisplay_display()");
@ -143,6 +150,7 @@ PyObject *kbind(PyObject *keylist, ob::KeyContext context, PyObject *func)
vectkeylist.push_back(PyString_AsString(str)); vectkeylist.push_back(PyString_AsString(str));
} }
(void)context; // XXX use this sometime!
if (!ob::Openbox::instance->bindings()->addKey(vectkeylist, func)) { if (!ob::Openbox::instance->bindings()->addKey(vectkeylist, func)) {
PyErr_SetString(PyExc_RuntimeError,"Unable to add binding."); PyErr_SetString(PyExc_RuntimeError,"Unable to add binding.");
return NULL; return NULL;

View file

@ -65,8 +65,7 @@ enum EventAction {
NUM_EVENTS NUM_EVENTS
}; };
// *** MotionData can be (and is) cast ButtonData!! (in actions.cc) *** // class MouseData {
class MotionData {
public: public:
int screen; int screen;
OBClient *client; OBClient *client;
@ -84,10 +83,10 @@ public:
int press_clientwidth; int press_clientwidth;
int press_clientheight; int press_clientheight;
MotionData(int screen, OBClient *client, Time time, unsigned int state, MouseData(int screen, OBClient *client, Time time, unsigned int state,
unsigned int button, MouseContext context, MouseAction action, unsigned int button, MouseContext context, MouseAction action,
int xroot, int yroot, const otk::Point &initpos, int xroot, int yroot, const otk::Point &initpos,
const otk::Rect &initarea) { const otk::Rect &initarea) {
this->screen = screen; this->screen = screen;
this->client = client; this->client = client;
this->time = time; this->time = time;
@ -104,21 +103,8 @@ public:
this->press_clientwidth = initarea.width(); this->press_clientwidth = initarea.width();
this->press_clientheight = initarea.height(); this->press_clientheight = initarea.height();
} }
}; MouseData(int screen, OBClient *client, Time time, unsigned int state,
unsigned int button, MouseContext context, MouseAction action) {
// *** 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) {
this->screen = screen; this->screen = screen;
this->client = client; this->client = client;
this->time = time; this->time = time;
@ -126,6 +112,14 @@ public:
this->button = button; this->button = button;
this->context= context; this->context= context;
this->action = action; 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 * * These are found in openbox.i, not python.cc *
***********************************************/ ***********************************************/
void python_callback(PyObject *func, MotionData *data); void python_callback(PyObject *func, MouseData *data);
void python_callback(PyObject *func, ButtonData *data);
void python_callback(PyObject *func, EventData *data); void python_callback(PyObject *func, EventData *data);
void python_callback(PyObject *func, KeyData *data); void python_callback(PyObject *func, KeyData *data);