#include "display.hh"
#include "screeninfo.hh"
#include "gccache.hh"
+#include "util.hh"
extern "C" {
#include <X11/keysym.h>
# include <stdio.h>
#endif // HAVE_STDIO_H
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif // HAVE_STDLIB_H
-
#ifdef HAVE_SIGNAL_H
# include <signal.h>
#endif // HAVE_SIGNAL_H
// set the DISPLAY environment variable for any lauched children, to the
// display we're using, so they open in the right place.
// XXX rm -> std::string dtmp = "DISPLAY=" + DisplayString(display);
- if (putenv(const_cast<char*>((std::string("DISPLAY=") +
- DisplayString(display)).c_str()))) {
- printf(_("warning: couldn't set environment variable 'DISPLAY'\n"));
- perror("putenv()");
- }
+ putenv(std::string("DISPLAY=") + DisplayString(display));
// find the availability of X extensions we like to use
#ifdef XKB
# include <process.h>
#endif // HAVE_PROCESS_H __EMX__
+#include "gettext.h"
+#define _(str) gettext(str)
+
#include <assert.h>
}
#ifndef __EMX__
if (! fork()) {
setsid();
- int ret = putenv(const_cast<char *>(displaystring.c_str()));
- assert(ret != -1);
- ret = execl("/bin/sh", "/bin/sh", "-c", command.c_str(), NULL);
+ putenv(displaystring);
+ int ret = execl("/bin/sh", "/bin/sh", "-c", command.c_str(), NULL);
exit(ret);
}
#else // __EMX__
return tmp;
}
+void putenv(const std::string &data)
+{
+ char *c = new char[data.size() + 1];
+ std::string::size_type i, max;
+ for (i = 0, max = data.size(); i < max; ++i)
+ c[i] = data[i];
+ c[i] = 0;
+ if (::putenv(c)) {
+ printf(_("warning: couldn't set environment variable\n"));
+ perror("putenv()");
+ }
+}
+
string basename (const string& path) {
string::size_type slash = path.rfind('/');
if (slash == string::npos)
inline std::string itostring(int i)
{ return itostring((long) i); }
+void putenv(const std::string &data);
std::string basename(const std::string& path);
void OBActions::insertPress(const XButtonEvent &e)
{
ButtonPressAction *a = _posqueue[BUTTONS - 1];
- for (int i=BUTTONS-1; i>0;)
- _posqueue[i] = _posqueue[--i];
+ // rm'd the last one, shift them all down one
+ for (int i = BUTTONS-1; i > 0; --i) {
+ _posqueue[i] = _posqueue[i-1];
+ }
_posqueue[0] = a;
a->button = e.button;
a->pos.setPoint(e.x_root, e.y_root);
void OBActions::removePress(const XButtonEvent &e)
{
+ int i;
ButtonPressAction *a = 0;
- for (int i=0; i<BUTTONS; ++i) {
- if (_posqueue[i]->button == e.button)
+ for (i=0; i<BUTTONS-1; ++i)
+ if (_posqueue[i]->button == e.button) {
a = _posqueue[i];
- if (a) // found one and removed it
+ break;
+ }
+ if (a) { // found one, remove it and shift the rest up one
+ for (; i < BUTTONS-1; ++i)
_posqueue[i] = _posqueue[i+1];
- }
- if (a) { // found one
_posqueue[BUTTONS-1] = a;
- a->button = 0;
}
+ _posqueue[BUTTONS-1]->button = 0;
}
void OBActions::buttonPressHandler(const XButtonEvent &e)
{
grabKeys(false);
removeAllKeys();
- removeAllButtons();
+// removeAllButtons(); XXX
removeAllEvents();
}
void OBBindings::removeAllButtons()
{
- for (int i = i; i < NUM_MOUSE_CONTEXT; ++i) {
+ for (int i = 0; i < NUM_MOUSE_CONTEXT; ++i) {
ButtonBindingList::iterator it, end = _buttons[i].end();
for (it = _buttons[i].begin(); it != end; ++it) {
for (int a = 0; a < NUM_MOUSE_ACTION; ++a) {
_focused = false;
// not a transient by default of course
_transient_for = 0;
+ // pick a layer to start from
+ _layer = Layer_Normal;
getArea();
getDesktop();
#include "otk/property.hh"
#include "otk/display.hh"
#include "otk/assassin.hh"
-#include "otk/util.hh" // TEMPORARY
+#include "otk/util.hh"
extern "C" {
#include <X11/cursorfont.h>
if (!_restart_prog.empty()) {
const std::string &dstr =
otk::OBDisplay::screenInfo(first_screen)->displayString();
- putenv(const_cast<char *>(dstr.c_str()));
+ otk::putenv(const_cast<char *>(dstr.c_str()));
execlp(_restart_prog.c_str(), _restart_prog.c_str(), NULL);
perror(_restart_prog.c_str());
}
void Openbox::execute(int screen, const std::string &bin)
{
-#ifdef __EMX__
- // XXX: whats this for? windows?
- spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", bin.c_str(), NULL);
-#else // __EMX__
if (screen >= ScreenCount(otk::OBDisplay::display))
screen = 0;
- const std::string &dstr =
- otk::OBDisplay::screenInfo(screen)->displayString();
-
- if (! fork()) {
- setsid();
- int ret = putenv(const_cast<char *>(dstr.c_str()));
- assert(ret != -1);
- ret = execl("/bin/sh", "/bin/sh", "-c", bin.c_str(), NULL);
- exit(ret);
- }
-#endif // __EMX__
+ otk::bexec(bin, otk::OBDisplay::screenInfo(screen)->displayString());
}
}
void python_init(char *argv0)
{
- std::string path;
-
// start the python engine
- //Py_SetProgramName(argv0);
- //Py_Initialize();
+ Py_SetProgramName(argv0);
+ Py_Initialize();
// initialize the C python module
- //init_openbox();
+ init_openbox();
// include the openbox directories for python scripts in the sys path
-// PyRun_SimpleString("import sys");
-printf("SCRIPTDIR=%s\n", SCRIPTDIR);
-printf("1 getenv(DISPLAY)=%s\n", getenv("DISPLAY"));
- path = "sys.path";
-printf("2 getenv(DISPLAY)=%s\n", getenv("DISPLAY"));
- path = "sys.path.append('";
-printf("3 getenv(DISPLAY)=%s\n", getenv("DISPLAY"));
- path += SCRIPTDIR;
- path += "')";
- PyRun_SimpleString(const_cast<char*>(path.c_str()));
- path = "sys.path.append('";
- path += otk::expandTilde("~/.openbox/python");
- path += "')";
- PyRun_SimpleString(const_cast<char*>(path.c_str()));
+ PyRun_SimpleString("import sys");
+ PyRun_SimpleString("sys.path.append('" SCRIPTDIR "')");
+ PyRun_SimpleString(const_cast<char*>(("sys.path.append('" +
+ otk::expandTilde("~/.openbox/python") +
+ "')").c_str()));
// import the otk and openbox modules into the main namespace
PyRun_SimpleString("from openbox import *;");
// set up convenience global variables