Index: effects/presentwindows/presentwindows.h =================================================================== --- effects/presentwindows/presentwindows.h +++ effects/presentwindows/presentwindows.h @@ -264,6 +264,7 @@ bool isSelectableWindow(EffectWindow *w); bool isVisibleWindow(EffectWindow *w); void setHighlightedWindow(EffectWindow *w); + EffectWindow* cycleWindow(EffectWindow *w, bool reverse) const; EffectWindow* relativeWindow(EffectWindow *w, int xdiff, int ydiff, bool wrap) const; EffectWindow* findFirstWindow() const; void updateCloseWindow(); Index: effects/presentwindows/presentwindows.cpp =================================================================== --- effects/presentwindows/presentwindows.cpp +++ effects/presentwindows/presentwindows.cpp @@ -753,20 +753,6 @@ void PresentWindowsEffect::grabbedKeyboardEvent(QKeyEvent *e) { if (e->type() == QEvent::KeyPress) { - // check for global shortcuts - // HACK: keyboard grab disables the global shortcuts so we have to check for global shortcut (bug 156155) - if (m_mode == ModeCurrentDesktop && shortcut.contains(e->key() + e->modifiers())) { - toggleActive(); - return; - } - if (m_mode == ModeAllDesktops && shortcutAll.contains(e->key() + e->modifiers())) { - toggleActiveAllDesktops(); - return; - } - if (m_mode == ModeWindowClass && shortcutClass.contains(e->key() + e->modifiers())) { - toggleActiveClass(); - return; - } switch(e->key()) { // Wrap only if not auto-repeating @@ -810,8 +796,21 @@ effects->activateWindow(m_highlightedWindow); setActive(false); return; + case Qt::Key_Backtab: + setHighlightedWindow(cycleWindow(m_highlightedWindow, true)); + return; case Qt::Key_Tab: - return; // Nothing at the moment + if (e->modifiers() & Qt::ShiftModifier) { + setHighlightedWindow(cycleWindow(m_highlightedWindow, true)); + } else if (e->modifiers() & Qt::AltModifier) { + if (m_highlightedWindow) { + effects->activateWindow(m_highlightedWindow); + setActive(false); + } + } else { + setHighlightedWindow(cycleWindow(m_highlightedWindow, false)); + } + return; case Qt::Key_Delete: if (!m_windowFilter.isEmpty()) { m_windowFilter.clear(); @@ -822,6 +821,21 @@ case 0: return; // HACK: Workaround for Qt bug on unbound keys (#178547) default: + // check for global shortcuts + // HACK: keyboard grab disables the global shortcuts so we have to check for global shortcut (bug 156155) + if (m_mode == ModeCurrentDesktop && shortcut.contains(e->key() + e->modifiers())) { + toggleActive(); + return; + } + if (m_mode == ModeAllDesktops && shortcutAll.contains(e->key() + e->modifiers())) { + toggleActiveAllDesktops(); + return; + } + if (m_mode == ModeWindowClass && shortcutClass.contains(e->key() + e->modifiers())) { + toggleActiveClass(); + return; + } + if (!e->text().isEmpty()) { m_windowFilter.append(e->text()); updateFilterFrame(); @@ -1784,6 +1798,39 @@ m_highlightedWindow->closeWindow(); } +EffectWindow* PresentWindowsEffect::cycleWindow(EffectWindow *w, bool reverse) const +{ + if (!w) { + return m_motionManager.managedWindows().first(); + } + EffectWindow *next = nullptr; + + EffectWindowList windowList = m_motionManager.managedWindows(); + int size = windowList.size(); + int originalIndex = windowList.indexOf(w); + + int index = originalIndex; + if (!reverse) { + index = (index + 1) % size; + } else { + index = (index - 1 + size) % size; + } + + next = windowList.at(index); + DataHash::const_iterator winData = m_windowData.find(windowList.at(index)); + while (!winData->visible && index != originalIndex) { + if (!reverse) { + index = (index + 1) % size; + } else { + index = (index - 1 + size) % size; + } + winData = m_windowData.find(windowList.at(index)); + } + next = windowList.at(index); + + return next; +} + EffectWindow* PresentWindowsEffect::relativeWindow(EffectWindow *w, int xdiff, int ydiff, bool wrap) const { if (!w)