X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=util%2Fepist%2Fscreen.cc;h=d711fcb301571a7d954855509039be4361d71fbb;hb=3792d283331087b1ae92419f847efaa7f879e440;hp=1086ce4ab861aa0a0844c9f250012fbd286c2773;hpb=a0cf45a0ef5f7e2cbf0833f4d8655131912400cc;p=chaz%2Fopenbox diff --git a/util/epist/screen.cc b/util/epist/screen.cc index 1086ce4a..d711fcb3 100644 --- a/util/epist/screen.cc +++ b/util/epist/screen.cc @@ -120,12 +120,6 @@ void screen::processEvent(const XEvent &e) { assert(_managed); assert(e.xany.window == _root); - XWindow *window = 0; - if (e.xany.window != _root) { - window = findWindow(e); // find the window - assert(window); // we caught an event for a window we don't know about!? - } - switch (e.type) { case PropertyNotify: // root window @@ -348,16 +342,11 @@ void screen::updateClientList() { Window *rootclients = 0; unsigned long num = (unsigned) -1; if (! _xatom->getValue(_root, XAtom::net_client_list, XAtom::window, num, - &rootclients)) { - while (! _clients.empty()) { - delete _clients.front(); - _clients.erase(_clients.begin()); - } - if (rootclients) delete [] rootclients; - return; - } - - WindowList::iterator it, end = _clients.end(); + &rootclients)) + num = 0; + + WindowList::iterator it; + const WindowList::iterator end = _clients.end(); unsigned long i; // insert new clients after the active window @@ -376,12 +365,17 @@ void screen::updateClientList() { // remove clients that no longer exist for (it = _clients.begin(); it != end;) { - WindowList::iterator it2 = it++; + WindowList::iterator it2 = it; + ++it; + for (i = 0; i < num; ++i) if (**it2 == rootclients[i]) break; if (i == num) { // no longer exists //cout << "Removed window: 0x" << hex << (*it2)->window() << dec << endl; + // watch for the active window + if (it2 == _active) + _active = _clients.end(); delete *it2; _clients.erase(it2); } @@ -439,16 +433,16 @@ void screen::cycleWindow(const bool forward, const bool alldesktops, const bool sameclass, const string &cn) const { assert(_managed); - if (_clients.empty()) return; - - WindowList::const_iterator target = _active; + string classname(cn); + if (sameclass && classname.empty() && _active != _clients.end()) + classname = (*_active)->appClass(); - string classname = cn; - if (sameclass && classname.empty() && target != _clients.end()) - classname = (*target)->appClass(); + WindowList::const_iterator target = _active; if (target == _clients.end()) target = _clients.begin(); + + WindowList::const_iterator begin = target; do { if (forward) { @@ -460,6 +454,10 @@ void screen::cycleWindow(const bool forward, const bool alldesktops, target = _clients.end(); --target; } + + // no window to focus + if (target == begin) + return; } while (target == _clients.end() || (*target)->iconic() || (! alldesktops && (*target)->desktop() != _active_desktop) ||