load config options from the python environment

This commit is contained in:
Dana Jansens 2002-12-31 19:15:24 +00:00
parent 1161a90a70
commit 745e840547
14 changed files with 274 additions and 147 deletions

View file

@ -1,6 +1,6 @@
scriptdir = $(libdir)/openbox/python
MAINTAINERCLEANFILES = Makefile.in
script_DATA = clientmotion.py clicks.py globals.py
script_DATA = clientmotion.py clicks.py globals.py config.py
EXTRA_DIST = $(script_DATA)
distclean-local:

34
scripts/config.py Normal file
View file

@ -0,0 +1,34 @@
#############################################################################
### Options that can be defined on startup that affect the behavior of ###
### openbox. ###
#############################################################################
# client_buttons - a list of the modifier(s) and buttons which are grabbed on
# client windows (for interactive move/resize, etc).
# examples: "A-2", "C-A-2", "W-1"
client_buttons = ["A-1", "A-2", "A-3"]
# theme - the theme used to decorate everything.
theme = "/usr/local/share/openbox/styles/nyz"
#############################################################################
### Options that can be modified by the user to change the default hooks' ###
### behaviors. ###
#############################################################################
# click_focus - '1' if clicking in a client will cause it to focus in the
# default hook functions; else '0'.
click_focus = 0
# click_raise - '1' if clicking in a client will cause it to raise to the
# top of its stacking layer; else '0'.
click_raise = 0
# enter_focus - '1' if entering a client window will cause it to focus in the
# default hook functions; else '0'.
enter_focus = 1
# leave_unfocus - '1' if leaving a client window will cause it to unfocus in
# the default hook functions; else '0'.
leave_unfocus = 1
print "Loaded config.py"

View file

@ -1,35 +1,3 @@
#############################################################################
### Options that can be defined on startup that affect the behavior of ###
### openbox. ###
#############################################################################
# client_buttons - a list of the modifier(s) and buttons which are grabbed on
# client windows (for interactive move/resize, etc)
# examples: "A-2", "C-A-2", "W-1"
client_buttons = ["A-1", "A-2", "A-3"]
#############################################################################
### Options that can be modified by the user to change the default hooks' ###
### behaviors. ###
#############################################################################
# click_focus - true if clicking in a client will cause it to focus in the
# default hook functions
click_focus = 0
# click_raise - true if clicking in a client will cause it to raise to the
# top of its stacking layer
click_raise = 0
# enter_focus - true if entering a client window will cause it to focus in the
# default hook functions
enter_focus = 1
# leave_unfocus - true if leaving a client window will cause it to unfocus in
# the default hook functions
leave_unfocus = 1
#############################################################################
### Variables defined for other scripts to use. ###
#############################################################################
@ -37,11 +5,10 @@ leave_unfocus = 1
# openbox - pointer to the current Openbox instance
openbox = Openbox_instance()
# screen - list of all screens in the current openbox instance
screen = []
# screens - list of all screens in the current openbox instance
screens = []
for i in range(Openbox_screenCount(openbox)):
screen.append(Openbox_screen(openbox, i))
screens.append(Openbox_screen(openbox, i))
print "Loaded globals.py"

View file

