+
+void screen::changeWorkspaceVert(const int num) const {
+ assert(_managed);
+ int width = 0;
+ int num_desktops = (signed)_num_desktops;
+ int active_desktop = (signed)_active_desktop;
+ int wnum = 0;
+
+ _config->getValue(Config::workspaceColumns, width);
+
+ if (width > num_desktops || width <= 0)
+ return;
+
+ // 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);
+ int width = 0;
+ int num_desktops = (signed)_num_desktops;
+ int active_desktop = (signed)_active_desktop;
+ int wnum = 0;
+
+ _config->getValue(Config::workspaceColumns, width);
+
+ 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();
+ int numlockMask, scrolllockMask;
+
+ _epist->getLockModifiers(numlockMask, scrolllockMask);
+
+ XGrabKey(display, keyCode, modifierMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+ XGrabKey(display, keyCode,
+ modifierMask|LockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+ XGrabKey(display, keyCode,
+ modifierMask|scrolllockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+ XGrabKey(display, keyCode,
+ modifierMask|numlockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+
+ XGrabKey(display, keyCode,
+ modifierMask|LockMask|scrolllockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+ XGrabKey(display, keyCode,
+ modifierMask|scrolllockMask|numlockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+ XGrabKey(display, keyCode,
+ modifierMask|numlockMask|LockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+
+ XGrabKey(display, keyCode,
+ modifierMask|numlockMask|LockMask|scrolllockMask,
+ _root, True, GrabModeAsync, GrabModeAsync);
+}
+
+void screen::ungrabKey(const KeyCode keyCode, const int modifierMask) const {
+
+ Display *display = _epist->getXDisplay();
+ int numlockMask, scrolllockMask;
+
+ _epist->getLockModifiers(numlockMask, scrolllockMask);
+
+ XUngrabKey(display, keyCode, modifierMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|LockMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|scrolllockMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|numlockMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|LockMask|scrolllockMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|scrolllockMask|numlockMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|numlockMask|LockMask, _root);
+ XUngrabKey(display, keyCode, modifierMask|numlockMask|LockMask|
+ scrolllockMask, _root);
+}
+
+
+void screen::grabModifiers() const {
+ Display *display = _epist->getXDisplay();
+
+ XGrabKeyboard(display, rootWindow(), True, GrabModeAsync,
+ GrabModeAsync, CurrentTime);
+}
+
+
+void screen::ungrabModifiers() const {
+ Display *display = _epist->getXDisplay();
+
+ XUngrabKeyboard(display, CurrentTime);
+}
+
+
+bool screen::nothingIsPressed(void) const
+{
+ char keys[32];
+ XQueryKeymap(_epist->getXDisplay(), keys);
+
+ for (int i = 0; i < 32; ++i) {
+ if (keys[i] != 0)
+ return false;
+ }
+
+ return true;
+}