From: Dana Jansens Date: Sat, 20 Jul 2002 16:17:24 +0000 (+0000) Subject: exec works now X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=f32096dcd2c5a4e44763def56c290ce37aa548ba;p=chaz%2Fopenbox exec works now --- diff --git a/util/epist/epist.cc b/util/epist/epist.cc index 231c51f6..b9dac6a8 100644 --- a/util/epist/epist.cc +++ b/util/epist/epist.cc @@ -156,6 +156,10 @@ epist::epist(char **argv, char *dpy_name, char *rc_file) XKeysymToKeycode(getXDisplay(), XStringToKeysym("4")), Mod1Mask | ControlMask | ShiftMask, 3)); + _actions.push_back(Action(Action::execute, + XKeysymToKeycode(getXDisplay(), + XStringToKeysym("F6")), + Mod1Mask)); activateGrabs(); } 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(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, diff --git a/util/epist/screen.hh b/util/epist/screen.hh index 7e2e880d..1f0a3875 100644 --- a/util/epist/screen.hh +++ b/util/epist/screen.hh @@ -28,18 +28,21 @@ extern "C" { } #include +#include #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 @@ public: 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