diff --git a/effects/coverswitch/coverswitch.cpp b/effects/coverswitch/coverswitch.cpp index 0d0bdb9077..e336b233ac 100644 --- a/effects/coverswitch/coverswitch.cpp +++ b/effects/coverswitch/coverswitch.cpp @@ -533,7 +533,9 @@ void CoverSwitchEffect::slotTabBoxAdded(int mode) if (!mActivated) { // only for windows mode if (((mode == TabBoxWindowsMode && primaryTabBox) || - (mode == TabBoxWindowsAlternativeMode && secondaryTabBox)) + (mode == TabBoxWindowsAlternativeMode && secondaryTabBox) || + (mode == TabBoxCurrentAppWindowsMode && primaryTabBox) || + (mode == TabBoxCurrentAppWindowsAlternativeMode && secondaryTabBox)) && effects->currentTabBoxWindowList().count() > 0) { input = effects->createFullScreenInputWindow(this, Qt::ArrowCursor); activeScreen = effects->activeScreen(); diff --git a/effects/flipswitch/flipswitch.cpp b/effects/flipswitch/flipswitch.cpp index da49244004..5037f93a82 100644 --- a/effects/flipswitch/flipswitch.cpp +++ b/effects/flipswitch/flipswitch.cpp @@ -513,7 +513,9 @@ void FlipSwitchEffect::slotTabBoxAdded(int mode) return; // only for windows mode if (((mode == TabBoxWindowsMode && m_tabbox) || - (mode == TabBoxWindowsAlternativeMode && m_tabboxAlternative)) + (mode == TabBoxWindowsAlternativeMode && m_tabboxAlternative) || + (mode == TabBoxCurrentAppWindowsMode && m_tabbox) || + (mode == TabBoxCurrentAppWindowsAlternativeMode && m_tabboxAlternative)) && (!m_active || (m_active && m_stop)) && !effects->currentTabBoxWindowList().isEmpty()) { setActive(true, TabboxMode); diff --git a/kcmkwin/kwintabbox/main.cpp b/kcmkwin/kwintabbox/main.cpp index 945ad0390b..bb705dbfc9 100644 --- a/kcmkwin/kwintabbox/main.cpp +++ b/kcmkwin/kwintabbox/main.cpp @@ -93,6 +93,22 @@ KWinTabBoxConfig::KWinTabBoxConfig(QWidget* parent, const QVariantList& args) a->setProperty("isConfigurationAction", true); a->setText(i18n("Walk Through Windows Alternative (Reverse)")); a->setGlobalShortcut(KShortcut(), KAction::ActiveShortcut); + a = qobject_cast(m_actionCollection->addAction("Walk Through Windows of Current Application")); + a->setProperty("isConfigurationAction", true); + a->setText(i18n("Walk Through Windows of Current Application")); + a->setGlobalShortcut(KShortcut(Qt::ALT + Qt::Key_QuoteLeft)); + a = qobject_cast(m_actionCollection->addAction("Walk Through Windows of Current Application (Reverse)")); + a->setProperty("isConfigurationAction", true); + a->setText(i18n("Walk Through Windows of Current Application (Reverse)")); + a->setGlobalShortcut(KShortcut(Qt::ALT + Qt::Key_AsciiTilde)); + a = qobject_cast(m_actionCollection->addAction("Walk Through Windows of Current Application Alternative")); + a->setProperty("isConfigurationAction", true); + a->setText(i18n("Walk Through Windows of Current Application Alternative")); + a->setGlobalShortcut(KShortcut(), KAction::ActiveShortcut); + a = qobject_cast(m_actionCollection->addAction("Walk Through Windows of Current Application Alternative (Reverse)")); + a->setProperty("isConfigurationAction", true); + a->setText(i18n("Walk Through Windows of Current Application Alternative (Reverse)")); + a->setGlobalShortcut(KShortcut(), KAction::ActiveShortcut); m_editor->addCollection(m_actionCollection, i18n("Navigation")); layout->addWidget(m_editor); setLayout(layout); diff --git a/libkwineffects/kwinglobals.h b/libkwineffects/kwinglobals.h index 4bf8153c8b..c029089b65 100644 --- a/libkwineffects/kwinglobals.h +++ b/libkwineffects/kwinglobals.h @@ -99,10 +99,12 @@ enum ElectricBorderAction { // or window were viewed. // DesktopListMode lists them in the order created. enum TabBoxMode { - TabBoxDesktopMode, // Focus chain of desktops - TabBoxDesktopListMode, // Static desktop order - TabBoxWindowsMode, // Primary window switching mode - TabBoxWindowsAlternativeMode // Secondary window switching mode + TabBoxDesktopMode, // Focus chain of desktops + TabBoxDesktopListMode, // Static desktop order + TabBoxWindowsMode, // Primary window switching mode + TabBoxWindowsAlternativeMode, // Secondary window switching mode + TabBoxCurrentAppWindowsMode, // Same as primary window switching mode but only for windows of current application + TabBoxCurrentAppWindowsAlternativeMode, // Same as secondary switching mode but only for windows of current application }; enum KWinOption { diff --git a/tabbox/tabbox.cpp b/tabbox/tabbox.cpp index ffa11ad01b..4b51e41fcb 100644 --- a/tabbox/tabbox.cpp +++ b/tabbox/tabbox.cpp @@ -408,6 +408,12 @@ TabBox::TabBox(QObject *parent) m_alternativeConfig.setClientSwitchingMode(TabBoxConfig::FocusChainSwitching); m_alternativeConfig.setLayout(TabBoxConfig::VerticalLayout); + m_defaultCurrentApplicationConfig = m_defaultConfig; + m_defaultCurrentApplicationConfig.setClientApplicationsMode(TabBoxConfig::AllWindowsCurrentApplication); + + m_alternativeCurrentApplicationConfig = m_alternativeConfig; + m_alternativeCurrentApplicationConfig.setClientApplicationsMode(TabBoxConfig::AllWindowsCurrentApplication); + m_desktopConfig = TabBoxConfig(); m_desktopConfig.setTabBoxMode(TabBoxConfig::DesktopTabBox); m_desktopConfig.setShowTabBox(true); @@ -463,6 +469,10 @@ void TabBox::initShortcuts(KActionCollection* keys) KEY(I18N_NOOP("Walk Through Windows (Reverse)"), Qt::ALT + Qt::SHIFT + Qt::Key_Backtab, slotWalkBackThroughWindows(), m_cutWalkThroughWindowsReverse, slotWalkBackThroughWindowsKeyChanged(QKeySequence)) KEY(I18N_NOOP("Walk Through Windows Alternative"), 0, slotWalkThroughWindowsAlternative(), m_cutWalkThroughWindowsAlternative, slotWalkThroughWindowsAlternativeKeyChanged(QKeySequence)) KEY(I18N_NOOP("Walk Through Windows Alternative (Reverse)"), 0, slotWalkBackThroughWindowsAlternative(), m_cutWalkThroughWindowsAlternativeReverse, slotWalkBackThroughWindowsAlternativeKeyChanged(QKeySequence)) + KEY(I18N_NOOP("Walk Through Windows of Current Application"), Qt::ALT + Qt::Key_QuoteLeft, slotWalkThroughCurrentAppWindows(), m_cutWalkThroughCurrentAppWindows, slotWalkThroughCurrentAppWindowsKeyChanged(QKeySequence)) + KEY(I18N_NOOP("Walk Through Windows of Current Application (Reverse)"), Qt::ALT + Qt::Key_AsciiTilde, slotWalkBackThroughCurrentAppWindows(), m_cutWalkThroughCurrentAppWindowsReverse, slotWalkBackThroughCurrentAppWindowsKeyChanged(QKeySequence)) + KEY(I18N_NOOP("Walk Through Windows of Current Application Alternative"), 0, slotWalkThroughCurrentAppWindowsAlternative(), m_cutWalkThroughCurrentAppWindowsAlternative, slotWalkThroughCurrentAppWindowsAlternativeKeyChanged(QKeySequence)) + KEY(I18N_NOOP("Walk Through Windows of Current Application Alternative (Reverse)"), 0, slotWalkBackThroughCurrentAppWindowsAlternative(), m_cutWalkThroughCurrentAppWindowsAlternativeReverse, slotWalkBackThroughCurrentAppWindowsAlternativeKeyChanged(QKeySequence)) KEY(I18N_NOOP("Walk Through Desktops"), 0, slotWalkThroughDesktops(), m_cutWalkThroughDesktops, slotWalkThroughDesktopsKeyChanged(QKeySequence)) KEY(I18N_NOOP("Walk Through Desktops (Reverse)"), 0, slotWalkBackThroughDesktops(), m_cutWalkThroughDesktopsReverse, slotWalkBackThroughDesktopsKeyChanged(QKeySequence)) KEY(I18N_NOOP("Walk Through Desktop List"), 0, slotWalkThroughDesktopList(), m_cutWalkThroughDesktopList, slotWalkThroughDesktopListKeyChanged(QKeySequence)) @@ -485,6 +495,12 @@ void TabBox::setMode(TabBoxMode mode) case TabBoxWindowsAlternativeMode: m_tabBox->setConfig(m_alternativeConfig); break; + case TabBoxCurrentAppWindowsMode: + m_tabBox->setConfig(m_defaultCurrentApplicationConfig); + break; + case TabBoxCurrentAppWindowsAlternativeMode: + m_tabBox->setConfig(m_alternativeCurrentApplicationConfig); + break; case TabBoxDesktopMode: m_tabBox->setConfig(m_desktopConfig); break; @@ -659,6 +675,11 @@ void TabBox::reconfigure() loadConfig(c->group("TabBox"), m_defaultConfig); loadConfig(c->group("TabBoxAlternative"), m_alternativeConfig); + m_defaultCurrentApplicationConfig = m_defaultConfig; + m_defaultCurrentApplicationConfig.setClientApplicationsMode(TabBoxConfig::AllWindowsCurrentApplication); + m_alternativeCurrentApplicationConfig = m_alternativeConfig; + m_alternativeCurrentApplicationConfig.setClientApplicationsMode(TabBoxConfig::AllWindowsCurrentApplication); + m_tabBox->setConfig(m_defaultConfig); m_delayShow = config.readEntry("ShowDelay", true); @@ -903,6 +924,38 @@ void TabBox::slotWalkBackThroughWindowsAlternative() navigatingThroughWindows(false, m_cutWalkThroughWindowsAlternativeReverse, TabBoxWindowsAlternativeMode); } +void TabBox::slotWalkThroughCurrentAppWindows() +{ + if (!m_ready){ + return; + } + navigatingThroughWindows(true, m_cutWalkThroughCurrentAppWindows, TabBoxCurrentAppWindowsMode); +} + +void TabBox::slotWalkBackThroughCurrentAppWindows() +{ + if (!m_ready){ + return; + } + navigatingThroughWindows(false, m_cutWalkThroughCurrentAppWindowsReverse, TabBoxCurrentAppWindowsMode); +} + +void TabBox::slotWalkThroughCurrentAppWindowsAlternative() +{ + if (!m_ready){ + return; + } + navigatingThroughWindows(true, m_cutWalkThroughCurrentAppWindowsAlternative, TabBoxCurrentAppWindowsAlternativeMode); +} + +void TabBox::slotWalkBackThroughCurrentAppWindowsAlternative() +{ + if (!m_ready){ + return; + } + navigatingThroughWindows(false, m_cutWalkThroughCurrentAppWindowsAlternativeReverse, TabBoxCurrentAppWindowsAlternativeMode); +} + void TabBox::slotWalkThroughDesktops() { if (!m_ready){ @@ -1012,6 +1065,26 @@ void TabBox::slotWalkBackThroughWindowsAlternativeKeyChanged(const QKeySequence& m_cutWalkThroughWindowsAlternativeReverse = KShortcut(seq); } +void TabBox::slotWalkThroughCurrentAppWindowsKeyChanged(const QKeySequence& seq) +{ + m_cutWalkThroughCurrentAppWindows = KShortcut(seq); +} + +void TabBox::slotWalkBackThroughCurrentAppWindowsKeyChanged(const QKeySequence& seq) +{ + m_cutWalkThroughCurrentAppWindowsReverse = KShortcut(seq); +} + +void TabBox::slotWalkThroughCurrentAppWindowsAlternativeKeyChanged(const QKeySequence& seq) +{ + m_cutWalkThroughCurrentAppWindowsAlternative = KShortcut(seq); +} + +void TabBox::slotWalkBackThroughCurrentAppWindowsAlternativeKeyChanged(const QKeySequence& seq) +{ + m_cutWalkThroughCurrentAppWindowsAlternativeReverse = KShortcut(seq); +} + void TabBox::modalActionsSwitch(bool enabled) { QList collections; @@ -1214,15 +1287,36 @@ void TabBox::keyPress(int keyQt) if (m_tabGrab) { KShortcut forwardShortcut; KShortcut backwardShortcut; - if (mode() == TabBoxWindowsMode) { - forwardShortcut = m_cutWalkThroughWindows; - backwardShortcut = m_cutWalkThroughWindowsReverse; - } else { - forwardShortcut = m_cutWalkThroughWindowsAlternative; - backwardShortcut = m_cutWalkThroughWindowsAlternativeReverse; + switch (mode()) { + case TabBoxWindowsMode: + forwardShortcut = m_cutWalkThroughWindows; + backwardShortcut = m_cutWalkThroughWindowsReverse; + break; + case TabBoxWindowsAlternativeMode: + forwardShortcut = m_cutWalkThroughWindowsAlternative; + backwardShortcut = m_cutWalkThroughWindowsAlternativeReverse; + break; + case TabBoxCurrentAppWindowsMode: + forwardShortcut = m_cutWalkThroughCurrentAppWindows; + backwardShortcut = m_cutWalkThroughCurrentAppWindowsReverse; + break; + case TabBoxCurrentAppWindowsAlternativeMode: + forwardShortcut = m_cutWalkThroughCurrentAppWindowsAlternative; + backwardShortcut = m_cutWalkThroughCurrentAppWindowsAlternativeReverse; + break; + default: + kDebug(125) << "Invalid TabBoxMode"; + return; } forward = forwardShortcut.contains(keyQt); backward = backwardShortcut.contains(keyQt); + if (!forward && !backward) { + // if the shortcuts do not match, try matching again after filtering the shift key from keyQt + // it is needed to handle correctly the ALT+~ shorcut for example as it is coded as ALT+SHIFT+~ in keyQt + keyQt &= ~Qt::ShiftModifier; + forward = forwardShortcut.contains(keyQt); + backward = backwardShortcut.contains(keyQt); + } if (forward || backward) { kDebug(125) << "== " << forwardShortcut.toString() << " or " << backwardShortcut.toString() << endl; diff --git a/tabbox/tabbox.h b/tabbox/tabbox.h index de133bba7a..28d6a5b947 100644 --- a/tabbox/tabbox.h +++ b/tabbox/tabbox.h @@ -212,6 +212,10 @@ public slots: void slotWalkBackThroughWindows(); void slotWalkThroughWindowsAlternative(); void slotWalkBackThroughWindowsAlternative(); + void slotWalkThroughCurrentAppWindows(); + void slotWalkBackThroughCurrentAppWindows(); + void slotWalkThroughCurrentAppWindowsAlternative(); + void slotWalkBackThroughCurrentAppWindowsAlternative(); void slotWalkThroughDesktopsKeyChanged(const QKeySequence& seq); void slotWalkBackThroughDesktopsKeyChanged(const QKeySequence& seq); @@ -223,6 +227,10 @@ public slots: void slotMoveToTabRightKeyChanged(const QKeySequence& seq); void slotWalkThroughWindowsAlternativeKeyChanged(const QKeySequence& seq); void slotWalkBackThroughWindowsAlternativeKeyChanged(const QKeySequence& seq); + void slotWalkThroughCurrentAppWindowsKeyChanged(const QKeySequence& seq); + void slotWalkBackThroughCurrentAppWindowsKeyChanged(const QKeySequence& seq); + void slotWalkThroughCurrentAppWindowsAlternativeKeyChanged(const QKeySequence& seq); + void slotWalkBackThroughCurrentAppWindowsAlternativeKeyChanged(const QKeySequence& seq); void handlerReady(); @@ -267,6 +275,8 @@ private: TabBoxConfig m_defaultConfig; TabBoxConfig m_alternativeConfig; + TabBoxConfig m_defaultCurrentApplicationConfig; + TabBoxConfig m_alternativeCurrentApplicationConfig; TabBoxConfig m_desktopConfig; TabBoxConfig m_desktopListConfig; // false if an effect has referenced the tabbox @@ -281,6 +291,8 @@ private: KShortcut m_cutWalkThroughWindows, m_cutWalkThroughWindowsReverse; KShortcut m_cutWalkThroughGroupWindows, m_cutWalkThroughGroupWindowsReverse; KShortcut m_cutWalkThroughWindowsAlternative, m_cutWalkThroughWindowsAlternativeReverse; + KShortcut m_cutWalkThroughCurrentAppWindows, m_cutWalkThroughCurrentAppWindowsReverse; + KShortcut m_cutWalkThroughCurrentAppWindowsAlternative, m_cutWalkThroughCurrentAppWindowsAlternativeReverse; bool m_forcedGlobalMouseGrab; bool m_ready; // indicates whether the config is completely loaded };