]> Dogcows Code - chaz/openbox/blobdiff - util/epist/screen.cc
make epist compile with the new code base
[chaz/openbox] / util / epist / screen.cc
index 982c2173b54c01f6c5405196e912d077e9fa6a58..25f16193e95e1fe6b522fe1b5bbdcf4b58cd287a 100644 (file)
@@ -57,8 +57,8 @@ using std::hex;
 using std::dec;
 using std::string;
 
-#include "../../src/BaseDisplay.hh"
-#include "../../src/XAtom.hh"
+#include "../../src/basedisplay.hh"
+#include "../../src/xatom.hh"
 #include "screen.hh"
 #include "epist.hh"
 #include "config.hh"
@@ -66,7 +66,7 @@ using std::string;
 screen::screen(epist *epist, int number) 
   : _clients(epist->clientsList()), _active(epist->activeWindow()),
     _config(epist->getConfig()), _grabbed(true), _cycling(false),
-    _stacked_cycling(false)
+    _stacked_cycling(false), _stacked_raise(false)
 {
   _epist = epist;
   _xatom = _epist->xatom();
@@ -76,6 +76,8 @@ screen::screen(epist *epist, int number)
   _root = _info->getRootWindow();
 
   _config->getValue(Config::stackedCycling, _stacked_cycling);
+  if (_stacked_cycling)
+    _config->getValue(Config::stackedCyclingRaise, _stacked_raise);
 
   // find a window manager supporting NETWM, waiting for it to load if we must
   int count = 20;  // try for 20 seconds
@@ -149,7 +151,9 @@ void screen::processEvent(const XEvent &e) {
                                  DestroyNotify, &ev) ||
           XCheckTypedWindowEvent(_epist->getXDisplay(), e.xany.window,
                                  UnmapNotify, &ev)) {
-        processEvent(ev);
+
+        XWindow *win = _epist->findWindow(e.xany.window);
+        if (win) win->processEvent(ev);
       }
 
       updateClientList();
@@ -384,15 +388,19 @@ void screen::handleKeyrelease(const XEvent &) {
   // the only keyrelease event we care about (for now) is when we do stacked
   // cycling and the modifier is released
   if (_stacked_cycling && _cycling && nothingIsPressed()) {
-    XWindow *w = *_active;
-
     // all modifiers have been released. ungrab the keyboard, move the
     // focused window to the top of the Z-order and raise it
     ungrabModifiers();
 
-    _clients.remove(w);
-    _clients.push_front(w);
-    w->raise();
+    if (_active != _clients.end()) {
+      XWindow *w = *_active;
+      bool e = _last_active == _active;
+      _clients.remove(w);
+      _clients.push_front(w);
+      _active = _clients.begin();
+      if (e) _last_active = _active;
+      w->raise();
+    }
 
     _cycling = false;
   }
@@ -468,14 +476,9 @@ void screen::updateClientList() {
     if (it == end) {  // didn't already exist
       if (doAddWindow(rootclients[i])) {
 //        cout << "Added window: 0x" << hex << rootclients[i] << dec << endl;
-        if (_stacked_cycling) {
-          // insert new clients after the active window
-          _clients.insert(insert_point, new XWindow(_epist, this,
-                                                    rootclients[i]));
-        } else {
-          // insert new clients at the front of the list
-          _clients.push_front(new XWindow(_epist, this, rootclients[i]));
-        }
+        // insert new clients after the active window
+        _clients.insert(insert_point, new XWindow(_epist, this,
+                                                  rootclients[i]));
       }
     }
   }
@@ -516,7 +519,9 @@ const XWindow *screen::lastActiveWindow() const {
   WindowList::const_iterator it, end = _clients.end();
   for (it = _clients.begin(); it != end; ++it)
     if ((*it)->getScreen() == this && ! (*it)->iconic() &&
-        ((*it)->desktop() == 0xffffffff || (*it)->desktop() == _active_desktop))
+        (*it)->canFocus() &&
+        ((*it)->desktop() == 0xffffffff ||
+         (*it)->desktop() == _active_desktop))
       return *it;
 
   // no windows on this screen
@@ -541,17 +546,20 @@ void screen::updateActiveWindow() {
 
   _active = it;
 
-  /* if we're not cycling and a window gets focus, add it to the top of the
-   * cycle stack.
-   */
-  if (_stacked_cycling && !_cycling) {
-    _clients.remove(*_active);
-    _clients.push_front(*_active);
+  if (_active != end) {
+    /* if we're not cycling and a window gets focus, add it to the top of the
+     * cycle stack.
+     */
+    if (_stacked_cycling && !_cycling) {
+      XWindow *win = *_active;
+      _clients.remove(win);
+      _clients.push_front(win);
+      _active = _clients.begin();
+
+      _last_active = _active;
+    }
   }
 
-  if (it != end)
-    _last_active = it;
-
   /*  cout << "Active window is now: ";
       if (_active == _clients.end()) cout << "None\n";
       else cout << "0x" << hex << (*_active)->window() << dec << endl;
@@ -562,6 +570,12 @@ void screen::updateActiveWindow() {
 void screen::execCommand(const string &cmd) const {
   pid_t pid;
   if ((pid = fork()) == 0) {
+    // disconnect the child from epist's session and the tty
+    if (setsid() == -1) {
+      cout << "warning: could not start a new process group\n";
+      perror("setsid");
+    }
+
     // 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";
@@ -644,10 +658,11 @@ void screen::cycleWindow(unsigned int state, const bool forward,
 
     // if the window is on another desktop, we can't use XSetInputFocus, since
     // it doesn't imply a workspace change.
-    if (t->desktop() == _active_desktop || t->desktop() == 0xffffffff)
-      t->focus(false); // focus, but don't raise
+    if (_stacked_raise || (t->desktop() != _active_desktop &&
+                           t->desktop() != 0xffffffff))
+      t->focus(); // raise
     else
-      t->focus(); // change workspace and focus
+      t->focus(false); // don't raise
   }  
   else {
     t->focus();
This page took 0.028655 seconds and 4 git commands to generate.