X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fscreen.cc;h=25f16193e95e1fe6b522fe1b5bbdcf4b58cd287a;hb=5dc5cc32b0c00c3bfba8ea5727599f49b56ae817;hp=a7098a77d6706f2dd186f6269b0e3c5f491cd918;hpb=9d280b87de4e384b02340aa605af37d1869ef961;p=chaz%2Fopenbox diff --git a/util/epist/screen.cc b/util/epist/screen.cc index a7098a77..25f16193 100644 --- a/util/epist/screen.cc +++ b/util/epist/screen.cc @@ -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; } @@ -461,14 +469,14 @@ void screen::updateClientList() { const WindowList::iterator end = _clients.end(); unsigned long i; - // insert new clients after the active window for (i = 0; i < num; ++i) { for (it = _clients.begin(); it != end; ++it) if (**it == rootclients[i]) break; if (it == end) { // didn't already exist if (doAddWindow(rootclients[i])) { - // cout << "Added window: 0x" << hex << rootclients[i] << dec << endl; +// cout << "Added window: 0x" << hex << rootclients[i] << dec << endl; + // insert new clients after the active window _clients.insert(insert_point, new XWindow(_epist, this, rootclients[i])); } @@ -511,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 @@ -536,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; @@ -557,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(_info->displayString().c_str()))) { cout << "warning: couldn't set environment variable 'DISPLAY'\n"; @@ -639,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->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();