diff options
| author | Dana Jansens <danakj@orodu.net> | 2002-07-20 16:17:24 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2002-07-20 16:17:24 +0000 |
| commit | f32096dcd2c5a4e44763def56c290ce37aa548ba (patch) | |
| tree | 377dbb09e40ae8fe93b21818573222ba0fd432cb /util/epist/screen.cc | |
| parent | bf3c87c886c810097b7de9d5639e0916987b2185 (diff) | |
exec works now
Diffstat (limited to 'util/epist/screen.cc')
| -rw-r--r-- | util/epist/screen.cc | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/util/epist/screen.cc b/util/epist/screen.cc index db100889..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 @@ -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<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, |
