_number = number;
_info = _epist->getScreenInfo(_number);
_root = _info->getRootWindow();
+ _grabbed = true;
// find a window manager supporting NETWM, waiting for it to load if we must
int count = 20; // try for 20 seconds
// root window
if (e.xproperty.atom == _xatom->getAtom(XAtom::net_number_of_desktops))
updateNumDesktops();
- if (e.xproperty.atom == _xatom->getAtom(XAtom::net_current_desktop))
+ else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_current_desktop))
updateActiveDesktop();
- if (e.xproperty.atom == _xatom->getAtom(XAtom::net_active_window))
+ else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_active_window))
updateActiveWindow();
- if (e.xproperty.atom == _xatom->getAtom(XAtom::net_client_list)) {
+ else if (e.xproperty.atom == _xatom->getAtom(XAtom::net_client_list)) {
// catch any window unmaps first
XEvent ev;
if (XCheckTypedWindowEvent(_epist->getXDisplay(), e.xany.window,
// Mask out the lock modifiers. We want our keys to always work
// This should be made an option
unsigned int state = e.xkey.state & ~(LockMask|scrolllockMask|numlockMask);
- const Action *it = _epist->getKeyTree().getAction(e, state, this);
-
+ keytree &ktree = _epist->getKeyTree();
+ const Action *it = ktree.getAction(e, state, this);
+
if (!it)
return;
execCommand(it->string());
return;
+ case Action::showRootMenu:
+ _xatom->sendClientMessage(rootWindow(), XAtom::openbox_show_root_menu,
+ None);
+ return;
+
+ case Action::showWorkspaceMenu:
+ _xatom->sendClientMessage(rootWindow(), XAtom::openbox_show_workspace_menu,
+ None);
+ return;
+
+ case Action::toggleGrabs: {
+ if (_grabbed) {
+ ktree.ungrabDefaults(this);
+ _grabbed = false;
+ } else {
+ ktree.grabDefaults(this);
+ _grabbed = true;
+ }
+ return;
+ }
+
default:
break;
}
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!
assert(_managed);
const Config *conf = _epist->getConfig();
int width = conf->getNumberValue(Config::workspaceColumns);
+ int num_desktops = (signed)_num_desktops;
+ int active_desktop = (signed)_active_desktop;
+ int wnum = 0;
- if (width > _num_desktops || width <= 0)
+ if (width > num_desktops || width <= 0)
return;
+ // a cookie to the person that makes this pretty
if (num < 0) {
- int wnum = _active_desktop - width;
- if (wnum >= 0)
- changeWorkspace(wnum);
+ wnum = active_desktop - width;
+ if (wnum < 0) {
+ wnum = num_desktops/width * width + active_desktop;
+ if (wnum >= num_desktops)
+ wnum = num_desktops - 1;
+ }
}
else {
- int wnum = _active_desktop + width;
- if (wnum < _num_desktops)
- changeWorkspace(wnum);
+ 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)
+ int num_desktops = (signed)_num_desktops;
+ int active_desktop = (signed)_active_desktop;
+ int wnum = 0;
+
+ 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);
+ 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)
- changeWorkspace(_active_desktop + 1);
+ if (active_desktop % width != width - 1) {
+ wnum = active_desktop + 1;
+ if (wnum >= num_desktops)
+ wnum = num_desktops / width * width;
+ }
else
- changeWorkspace(_active_desktop - width + 1);
+ wnum = active_desktop - width + 1;
}
+ changeWorkspace(wnum);
}
void screen::grabKey(const KeyCode keyCode, const int modifierMask) const {