exec works now

This commit is contained in:
Dana Jansens 2002-07-20 16:17:24 +00:00
parent bf3c87c886
commit f32096dcd2
3 changed files with 39 additions and 9 deletions

View file

@ -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();
}

View file

@ -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,

View file

@ -28,18 +28,21 @@ extern "C" {
}
#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 @@ 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