X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fscreen.cc;h=98ad67f276dce330ee51925e31571494fa5e8fb8;hb=f32096dcd2c5a4e44763def56c290ce37aa548ba;hp=8597e5953d2df2392a7c4aaea8f510cf866b6835;hpb=6a8f5f44e123c9ade7964e2051dd0d6a9858961c;p=chaz%2Fopenbox diff --git a/util/epist/screen.cc b/util/epist/screen.cc index 8597e595..98ad67f2 100644 --- a/util/epist/screen.cc +++ b/util/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 @@ screen::screen(epist *epist, int number) { _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 @@ void screen::handleKeypress(const XEvent &e) { case Action::changeWorkspace: changeWorkspace(it->number()); return; + + case Action::execute: + execCommand("aterm"); + return; } // these actions require an active window @@ -221,7 +227,7 @@ void screen::handleKeypress(const XEvent &e) { window->lower(); return; - case Action::sendTo: + case Action::sendToWorkspace: window->sendTo(it->number()); return; @@ -349,14 +355,30 @@ void screen::updateActiveWindow() { 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(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(cmd.c_str()), + 0 + }; + // make the command run on the correct screen + if (putenv(const_cast(_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,