@ -134,8 +134,13 @@ BindingTree *OBBindings::buildtree(const StringVect &keylist, int id) const
OBBindings::OBBindings()
: _curpos(&_tree), _resetkey(0,0)
: _curpos(&_tree),
_resetkey(0,0),
_timer(Openbox::instance->timerManager(),
(otk::OBTimeoutHandler)reset, this)
{
_timer.setTimeout(5000); // chains reset after 5 seconds
setResetKey("C-g"); // set the default reset key
}
@ -299,10 +304,11 @@ void OBBindings::grabKeys(bool grab)
BindingTree *p = _curpos->first_child;
while (p) {
if (grab)
if (grab) {
otk::OBDisplay::grabKey(p->binding.key, p->binding.modifiers,
root, false, GrabModeAsync, GrabModeAsync,
false);
}
else
otk::OBDisplay::ungrabKey(p->binding.key, p->binding.modifiers,
root);
@ -324,22 +330,19 @@ void OBBindings::fire(Window window, unsigned int modifiers, unsigned int key,
Time time)
{
if (key == _resetkey.key && modifiers == _resetkey.modifiers) {
grabKeys(false);
_curpos = &_tree;
grabKeys(true);
reset(this);
} else {
BindingTree *p = _curpos->first_child;
while (p) {
if (p->binding.key == key && p->binding.modifiers == modifiers) {
if (p->chain) {
_timer.start(); // start/restart the timer
grabKeys(false);
_curpos = p;
grabKeys(true);
} else {
python_callback_binding(p->id, window, modifiers, key, time);
grabKeys(false);
_curpos = &_tree;
grabKeys(true);
reset(this);
}
break;
}
@ -348,4 +351,12 @@ void OBBindings::fire(Window window, unsigned int modifiers, unsigned int key,
}
}
void OBBindings::reset(OBBindings *self)
{
self->_timer.stop();
self->grabKeys(false);
self->_curpos = &self->_tree;
self->grabKeys(true);
}
}

View file

@ -7,6 +7,7 @@
*/
#include "actions.hh"
#include "otk/timer.hh"
#include <string>
#include <vector>
@ -53,12 +54,16 @@ private:
BindingTree *_curpos; // position in the keytree
Binding _resetkey; // the key which resets the key chain status
otk::OBTimer _timer;
int find(BindingTree *search) const;
bool translate(const std::string &str, Binding &b) const;
BindingTree *buildtree(const StringVect &keylist, int id) const;
void assimilate(BindingTree *node);
static void reset(OBBindings *self);
public:
//! Initializes an OBBinding object
OBBindings();

View file

@ -56,15 +56,51 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)
_plate.show(); // the other stuff is shown based on decor settings
grabClient();
grabButtons(true);
}
OBFrame::~OBFrame()
{
grabButtons(false);
releaseClient(false);
}
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 {
}
// 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 {
}
}
void OBFrame::setTitle(const std::string &text)
{
_label.setText(text);

View file

@ -80,6 +80,9 @@ private:
//! Shape the frame window to the client window
void adjustShape();
//! Grabs or ungrabs buttons on the frame
void grabButtons(bool grab);
public:
//! Constructs an OBFrame object, and reparents the client to itself
/*!

View file

@ -10,6 +10,7 @@
#include "screen.hh"
#include "actions.hh"
#include "bindings.hh"
#include "python.hh"
#include "otk/property.hh"
#include "otk/display.hh"
#include "otk/assassin.hh"
@ -43,13 +44,6 @@ extern "C" {
# include <sys/select.h>
#endif // HAVE_SYS_SELECT_H
#include <Python.h>
// The initializer in openbox_wrap.cc
extern void init_openbox(void);
// The initializer in otk_wrap.cc
extern void init_otk(void);
#include "gettext.h"
#define _(str) gettext(str)
}
@ -83,17 +77,6 @@ void Openbox::signalHandler(int signal)
}
static void runPython(const char *s) {
FILE *rcpyfd = fopen(s, "r");
if (!rcpyfd) {
printf("failed to load python file %s\n", s);
} else {
PyRun_SimpleFile(rcpyfd, const_cast<char*>(s));
fclose(rcpyfd);
}
}
Openbox::Openbox(int argc, char **argv)
: otk::OtkEventDispatcher(),
otk::OtkEventHandler()
@ -114,20 +97,6 @@ Openbox::Openbox(int argc, char **argv)
parseCommandLine(argc, argv);
// TEMPORARY: using the xrdb rc3
_config.setFile(_rcfilepath);
if (!_config.load()) {
printf("failed to load rc file %s\n", _config.file().c_str());
::exit(2);
}
std::string s;
_config.getValue("session.styleFile", s);
_config.setFile(s);
if (!_config.load()) {
printf("failed to load style %s\n", _config.file().c_str());
::exit(2);
}
// open the X display (and gets some info about it, and its screens)
otk::OBDisplay::initialize(_displayreq);
assert(otk::OBDisplay::display);
@ -159,9 +128,13 @@ Openbox::Openbox(int argc, char **argv)
_cursors.ul_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ul_angle);
_cursors.ur_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ur_angle);
// start up python and load config values
python_init(argv[0]);
python_exec(SCRIPTDIR"/config.py"); // load openbox config values
// initialize all the screens
OBScreen *screen;
screen = new OBScreen(0, _config);
screen = new OBScreen(0);
if (screen->managed()) {
_screens.push_back(screen);
// XXX: "change to" the first workspace on the screen to initialize stuff
@ -173,21 +146,16 @@ Openbox::Openbox(int argc, char **argv)
::exit(1);
}
// start up python and run the user's startup script
Py_SetProgramName(argv[0]);
Py_Initialize();
init_otk();
init_openbox();
PyRun_SimpleString("from _otk import *; from _openbox import *;");
runPython(SCRIPTDIR"/globals.py"); // create/set global vars
runPython(SCRIPTDIR"/clientmotion.py"); // moving and resizing clients
runPython(SCRIPTDIR"/clicks.py"); // titlebar/root clicks and dblclicks
runPython(_scriptfilepath.c_str());
// run all of the python scripts, including the user's
python_exec(SCRIPTDIR"/globals.py"); // create/set global vars
python_exec(SCRIPTDIR"/clientmotion.py"); // moving and resizing clients
python_exec(SCRIPTDIR"/clicks.py"); // titlebar/root clicks and dblclicks
python_exec(_scriptfilepath.c_str());
ScreenList::iterator it, end = _screens.end();
for (it = _screens.begin(); it != end; ++it)
for (it = _screens.begin(); it != end; ++it) {
(*it)->manageExisting();
}
// grab any keys set up before the screens existed
_bindings->grabKeys(true);
@ -357,5 +325,10 @@ void Openbox::setFocusedClient(OBClient *c)
}
}
bool Openbox::getConfigString(const char *name, std::string *value) {
return python_get_string(name, value);
}
}

View file

@ -137,9 +137,6 @@ private:
//! When set to true, the Openbox::eventLoop function will stop and return
bool _doshutdown;
//! The configuration of the application. TEMPORARY
otk::Configuration _config;
//! The client with input focus
/*!
Updated by the clients themselves.
@ -244,6 +241,8 @@ public:
manager can be destroyed.
*/
inline void shutdown() { _doshutdown = true; }
bool getConfigString(const char *name, std::string *value);
};
}

