From 05845ebfef5cb55e04e2d3a439c992fd99a2cbfa Mon Sep 17 00:00:00 2001 From: runtime Date: Thu, 2 Jul 2026 18:49:34 +0800 Subject: [PATCH] fix: allow lockscreen shortcut in multitaskview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Extend Lockscreen and ShutdownMenu shortcut action conditions to include Multitaskview mode 2. Add exitMultitaskviewAndTaskSwitch() helper to encapsulate multitask view exit and task switch cleanup 3. Add isNormalOrMultitaskview() helper to replace repeated mode checks 4. Add enterLockScreen() to unify lock screen entry with mode check and cleanup 5. Add showShutdownMenu() as public method symmetric with showLockScreen() 6. Keep showLockScreen() without mode check for D-Bus session lock path (security operation must not be blocked by UI state) Log: Fixed Super+L lockscreen shortcut not working in multitask view Influence: 1. Test Super+L lockscreen shortcut in multitask view mode 2. Test Super+L lockscreen shortcut in normal desktop mode 3. Test shutdown menu shortcut in multitask view mode 4. Test shutdown menu shortcut in normal desktop mode 5. Test lockscreen D-Bus callbacks in multitask view mode fix: 允许多任务视图下使用锁屏快捷键 1. 扩展锁屏和关机菜单快捷键动作条件以包含多任务视图模式 2. 添加 exitMultitaskviewAndTaskSwitch() 辅助函数封装 多任务视图退出和任务切换清理逻辑 3. 添加 isNormalOrMultitaskview() 辅助函数替换重复的 模式检查 4. 添加 enterLockScreen() 统一锁屏入口含模式检查和清理 5. 添加 showShutdownMenu() 公共方法与 showLockScreen() 对称 6. showLockScreen() 不含模式检查,确保 D-Bus 会话锁路径 不被 UI 状态阻止(安全操作) Log: 修复多任务视图下 Super+L 锁屏快捷键无响应的问题 Influence: 1. 测试多任务视图下 Super+L 锁屏快捷键 2. 测试普通桌面模式下 Super+L 锁屏快捷键 3. 测试多任务视图下关机菜单快捷键 4. 测试普通桌面模式下关机菜单快捷键 5. 测试多任务视图下锁屏 D-Bus 回调 --- src/modules/shortcut/shortcutrunner.cpp | 21 ++++------ src/seat/helper.cpp | 56 +++++++++++++------------ src/seat/helper.h | 10 +++++ 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/modules/shortcut/shortcutrunner.cpp b/src/modules/shortcut/shortcutrunner.cpp index 24aff42b2..72a7b5e2b 100644 --- a/src/modules/shortcut/shortcutrunner.cpp +++ b/src/modules/shortcut/shortcutrunner.cpp @@ -120,26 +120,21 @@ void ShortcutRunner::onActionTrigger(ShortcutAction action, const QString &name, } break; case ShortcutAction::OpenMultiTaskView: - if (!helper->m_multitaskView || - (helper->currentMode() != Helper::CurrentMode::Normal - && helper->currentMode() != Helper::CurrentMode::Multitaskview)) { + if (!helper->m_multitaskView || !helper->isNormalOrMultitaskview()) { break; } helper->m_multitaskView->setStatus(IMultitaskView::Exited); helper->m_multitaskView->toggleMultitaskView(IMultitaskView::ActiveReason::ShortcutKey); break; case ShortcutAction::CloseMultiTaskView: - if (!helper->m_multitaskView || - (helper->currentMode() != Helper::CurrentMode::Normal - && helper->currentMode() != Helper::CurrentMode::Multitaskview)) { + if (!helper->m_multitaskView || !helper->isNormalOrMultitaskview()) { break; } helper->m_multitaskView->setStatus(IMultitaskView::Active); helper->m_multitaskView->toggleMultitaskView(IMultitaskView::ActiveReason::ShortcutKey); break; case ShortcutAction::ToggleMultitaskView: - if (helper->currentMode() == Helper::CurrentMode::Normal - || helper->currentMode() == Helper::CurrentMode::Multitaskview) { + if (helper->isNormalOrMultitaskview()) { helper->restoreFromShowDesktop(); if (helper->m_multitaskView) { helper->m_multitaskView->toggleMultitaskView(IMultitaskView::ActiveReason::ShortcutKey); @@ -151,16 +146,16 @@ void ShortcutRunner::onActionTrigger(ShortcutAction action, const QString &name, break; case ShortcutAction::Lockscreen: #ifndef DISABLE_DDM - if (helper->m_lockScreen && helper->m_lockScreen->available() && helper->currentMode() == Helper::CurrentMode::Normal) { + if (helper->m_lockScreen && helper->m_lockScreen->available() + && helper->isNormalOrMultitaskview()) { helper->showLockScreen(); } #endif break; case ShortcutAction::ShutdownMenu: - if (helper->m_lockScreen && helper->m_lockScreen->available() && helper->currentMode() == Helper::CurrentMode::Normal) { - helper->setCurrentMode(Helper::CurrentMode::LockScreen); - helper->m_lockScreen->shutdown(); - helper->setWorkspaceVisible(false); + if (helper->m_lockScreen && helper->m_lockScreen->available() + && helper->isNormalOrMultitaskview()) { + helper->showShutdownMenu(); } break; case ShortcutAction::Quit: diff --git a/src/seat/helper.cpp b/src/seat/helper.cpp index da0fb2d27..628ab7aba 100644 --- a/src/seat/helper.cpp +++ b/src/seat/helper.cpp @@ -2512,25 +2512,13 @@ void Helper::handleRequestDrag([[maybe_unused]] WSurface *surface) void Helper::handleLockScreen(LockScreenInterface *lockScreen) { connect(lockScreen, &LockScreenInterface::shutdown, this, [this]() { - if (m_lockScreen && m_lockScreen->available() && currentMode() == Helper::CurrentMode::Normal) { - setCurrentMode(CurrentMode::LockScreen); - m_lockScreen->shutdown(); - setWorkspaceVisible(false); - } + enterLockScreen([this]() { m_lockScreen->shutdown(); }); }); connect(lockScreen, &LockScreenInterface::lock, this, [this]() { - if (m_lockScreen && m_lockScreen->available() && currentMode() == Helper::CurrentMode::Normal) { - setCurrentMode(CurrentMode::LockScreen); - m_lockScreen->lock(); - setWorkspaceVisible(false); - } + enterLockScreen([this]() { m_lockScreen->lock(); }); }); connect(lockScreen, &LockScreenInterface::switchUser, this, [this]() { - if (m_lockScreen && m_lockScreen->available() && currentMode() == Helper::CurrentMode::Normal) { - setCurrentMode(CurrentMode::LockScreen); - m_lockScreen->switchUser(); - setWorkspaceVisible(false); - } + enterLockScreen([this]() { m_lockScreen->switchUser(); }); }); } @@ -2567,11 +2555,7 @@ void Helper::onExtSessionLock(WSessionLock *lock) setCurrentMode(CurrentMode::LockScreen); - if (m_multitaskView) { - m_multitaskView->immediatelyExit(); - } - - deleteTaskSwitch(); + exitMultitaskviewAndTaskSwitch(); setWorkspaceVisible(false); @@ -2845,22 +2829,35 @@ void Helper::setCurrentMode(CurrentMode mode) Q_EMIT currentModeChanged(); } -void Helper::showLockScreen(bool switchToGreeter) +void Helper::exitMultitaskviewAndTaskSwitch() { - if (m_lockScreen->isLocked()) { - return; - } - - if (m_multitaskView) { m_multitaskView->immediatelyExit(); } - deleteTaskSwitch(); +} + +void Helper::enterLockScreen(std::function action) +{ + if (!m_lockScreen || !m_lockScreen->available() || !isNormalOrMultitaskview()) + return; + + exitMultitaskviewAndTaskSwitch(); + setCurrentMode(CurrentMode::LockScreen); + action(); setWorkspaceVisible(false); +} + +void Helper::showLockScreen(bool switchToGreeter) +{ + if (m_lockScreen->isLocked()) { + return; + } + exitMultitaskviewAndTaskSwitch(); setCurrentMode(CurrentMode::LockScreen); m_lockScreen->lock(); + setWorkspaceVisible(false); // send DDM switch to greeter mode if (switchToGreeter) { @@ -2874,6 +2871,11 @@ void Helper::showLockScreen(bool switchToGreeter) } } +void Helper::showShutdownMenu() +{ + enterLockScreen([this]() { m_lockScreen->shutdown(); }); +} + WSeat *Helper::seat() const { return m_seat; diff --git a/src/seat/helper.h b/src/seat/helper.h index b9cd38ece..4b52cf248 100644 --- a/src/seat/helper.h +++ b/src/seat/helper.h @@ -27,6 +27,7 @@ #include #include +#include class QJsonObject; @@ -235,7 +236,15 @@ class Helper : public WSeatEventFilter void setCurrentMode(CurrentMode mode); + bool isNormalOrMultitaskview() const + { + return m_currentMode == CurrentMode::Normal || m_currentMode == CurrentMode::Multitaskview; + } + + void exitMultitaskviewAndTaskSwitch(); + void showLockScreen(bool switchToGreeter = true); + void showShutdownMenu(); Output* getOutputAtCursor() const; @@ -326,6 +335,7 @@ private Q_SLOTS: void allowNonDrmOutputAutoChangeMode(WOutput *output); int indexOfOutput(WOutput *output) const; + void enterLockScreen(std::function action); SurfaceWrapper *keyboardFocusSurface() const; SurfaceWrapper *activatedSurface() const;