]> Dogcows Code - chaz/openbox/commitdiff
load config options from the python environment
authorDana Jansens <danakj@orodu.net>
Tue, 31 Dec 2002 19:15:24 +0000 (19:15 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 31 Dec 2002 19:15:24 +0000 (19:15 +0000)
14 files changed:
scripts/Makefile.am
scripts/config.py [new file with mode: 0644]
scripts/globals.py
src/bindings.cc
src/bindings.hh
src/frame.cc
src/frame.hh
src/openbox.cc
src/openbox.hh
src/openbox_wrap.cc
src/python.cc
src/python.hh
src/screen.cc
src/screen.hh

index 5b55ecaeb07f3e3e338c1b27337cb968fe8e1075..303ab3273cee14e27688600f2fc80c2cd89bc956 100644 (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:
diff --git a/scripts/config.py b/scripts/config.py
new file mode 100644 (file)
index 0000000..c3c4375
--- /dev/null
@@ -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"
index 0a3389ecb9fe8d3c91c77a7795029f45d3b3ea92..450ee8b7dc62faab980eeba63ada871520fc7da1 100644 (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"
index ef14d585638f918e3e251b0301abb6448f3317fb..42a92591724249b2779f9ec2f931a2b4b384bf1b 100644 (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);
+}
+
 }
index dde799491dd72e894830b8b9bd01036da98cf9b5..0ae035761437ba5890860684d351e80ce4d6aedc 100644 (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();
index 4f466b46d26edbaf053bfc0cae138102cc36e701..072edc70bf695aff52b9335186257ab807162922 100644 (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);
index ab1e1b0347eb5c82e4a90fa42cfbc5bc453e76fb..7313c3a12dfe8013b03fcb8cf3005f12b5f1ade4 100644 (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
   /*!
index 474ba0290b9f44820d4f7fbbbb3301f06ff8a7cd..01316d795c276762d6c6c23b1e698eb2196db16a 100644 (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);
+}
+
 }
 
index d64068f14a9f88dec74d09087140fd0c20c40246..b5956e46e86e0b3846114a3518f9ea9dd51b6cf9 100644 (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);
 };
 
 }
index 8539963cd1698238053db97d847397c40f51e394..587e1abbc48228a52968483179f4653c4320e4c9 100644 (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
 };
index dbe35f5d0f3a0159cdc0f14da9c28fef5dffd01e..ddd10d0f29acd098d11533a2f7514b538a5c253b 100644 (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 ||
index a654152b4367a2035505d17fe4939fbf3aaa9453..7566f817bdea3862480966a753d573e700884a8c 100644 (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
index 61869a17a427c212e751947401d5b151b4de7cf9..80b9083d6992d5e2db1c2551272a2e68cdd21886 100644 (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;
index 37f22d88a067eb59c97c83b8823e16358bcc1a25..14e81111a427e6fe6fe3e3fe8597a13279da7b83 100644 (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
This page took 0.04446 seconds and 4 git commands to generate.