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"
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();
_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
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();
// 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);
- _active = _clients.begin();
- 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;
}
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]));
}
}
}
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
_clients.remove(win);
_clients.push_front(win);
_active = _clients.begin();
- }
- _last_active = _active;
+ _last_active = _active;
+ }
}
/* cout << "Active window is now: ";
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";
// 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();