View file

@ -656,20 +656,20 @@ SWIG_InstallConstants(PyObject *d, swig_const_info constants[]) {
#define SWIGTYPE_p_otk__Strut swig_types[8]
#define SWIGTYPE_p_XShapeEvent swig_types[9]
#define SWIGTYPE_p_XConfigureRequestEvent swig_types[10]
#define SWIGTYPE_p_otk__OtkEventHandler swig_types[11]
#define SWIGTYPE_p_otk__Rect swig_types[12]
#define SWIGTYPE_p_ob__OBWidget swig_types[13]
#define SWIGTYPE_p_XFocusChangeEvent swig_types[14]
#define SWIGTYPE_p_XClientMessageEvent swig_types[15]
#define SWIGTYPE_p_otk__OBProperty swig_types[16]
#define SWIGTYPE_p_otk__OtkEventDispatcher swig_types[17]
#define SWIGTYPE_p_XPropertyEvent swig_types[18]
#define SWIGTYPE_p_XDestroyWindowEvent swig_types[19]
#define SWIGTYPE_p_otk__BImageControl swig_types[20]
#define SWIGTYPE_p_PyObject swig_types[21]
#define SWIGTYPE_p_ob__OBBindings swig_types[22]
#define SWIGTYPE_p_ob__MwmHints swig_types[23]
#define SWIGTYPE_p_otk__Configuration swig_types[24]
#define SWIGTYPE_p_std__string swig_types[11]
#define SWIGTYPE_p_otk__OtkEventHandler swig_types[12]
#define SWIGTYPE_p_otk__Rect swig_types[13]
#define SWIGTYPE_p_ob__OBWidget swig_types[14]
#define SWIGTYPE_p_XFocusChangeEvent swig_types[15]
#define SWIGTYPE_p_XClientMessageEvent swig_types[16]
#define SWIGTYPE_p_otk__OBProperty swig_types[17]
#define SWIGTYPE_p_otk__OtkEventDispatcher swig_types[18]
#define SWIGTYPE_p_XPropertyEvent swig_types[19]
#define SWIGTYPE_p_XDestroyWindowEvent swig_types[20]
#define SWIGTYPE_p_otk__BImageControl swig_types[21]
#define SWIGTYPE_p_PyObject swig_types[22]
#define SWIGTYPE_p_ob__OBBindings swig_types[23]
#define SWIGTYPE_p_ob__MwmHints swig_types[24]
#define SWIGTYPE_p_XUnmapEvent swig_types[25]
static swig_type_info *swig_types[27];
@ -1319,6 +1319,27 @@ static PyObject *_wrap_Openbox_shutdown(PyObject *self, PyObject *args) {
}
static PyObject *_wrap_Openbox_getConfigString(PyObject *self, PyObject *args) {
PyObject *resultobj;
ob::Openbox *arg1 = (ob::Openbox *) 0 ;
char *arg2 ;
std::string *arg3 = (std::string *) 0 ;
bool result;
PyObject * obj0 = 0 ;
PyObject * obj2 = 0 ;
if(!PyArg_ParseTuple(args,(char *)"OsO:Openbox_getConfigString",&obj0,&arg2,&obj2)) goto fail;
if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__Openbox,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
if ((SWIG_ConvertPtr(obj2,(void **) &arg3, SWIGTYPE_p_std__string,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
result = (bool)(arg1)->getConfigString((char const *)arg2,arg3);
resultobj = PyInt_FromLong((long)result);
return resultobj;
fail:
return NULL;
}
static PyObject * Openbox_swigregister(PyObject *self, PyObject *args) {
PyObject *obj;
if (!PyArg_ParseTuple(args,(char*)"O", &obj)) return NULL;
@ -1487,28 +1508,6 @@ static PyObject *_wrap_OBScreen_removeStrut(PyObject *self, PyObject *args) {
}
static PyObject *_wrap_OBScreen_loadStyle(PyObject *self, PyObject *args) {
PyObject *resultobj;
ob::OBScreen *arg1 = (ob::OBScreen *) 0 ;
otk::Configuration *arg2 = 0 ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
if(!PyArg_ParseTuple(args,(char *)"OO:OBScreen_loadStyle",&obj0,&obj1)) goto fail;
if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__OBScreen,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
if ((SWIG_ConvertPtr(obj1,(void **) &arg2, SWIGTYPE_p_otk__Configuration,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
if (arg2 == NULL) {
PyErr_SetString(PyExc_TypeError,"null reference"); SWIG_fail;
}
(arg1)->loadStyle((otk::Configuration const &)*arg2);
Py_INCREF(Py_None); resultobj = Py_None;
return resultobj;
fail:
return NULL;
}
static PyObject *_wrap_OBScreen_manageExisting(PyObject *self, PyObject *args) {
PyObject *resultobj;
ob::OBScreen *arg1 = (ob::OBScreen *) 0 ;
@ -2501,6 +2500,53 @@ static PyObject * OBClient_swigregister(PyObject *self, PyObject *args) {
Py_INCREF(obj);
return Py_BuildValue((char *)"");
}
static PyObject *_wrap_python_init(PyObject *self, PyObject *args) {
PyObject *resultobj;
char *arg1 ;
if(!PyArg_ParseTuple(args,(char *)"s:python_init",&arg1)) goto fail;
ob::python_init(arg1);
Py_INCREF(Py_None); resultobj = Py_None;
return resultobj;
fail:
return NULL;
}
static PyObject *_wrap_python_exec(PyObject *self, PyObject *args) {
PyObject *resultobj;
char *arg1 ;
bool result;
if(!PyArg_ParseTuple(args,(char *)"s:python_exec",&arg1)) goto fail;
result = (bool)ob::python_exec((char const *)arg1);
resultobj = PyInt_FromLong((long)result);
return resultobj;
fail:
return NULL;
}
static PyObject *_wrap_python_get_string(PyObject *self, PyObject *args) {
PyObject *resultobj;
char *arg1 ;
std::string *arg2 = (std::string *) 0 ;
bool result;
PyObject * obj1 = 0 ;
if(!PyArg_ParseTuple(args,(char *)"sO:python_get_string",&arg1,&obj1)) goto fail;
if ((SWIG_ConvertPtr(obj1,(void **) &arg2, SWIGTYPE_p_std__string,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
result = (bool)ob::python_get_string((char const *)arg1,arg2);
resultobj = PyInt_FromLong((long)result);
return resultobj;
fail:
return NULL;
}
static PyObject *_wrap_register(PyObject *self, PyObject *args) {
PyObject *resultobj;
int arg1 ;
@ -2703,6 +2749,7 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"Openbox_setFocusedClient", _wrap_Openbox_setFocusedClient, METH_VARARGS },
{ (char *)"Openbox_focusedScreen", _wrap_Openbox_focusedScreen, METH_VARARGS },
{ (char *)"Openbox_shutdown", _wrap_Openbox_shutdown, METH_VARARGS },
{ (char *)"Openbox_getConfigString", _wrap_Openbox_getConfigString, METH_VARARGS },
{ (char *)"Openbox_swigregister", Openbox_swigregister, METH_VARARGS },
{ (char *)"OBScreen_client", _wrap_OBScreen_client, METH_VARARGS },
{ (char *)"OBScreen_clientCount", _wrap_OBScreen_clientCount, METH_VARARGS },
@ -2713,7 +2760,6 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"OBScreen_focuswindow", _wrap_OBScreen_focuswindow, METH_VARARGS },
{ (char *)"OBScreen_addStrut", _wrap_OBScreen_addStrut, METH_VARARGS },
{ (char *)"OBScreen_removeStrut", _wrap_OBScreen_removeStrut, METH_VARARGS },
{ (char *)"OBScreen_loadStyle", _wrap_OBScreen_loadStyle, METH_VARARGS },
{ (char *)"OBScreen_manageExisting", _wrap_OBScreen_manageExisting, METH_VARARGS },
{ (char *)"OBScreen_manageWindow", _wrap_OBScreen_manageWindow, METH_VARARGS },
{ (char *)"OBScreen_unmanageWindow", _wrap_OBScreen_unmanageWindow, METH_VARARGS },
@ -2769,6 +2815,9 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"OBClient_destroyHandler", _wrap_OBClient_destroyHandler, METH_VARARGS },
{ (char *)"OBClient_reparentHandler", _wrap_OBClient_reparentHandler, METH_VARARGS },
{ (char *)"OBClient_swigregister", OBClient_swigregister, METH_VARARGS },
{ (char *)"python_init", _wrap_python_init, METH_VARARGS },
{ (char *)"python_exec", _wrap_python_exec, METH_VARARGS },
{ (char *)"python_get_string", _wrap_python_get_string, METH_VARARGS },
{ (char *)"register", _wrap_register, METH_VARARGS },
{ (char *)"preregister", _wrap_preregister, METH_VARARGS },
{ (char *)"unregister", _wrap_unregister, METH_VARARGS },
@ -2807,6 +2856,7 @@ static swig_type_info _swigt__p_ob__Openbox[] = {{"_p_ob__Openbox", 0, "ob::Open
static swig_type_info _swigt__p_otk__Strut[] = {{"_p_otk__Strut", 0, "otk::Strut *", 0},{"_p_otk__Strut"},{0}};
static swig_type_info _swigt__p_XShapeEvent[] = {{"_p_XShapeEvent", 0, "XShapeEvent *", 0},{"_p_XShapeEvent"},{0}};
static swig_type_info _swigt__p_XConfigureRequestEvent[] = {{"_p_XConfigureRequestEvent", 0, "XConfigureRequestEvent *", 0},{"_p_XConfigureRequestEvent"},{0}};
static swig_type_info _swigt__p_std__string[] = {{"_p_std__string", 0, "std::string *", 0},{"_p_std__string"},{0}};
static swig_type_info _swigt__p_otk__OtkEventHandler[] = {{"_p_otk__OtkEventHandler", 0, "otk::OtkEventHandler *", 0},{"_p_otk__OtkEventHandler"},{"_p_ob__Openbox", _p_ob__OpenboxTo_p_otk__OtkEventHandler},{"_p_ob__OBClient", _p_ob__OBClientTo_p_otk__OtkEventHandler},{0}};
static swig_type_info _swigt__p_otk__Rect[] = {{"_p_otk__Rect", 0, "otk::Rect *", 0},{"_p_otk__Rect"},{0}};
static swig_type_info _swigt__p_ob__OBWidget[] = {{"_p_ob__OBWidget", 0, "ob::OBWidget *", 0},{"_p_ob__OBWidget"},{"_p_ob__OBClient", _p_ob__OBClientTo_p_ob__OBWidget},{0}};
@ -2820,7 +2870,6 @@ static swig_type_info _swigt__p_otk__BImageControl[] = {{"_p_otk__BImageControl"
static swig_type_info _swigt__p_PyObject[] = {{"_p_PyObject", 0, "PyObject *", 0},{"_p_PyObject"},{0}};
static swig_type_info _swigt__p_ob__OBBindings[] = {{"_p_ob__OBBindings", 0, "ob::OBBindings *", 0},{"_p_ob__OBBindings"},{0}};
static swig_type_info _swigt__p_ob__MwmHints[] = {{"_p_ob__MwmHints", 0, "ob::MwmHints *", 0},{"_p_ob__MwmHints"},{0}};
static swig_type_info _swigt__p_otk__Configuration[] = {{"_p_otk__Configuration", 0, "otk::Configuration *", 0},{"_p_otk__Configuration"},{0}};
static swig_type_info _swigt__p_XUnmapEvent[] = {{"_p_XUnmapEvent", 0, "XUnmapEvent *", 0},{"_p_XUnmapEvent"},{0}};
static swig_type_info *swig_types_initial[] = {
@ -2835,6 +2884,7 @@ _swigt__p_ob__Openbox,
_swigt__p_otk__Strut,
_swigt__p_XShapeEvent,
_swigt__p_XConfigureRequestEvent,
_swigt__p_std__string,
_swigt__p_otk__OtkEventHandler,
_swigt__p_otk__Rect,
_swigt__p_ob__OBWidget,
@ -2848,7 +2898,6 @@ _swigt__p_otk__BImageControl,
_swigt__p_PyObject,
_swigt__p_ob__OBBindings,
_swigt__p_ob__MwmHints,
_swigt__p_otk__Configuration,
_swigt__p_XUnmapEvent,
0
};

View file

@ -7,6 +7,15 @@
#include <vector>
#include <algorithm>
extern "C" {
#include <Python.h>
// The initializer in openbox_wrap.cc
extern void init_openbox(void);
// The initializer in otk_wrap.cc
extern void init_otk(void);
}
namespace ob {
typedef std::vector<PyObject*> FunctionList;
@ -14,6 +23,42 @@ typedef std::vector<PyObject*> FunctionList;
static FunctionList callbacks[OBActions::NUM_ACTIONS];
static FunctionList bindfuncs;
static PyObject *obdict;
void python_init(char *argv0)
{
Py_SetProgramName(argv0);
Py_Initialize();
init_otk();
init_openbox();
PyRun_SimpleString("from _otk import *; from _openbox import *;");
// set up access to the python global variables
PyObject *obmodule = PyImport_AddModule("__main__");
obdict = PyModule_GetDict(obmodule);
}
bool python_exec(const char *file) {
FILE *rcpyfd = fopen(file, "r");
if (!rcpyfd) {
printf("failed to load python file %s\n", file);
return false;
}
PyRun_SimpleFile(rcpyfd, const_cast<char*>(file));
fclose(rcpyfd);
return true;
}
bool python_get_string(const char *name, std::string *value)
{
PyObject *val = PyDict_GetItemString(obdict, const_cast<char*>(name));
if (!val) return false;
*value = PyString_AsString(val);
return true;
}
bool python_register(int action, PyObject *callback)
{
if (action < 0 || action >= OBActions::NUM_ACTIONS ||

View file

@ -14,8 +14,14 @@ extern "C" {
#include <Python.h>
}
#include <string>
namespace ob {
void python_init(char *argv0);
bool python_exec(const char *file);
bool python_get_string(const char *name, std::string *value);
//! Add a python callback funtion to the back of the hook list
/*!
Registering functions for KeyPress events is pointless. Use python_bind

View file

@ -37,7 +37,7 @@ static int anotherWMRunning(Display *display, XErrorEvent *) {
namespace ob {
OBScreen::OBScreen(int screen, const otk::Configuration &config)
OBScreen::OBScreen(int screen)
: _number(screen),
_root(screen)
{
@ -74,8 +74,18 @@ OBScreen::OBScreen(int screen, const otk::Configuration &config)
// initialize the screen's style
_style.setImageControl(_image_control);
_style.load(config);
std::string stylepath;
Openbox::instance->getConfigString("theme", &stylepath);
otk::Configuration sconfig(false);
sconfig.setFile(otk::expandTilde(stylepath));
if (!sconfig.load()) {
sconfig.setFile(otk::expandTilde(DEFAULTSTYLE));
if (!sconfig.load()) {
printf(_("Unable to load default style: %s. Aborting.\n"), DEFAULTSTYLE);
::exit(1);
}
}
_style.load(sconfig);
// Set the netwm atoms for geomtery and viewport
unsigned long geometry[] = { _info->width(),
@ -323,14 +333,6 @@ void OBScreen::setWorkArea() {
}
void OBScreen::loadStyle(const otk::Configuration &config)
{
_style.load(config);
// XXX: make stuff redraw!
}
void OBScreen::manageWindow(Window window)
{
OBClient *client = 0;

View file

@ -100,7 +100,7 @@ private:
public:
#ifndef SWIG
//! Constructs a new OBScreen object
OBScreen(int screen, const otk::Configuration &config);
OBScreen(int screen);
//! Destroys the OBScreen object
virtual ~OBScreen();
#endif
@ -125,9 +125,6 @@ public:
//! Removes a window's strut from the screen's list of reserved spaces
void removeStrut(otk::Strut *strut);
//! Loads a new style on the screen
void loadStyle(const otk::Configuration &config);
//! Manage any pre-existing windows on the screen
void manageExisting();
//! Manage a client window