exec works now
This commit is contained in:
parent
bf3c87c886
commit
f32096dcd2
3 changed files with 39 additions and 9 deletions
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue