all repos — openbox @ f32096dcd2c5a4e44763def56c290ce37aa548ba

openbox fork - make it a bit more like ryudo

exec works now
Dana Jansens danakj@orodu.net
commit

f32096dcd2c5a4e44763def56c290ce37aa548ba

parent

bf3c87c886c810097b7de9d5639e0916987b2185

3 files changed, 39 insertions(+), 9 deletions(-)

jump to
M util/epist/epist.ccutil/epist/epist.cc

@@ -156,6 +156,10 @@ _actions.push_back(Action(Action::sendToWorkspace,

XKeysymToKeycode(getXDisplay(), XStringToKeysym("4")), Mod1Mask | ControlMask | ShiftMask, 3)); + _actions.push_back(Action(Action::execute, + XKeysymToKeycode(getXDisplay(), + XStringToKeysym("F6")), + Mod1Mask)); activateGrabs(); }
M util/epist/screen.ccutil/epist/screen.cc

@@ -40,6 +40,7 @@ using std::hex;

using std::dec; using std::string; +#include "../../src/BaseDisplay.hh" #include "../../src/XAtom.hh" #include "screen.hh" #include "epist.hh"

@@ -50,7 +51,8 @@ _epist = epist;

_xatom = _epist->xatom(); _number = number; _active = _clients.end(); - _root = RootWindow(_epist->getXDisplay(), _number); + _info = _epist->getScreenInfo(_number); + _root = _info->getRootWindow(); // find a window manager supporting NETWM, waiting for it to load if we must int count = 20; // try for 20 seconds

@@ -198,6 +200,10 @@

case Action::changeWorkspace: changeWorkspace(it->number()); return; + + case Action::execute: + execCommand("aterm"); + return; } // these actions require an active window

@@ -349,14 +355,30 @@ if (_active == _clients.end()) cout << "None\n";

else cout << "0x" << hex << (*_active)->window() << dec << endl; } -/* - * use this when execing a command to have it on the right screen - string dtmp = (string)"DISPLAY=" + display_name; - if (putenv(const_cast<char*>(dtmp.c_str()))) { - cout << "warning: couldn't set environment variable 'DISPLAY'\n"; - perror("putenv()"); - } - */ + +void screen::execCommand(const std::string &cmd) const { + pid_t pid; + if ((pid = fork()) == 0) { + extern char **environ; + + char *const argv[] = { + "sh", + "-c", + const_cast<char *>(cmd.c_str()), + 0 + }; + // make the command run on the correct screen + if (putenv(const_cast<char*>(_info->displayString().c_str()))) { + cout << "warning: couldn't set environment variable 'DISPLAY'\n"; + perror("putenv()"); + } + execve("/bin/sh", argv, environ); + exit(127); + } else if (pid == -1) { + cout << _epist->getApplicationName() << + ": Could not fork a process for executing a command\n"; + } +} void screen::cycleWindow(const bool forward, const bool alldesktops,
M util/epist/screen.hhutil/epist/screen.hh

@@ -28,18 +28,21 @@ #include "X11/Xlib.h"

} #include <vector> +#include <string> #include "window.hh" class epist; class screen; class XAtom; +class ScreenInfo; class screen { epist *_epist; XAtom *_xatom; int _number; Window _root; + const ScreenInfo *_info; std::string _wm_name;

@@ -75,6 +78,7 @@ const bool sameclass = false) const;

void cycleWorkspace(const bool forward, const bool loop = true) const; void changeWorkspace(const int num) const; void toggleShaded(const Window win) const; + void execCommand(const std::string &cmd) const; }; #endif // __screen_hh