-// -*- 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;
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);
+
+ if (width > _num_desktops || width <= 0)
+ return;
+
+ if (num < 0) {
+ if (_active_desktop % width != 0)
+ changeWorkspace(_active_desktop - 1);
+ else
+ changeWorkspace(_active_desktop + width - 1);
+ }
+ else {
+ if (_active_desktop % width != width - 1)
+ changeWorkspace(_active_desktop + 1);
+ else
+ changeWorkspace(_active_desktop - width + 1);
+ }
+}
+
void screen::grabKey(const KeyCode keyCode, const int modifierMask) const {
Display *display = _epist->getXDisplay();