]> Dogcows Code - chaz/openbox/commitdiff
exec works now
authorDana Jansens <danakj@orodu.net>
Sat, 20 Jul 2002 16:17:24 +0000 (16:17 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 20 Jul 2002 16:17:24 +0000 (16:17 +0000)
util/epist/epist.cc
util/epist/screen.cc
util/epist/screen.hh

index 231c51f69eca1864a245c0f8d9b6ce17f2c9ba0a..b9dac6a842d6cc7c6aa17bdeddd2bb993d72931d 100644 (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();
 }
 
index db100889fb64e97b1182300f6d424494a16893c2..98ad67f276dce330ee51925e31571494fa5e8fb8 100644 (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,
index 7e2e880dd1e8e98b65adeb9534ad49fc8d080ce4..1f0a387591ab9f44cb4ff849d23ac11ebc3c4a48 100644 (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
This page took 0.030045 seconds and 4 git commands to generate.