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:
Scott Moynes 2002-08-14 04:17:46 +00:00
parent ef66d63b42
commit 75b6a5a378
2 changed files with 78 additions and 61 deletions

View file

@ -166,51 +166,56 @@ void screen::handleKeypress(const XEvent &e) {
return; return;
case Action::nextWorkspace: case Action::nextWorkspace:
cycleWorkspace(true); cycleWorkspace(true, it->number() != 0 ? it->number(): 1);
return; return;
case Action::prevWorkspace: case Action::prevWorkspace:
cycleWorkspace(false); cycleWorkspace(false, it->number() != 0 ? it->number(): 1);
return; return;
case Action::nextWindow: case Action::nextWindow:
cycleWindow(true);
cycleWindow(true, it->number() != 0 ? it->number(): 1);
return; return;
case Action::prevWindow: case Action::prevWindow:
cycleWindow(false); cycleWindow(false, it->number() != 0 ? it->number(): 1);
return; return;
case Action::nextWindowOnAllWorkspaces: case Action::nextWindowOnAllWorkspaces:
cycleWindow(true, false, true); cycleWindow(true, it->number() != 0 ? it->number(): 1, false, true);
return; return;
case Action::prevWindowOnAllWorkspaces: case Action::prevWindowOnAllWorkspaces:
cycleWindow(false, false, true); cycleWindow(false, it->number() != 0 ? it->number(): 1, false, true);
return; return;
case Action::nextWindowOnAllScreens: case Action::nextWindowOnAllScreens:
cycleWindow(true, true); cycleWindow(true, it->number() != 0 ? it->number(): 1, true);
return; return;
case Action::prevWindowOnAllScreens: case Action::prevWindowOnAllScreens:
cycleWindow(false, true); cycleWindow(false, it->number() != 0 ? it->number(): 1, true);
return; return;
case Action::nextWindowOfClass: case Action::nextWindowOfClass:
cycleWindow(true, false, false, true, it->string()); cycleWindow(true, it->number() != 0 ? it->number(): 1,
false, false, true, it->string());
return; return;
case Action::prevWindowOfClass: case Action::prevWindowOfClass:
cycleWindow(false, false, false, true, it->string()); cycleWindow(false, it->number() != 0 ? it->number(): 1,
false, false, true, it->string());
return; return;
case Action::nextWindowOfClassOnAllWorkspaces: case Action::nextWindowOfClassOnAllWorkspaces:
cycleWindow(true, false, true, true, it->string()); cycleWindow(true, it->number() != 0 ? it->number(): 1,
false, true, true, it->string());
return; return;
case Action::prevWindowOfClassOnAllWorkspaces: case Action::prevWindowOfClassOnAllWorkspaces:
cycleWindow(false, false, true, true, it->string()); cycleWindow(false, it->number() != 0 ? it->number(): 1,
false, true, true, it->string());
return; return;
case Action::changeWorkspace: case Action::changeWorkspace:
@ -466,13 +471,13 @@ void screen::execCommand(const string &cmd) const {
} }
void screen::cycleWindow(const bool forward, const bool allscreens, void screen::cycleWindow(const bool forward, const int increment,
const bool alldesktops, const bool sameclass, const bool allscreens, const bool alldesktops,
const string &cn) const { const bool sameclass, const string &cn) const {
assert(_managed); assert(_managed);
if (_clients.empty()) return; if (_clients.empty()) return;
string classname(cn); string classname(cn);
if (sameclass && classname.empty() && _active != _clients.end()) if (sameclass && classname.empty() && _active != _clients.end())
classname = (*_active)->appClass(); classname = (*_active)->appClass();
@ -480,60 +485,70 @@ void screen::cycleWindow(const bool forward, const bool allscreens,
WindowList::const_iterator target = _active, WindowList::const_iterator target = _active,
begin = _clients.begin(), begin = _clients.begin(),
end = _clients.end(); end = _clients.end();
while (1) { const XWindow *t;
if (forward) {
if (target == end) { for (int x = 0; x < increment; ++x) {
target = begin; while (1) {
if (forward) {
if (target == end) {
target = begin;
} else {
++target;
}
} else { } else {
++target; if (target == begin)
target = end;
for (int x = 0; x < increment; ++x)
--target;
} }
} else {
if (target == begin) // must be no window to focus
target = end; if (target == _active)
--target; return;
// start back at the beginning of the loop
if (target == end)
continue;
// determine if this window is invalid for cycling to
t = *target;
if (t->iconic()) continue;
if (! allscreens && t->getScreen() != this) continue;
if (! alldesktops && ! (t->desktop() == _active_desktop ||
t->desktop() == 0xffffffff)) continue;
if (sameclass && ! classname.empty() &&
t->appClass() != classname) continue;
if (! t->canFocus()) continue;
// found a good window so break out of the while, and perhaps continue
// with the for loop
break;
} }
// must be no window to focus
if (target == _active)
return;
// start back at the beginning of the loop
if (target == end)
continue;
// determine if this window is invalid for cycling to
const XWindow *t = *target;
if (t->iconic()) continue;
if (! allscreens && t->getScreen() != this) continue;
if (! alldesktops && ! (t->desktop() == _active_desktop ||
t->desktop() == 0xffffffff)) continue;
if (sameclass && ! classname.empty() &&
t->appClass() != classname) continue;
if (! t->canFocus()) continue;
// found a good window!
t->focus();
return;
} }
// 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); assert(_managed);
unsigned int destination = _active_desktop; unsigned int destination = _active_desktop;
if (forward) { for (int x = 0; x < increment; ++x) {
if (destination < _num_desktops - 1) if (forward) {
++destination; if (destination < _num_desktops - 1)
else if (loop) ++destination;
destination = 0; else if (loop)
} else { destination = 0;
if (destination > 0) } else {
--destination; if (destination > 0)
else if (loop) --destination;
destination = _num_desktops - 1; else if (loop)
destination = _num_desktops - 1;
}
} }
if (destination != _active_desktop) if (destination != _active_desktop)

View file

@ -76,11 +76,13 @@ public:
void handleKeypress(const XEvent &e); void handleKeypress(const XEvent &e);
void updateEverything(); 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 alldesktops = false,
const bool sameclass = false, const bool sameclass = false,
const std::string &classname = "") const; 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 changeWorkspace(const int num) const;
void toggleShaded(const Window win) const; void toggleShaded(const Window win) const;
void execCommand(const std::string &cmd) const; void execCommand(const std::string &cmd) const;