summaryrefslogtreecommitdiff
path: root/util/epist/screen.cc
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-07-20 16:17:24 +0000
committerDana Jansens <danakj@orodu.net>2002-07-20 16:17:24 +0000
commitf32096dcd2c5a4e44763def56c290ce37aa548ba (patch)
tree377dbb09e40ae8fe93b21818573222ba0fd432cb /util/epist/screen.cc
parentbf3c87c886c810097b7de9d5639e0916987b2185 (diff)
exec works now
Diffstat (limited to 'util/epist/screen.cc')
-rw-r--r--util/epist/screen.cc40
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,