-// -*- mode: C++; indent-tabs-mode: nil; -*-
+// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
// screen.cc for Epistrophy - a key handler for NETWM/EWMH window managers.
// Copyright (c) 2002 - 2002 Ben Jansens <ben at orodu.net>
//
#include "../../src/XAtom.hh"
#include "screen.hh"
#include "epist.hh"
-
+#include "config.hh"
screen::screen(epist *epist, int number)
: _clients(epist->clientsList()),
_number = 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
_managed = false;
changeWorkspace(it->number());
return;
+ case Action::upWorkspace:
+ changeWorkspaceVert(-1);
+ return;
+
+ case Action::downWorkspace:
+ changeWorkspaceVert(1);
+ return;
+
+ case Action::leftWorkspace:
+ changeWorkspaceHorz(-1);
+ return;
+
+ case Action::rightWorkspace:
+ changeWorkspaceHorz(1);
+ return;
+
case Action::execute:
execCommand(it->string());
return;
return;
case Action::moveWindowUp:
- window->move(window->x(), window->y() - it->number());
+ window->move(window->x(), window->y() -
+ (it->number() != 0 ? it->number(): 1));
return;
case Action::moveWindowDown:
- window->move(window->x(), window->y() + it->number());
+ window->move(window->x(), window->y() +
+ (it->number() != 0 ? it->number(): 1));
return;
case Action::moveWindowLeft:
- window->move(window->x() - it->number(), window->y());
+ window->move(window->x() - (it->number() != 0 ? it->number(): 1),
+ window->y());
return;
case Action::moveWindowRight:
- window->move(window->x() + it->number(), window->y());
+ window->move(window->x() + (it->number() != 0 ? it->number(): 1),
+ window->y());
return;
case Action::resizeWindowWidth:
case Action::toggleMaximizeFull:
window->toggleMaximize(XWindow::Max_Full);
return;
+
+ case Action::toggleDecorations:
+ window->decorate(! window->decorated());
+ return;
default:
assert(false); // unhandled action type!
}
}
_active = it;
- _last_active = it;
+ if (it != end)
+ _last_active = it;
/* cout << "Active window is now: ";
if (_active == _clients.end()) cout << "None\n";
const bool allscreens, const bool alldesktops,
const bool sameclass, const string &cn) const {
assert(_managed);
+ assert(increment > 0);
if (_clients.empty()) return;
begin = _clients.begin(),
end = _clients.end();
- const XWindow *t;
+ const XWindow *t = 0;
for (int x = 0; x < increment; ++x) {
while (1) {
}
-void screen::cycleWorkspace(const bool forward, const int increment, const bool loop) const {
+void screen::cycleWorkspace(const bool forward, const int increment,
+ const bool loop) const {
assert(_managed);
+ assert(increment > 0);
unsigned int destination = _active_desktop;
_xatom->sendClientMessage(_root, XAtom::net_current_desktop, _root, num);
}
+void screen::changeWorkspaceVert(const int num) const {
+ assert(_managed);
+ const Config *conf = _epist->getConfig();
+ int width = conf->getNumberValue(Config::workspaceColumns);
+
+ if (width > _num_desktops || width <= 0)
+ return;
+
+ int wnum;
+
+ // a cookie to the person that makes this pretty
+ if (num < 0) {
+ wnum = _active_desktop - width;
+ if (wnum < 0) {
+ wnum = _num_desktops/width * width + _active_desktop;
+ if (wnum >= _num_desktops)
+ wnum = _num_desktops - 1;
+ }
+ }
+ else {
+ wnum = _active_desktop + width;
+ if (wnum >= _num_desktops) {
+ wnum = (_active_desktop + width) % _num_desktops - 1;
+ if (wnum < 0)
+ wnum = 0;
+ }
+ }
+ changeWorkspace(wnum);
+}
+
+void screen::changeWorkspaceHorz(const int num) const {
+ assert(_managed);
+ const Config *conf = _epist->getConfig();
+ int width = conf->getNumberValue(Config::workspaceColumns);
+ int wnum;
+
+ if (width > _num_desktops || width <= 0)
+ return;
+
+ if (num < 0) {
+ if (_active_desktop % width != 0)
+ changeWorkspace(_active_desktop - 1);
+ else {
+ wnum = _active_desktop + width - 1;
+ if (wnum >= _num_desktops)
+ wnum = _num_desktops - 1;
+ }
+ }
+ else {
+ if (_active_desktop % width != width - 1) {
+ wnum = _active_desktop + 1;
+ if (wnum >= _num_desktops)
+ wnum = _num_desktops / width * width;
+ }
+ else
+ wnum = _active_desktop - width + 1;
+ }
+ changeWorkspace(wnum);
+}
+
void screen::grabKey(const KeyCode keyCode, const int modifierMask) const {
Display *display = _epist->getXDisplay();