added the ability to have numeric arguments for the cycle window/workspace functions.
eg. Control-Mod1-Down nextWorkspace 6; Control-Mod1-Right nextWorkspace; Would allow some form of relative workspace flipping. It might be much less useful for cycling windows.
This commit is contained in:
parent
ef66d63b42
commit
75b6a5a378
2 changed files with 78 additions and 61 deletions
|
@ -166,51 +166,56 @@ void screen::handleKeypress(const XEvent &e) {
|
|||
return;
|
||||
|
||||
case Action::nextWorkspace:
|
||||
cycleWorkspace(true);
|
||||
cycleWorkspace(true, it->number() != 0 ? it->number(): 1);
|
||||
return;
|
||||
|
||||
case Action::prevWorkspace:
|
||||
cycleWorkspace(false);
|
||||
cycleWorkspace(false, it->number() != 0 ? it->number(): 1);
|
||||
return;
|
||||
|
||||
case Action::nextWindow:
|
||||
cycleWindow(true);
|
||||
|
||||
cycleWindow(true, it->number() != 0 ? it->number(): 1);
|
||||
return;
|
||||
|
||||
case Action::prevWindow:
|
||||
cycleWindow(false);
|
||||
cycleWindow(false, it->number() != 0 ? it->number(): 1);
|
||||
return;
|
||||
|
||||
case Action::nextWindowOnAllWorkspaces:
|
||||
cycleWindow(true, false, true);
|
||||
cycleWindow(true, it->number() != 0 ? it->number(): 1, false, true);
|
||||
return;
|
||||
|
||||
case Action::prevWindowOnAllWorkspaces:
|
||||
cycleWindow(false, false, true);
|
||||
cycleWindow(false, it->number() != 0 ? it->number(): 1, false, true);
|
||||
return;
|
||||
|
||||
case Action::nextWindowOnAllScreens:
|
||||
cycleWindow(true, true);
|
||||
cycleWindow(true, it->number() != 0 ? it->number(): 1, true);
|
||||
return;
|
||||
|
||||
case Action::prevWindowOnAllScreens:
|
||||
cycleWindow(false, true);
|
||||
cycleWindow(false, it->number() != 0 ? it->number(): 1, true);
|
||||
return;
|
||||
|
||||
case Action::nextWindowOfClass:
|
||||
cycleWindow(true, false, false, true, it->string());
|
||||
cycleWindow(true, it->number() != 0 ? it->number(): 1,
|
||||
false, false, true, it->string());
|
||||
return;
|
||||
|
||||
case Action::prevWindowOfClass:
|
||||
cycleWindow(false, false, false, true, it->string());
|
||||
cycleWindow(false, it->number() != 0 ? it->number(): 1,
|
||||
false, false, true, it->string());
|
||||
return;
|
||||
|
||||
case Action::nextWindowOfClassOnAllWorkspaces:
|
||||
cycleWindow(true, false, true, true, it->string());
|
||||
cycleWindow(true, it->number() != 0 ? it->number(): 1,
|
||||
false, true, true, it->string());
|
||||
return;
|
||||
|
||||
case Action::prevWindowOfClassOnAllWorkspaces:
|
||||
cycleWindow(false, false, true, true, it->string());
|
||||
cycleWindow(false, it->number() != 0 ? it->number(): 1,
|
||||
false, true, true, it->string());
|
||||
return;
|
||||
|
||||
case Action::changeWorkspace:
|
||||
|
@ -466,9 +471,9 @@ void screen::execCommand(const string &cmd) const {
|
|||
}
|
||||
|
||||
|
||||
void screen::cycleWindow(const bool forward, const bool allscreens,
|
||||
const bool alldesktops, const bool sameclass,
|
||||
const string &cn) const {
|
||||
void screen::cycleWindow(const bool forward, const int increment,
|
||||
const bool allscreens, const bool alldesktops,
|
||||
const bool sameclass, const string &cn) const {
|
||||
assert(_managed);
|
||||
|
||||
if (_clients.empty()) return;
|
||||
|
@ -481,6 +486,9 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
|
|||
begin = _clients.begin(),
|
||||
end = _clients.end();
|
||||
|
||||
const XWindow *t;
|
||||
|
||||
for (int x = 0; x < increment; ++x) {
|
||||
while (1) {
|
||||
if (forward) {
|
||||
if (target == end) {
|
||||
|
@ -491,6 +499,7 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
|
|||
} else {
|
||||
if (target == begin)
|
||||
target = end;
|
||||
for (int x = 0; x < increment; ++x)
|
||||
--target;
|
||||
}
|
||||
|
||||
|
@ -503,7 +512,7 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
|
|||
continue;
|
||||
|
||||
// determine if this window is invalid for cycling to
|
||||
const XWindow *t = *target;
|
||||
t = *target;
|
||||
if (t->iconic()) continue;
|
||||
if (! allscreens && t->getScreen() != this) continue;
|
||||
if (! alldesktops && ! (t->desktop() == _active_desktop ||
|
||||
|
@ -512,18 +521,23 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
|
|||
t->appClass() != classname) continue;
|
||||
if (! t->canFocus()) continue;
|
||||
|
||||
// found a good window!
|
||||
t->focus();
|
||||
return;
|
||||
// found a good window so break out of the while, and perhaps continue
|
||||
// with the for loop
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// phew. we found the window, so focus it.
|
||||
t->focus();
|
||||
}
|
||||
|
||||
|
||||
void screen::cycleWorkspace(const bool forward, const bool loop) const {
|
||||
void screen::cycleWorkspace(const bool forward, const int increment, const bool loop) const {
|
||||
assert(_managed);
|
||||
|
||||
unsigned int destination = _active_desktop;
|
||||
|
||||
for (int x = 0; x < increment; ++x) {
|
||||
if (forward) {
|
||||
if (destination < _num_desktops - 1)
|
||||
++destination;
|
||||
|
@ -535,6 +549,7 @@ void screen::cycleWorkspace(const bool forward, const bool loop) const {
|
|||
else if (loop)
|
||||
destination = _num_desktops - 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (destination != _active_desktop)
|
||||
changeWorkspace(destination);
|
||||
|
|
|
@ -76,11 +76,13 @@ public:
|
|||
void handleKeypress(const XEvent &e);
|
||||
void updateEverything();
|
||||
|
||||
void cycleWindow(const bool forward, const bool allscreens = false,
|
||||
void cycleWindow(const bool forward, const int increment,
|
||||
const bool allscreens = false,
|
||||
const bool alldesktops = false,
|
||||
const bool sameclass = false,
|
||||
const std::string &classname = "") const;
|
||||
void cycleWorkspace(const bool forward, const bool loop = true) const;
|
||||
void cycleWorkspace(const bool forward, const int increment,
|
||||
const bool loop = true) const;
|
||||
void changeWorkspace(const int num) const;
|
||||
void toggleShaded(const Window win) const;
|
||||
void execCommand(const std::string &cmd) const;
|
||||
|
|
Loading…
Reference in a new issue