Skip to content

Commit 5963117

Browse files
committed
fix: refine transient inactive handling in windowed launcher
修复:调整窗口模式启动器瞬时失焦处理 1. Keep the delayed hide/cancel flow for popup active-state transitions to avoid immediate close on short inactive periods. 2. Remove transient search visual-hold and active-focus recovery helpers in windowed mode to support direct behavior comparison during testing. 3. Add active-state trace logs in launcheritem and launchercontroller during investigation, then remove those temporary logs after validation. Log: Preserve no-close behavior for short inactive windows while simplifying search focus handling paths for A/B validation. Influence: 1. Verify Ctrl+Alt+D in X11 windowed mode no longer closes launcher on short inactive transitions. 2. Compare search edit focus/activeFocus behavior before and after removing visual-hold/focus-recovery helpers. 3. Confirm normal outside-click hide path still triggers delayed hide timeout and closes launcher. 1. 保留弹窗active状态变化下的延迟隐藏/取消流程,避免短暂失焦时 立即关闭启动器。 2. 移除窗口模式下搜索框的瞬时样式保持与active焦点恢复辅助逻辑, 便于测试阶段进行直接行为对比。 3. 调试阶段在launcheritem和launchercontroller中加入active状态跟踪 日志,验证后移除临时日志。 Log: 在保留短暂失焦不关闭能力的同时,简化搜索框焦点处理链路以 支持A/B验证。 Influence: 1. 验证X11窗口模式下按Ctrl+Alt+D时,短暂失焦不再导致启动器关闭。 2. 对比移除样式保持/焦点恢复辅助逻辑前后,搜索框focus与 activeFocus的行为差异。 3. 确认点击外部区域时,延迟隐藏超时路径仍按预期关闭启动器。 PMS: BUG-301109
1 parent 10ede0d commit 5963117

3 files changed

Lines changed: 46 additions & 19 deletions

File tree

launchercontroller.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ DGUI_USE_NAMESPACE
2121

2222
namespace {
2323
Q_LOGGING_CATEGORY(logController, "org.deepin.dde.launchpad.controller")
24+
constexpr int kToggleGuardIntervalMs = 1000;
25+
constexpr int kHideDelayIntervalMs = 80;
2426
}
2527

2628
LauncherController::LauncherController(QObject *parent)
2729
: QObject(parent)
2830
, optShow(QStringList{"s", "show"}, tr("Show launcher (hidden by default)"))
2931
, optToggle(QStringList{"t", "toggle"}, tr("Toggle launcher visibility"))
30-
, m_timer(new QTimer(this))
32+
, m_toggleGuardTimer(new QTimer(this))
33+
, m_hideDelayTimer(new QTimer(this))
3134
, m_launcher1Adaptor(new Launcher1Adaptor(this))
3235
, m_visible(false)
3336
{
@@ -40,12 +43,18 @@ LauncherController::LauncherController(QObject *parent)
4043
qCInfo(logController) << "Current frame mode:" << m_currentFrame;
4144

4245
// Interval set to 500=>1000ms for issue https://github.com/linuxdeepin/developer-center/issues/8137
43-
m_timer->setInterval(1000);
44-
m_timer->setSingleShot(true);
45-
connect(m_timer, &QTimer::timeout, this, [this] {
46+
m_toggleGuardTimer->setInterval(kToggleGuardIntervalMs);
47+
m_toggleGuardTimer->setSingleShot(true);
48+
49+
m_hideDelayTimer->setInterval(kHideDelayIntervalMs);
50+
m_hideDelayTimer->setSingleShot(true);
51+
connect(m_hideDelayTimer, &QTimer::timeout, this, [this] {
4652
if (m_pendingHide) {
4753
m_pendingHide = false;
48-
setVisible(false);
54+
if (visible() && m_avoidHide) {
55+
setVisible(false);
56+
m_toggleGuardTimer->start();
57+
}
4958
}
5059
});
5160

@@ -101,10 +110,11 @@ void LauncherController::ShowByMode(qlonglong in0)
101110

102111
void LauncherController::Toggle()
103112
{
104-
if (m_timer->isActive()) {
113+
if (m_toggleGuardTimer->isActive() || m_hideDelayTimer->isActive()) {
105114
qDebug() << "hit";
106115
m_pendingHide = false;
107-
m_timer->stop();
116+
m_toggleGuardTimer->stop();
117+
m_hideDelayTimer->stop();
108118
return;
109119
}
110120
setVisible(!visible());
@@ -152,7 +162,8 @@ void LauncherController::setCurrentFrame(const QString &frame)
152162
m_currentFrame = frame;
153163
qDebug() << "set current frame:" << m_currentFrame;
154164
m_pendingHide = false;
155-
m_timer->start();
165+
m_hideDelayTimer->stop();
166+
m_toggleGuardTimer->start();
156167
emit currentFrameChanged();
157168
}
158169

@@ -176,21 +187,18 @@ void LauncherController::setCurrentScreen(const QString &screen)
176187
// if it's already hidden (`Toggle()` get triggered before `hideWithTimer()` get called).
177188
void LauncherController::hideWithTimer()
178189
{
179-
if (visible()) {
180-
if (m_timer->isActive()) {
181-
m_pendingHide = true;
182-
return;
183-
}
184-
if (m_avoidHide) {
185-
qDebug() << "hide with timer";
186-
setVisible(false);
187-
}
188-
}
190+
if (!visible() || !m_avoidHide) return;
191+
192+
m_pendingHide = true;
193+
m_hideDelayTimer->start();
189194
}
190195

191196
void LauncherController::cancelHide()
192197
{
193198
m_pendingHide = false;
199+
if (m_hideDelayTimer->isActive()) {
200+
m_hideDelayTimer->stop();
201+
}
194202
}
195203

196204
QFont LauncherController::adjustFontWeight(const QFont &f, QFont::Weight weight)

launchercontroller.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ class LauncherController : public QObject
8383
private:
8484
explicit LauncherController(QObject *parent=nullptr);
8585

86-
QTimer *m_timer;
86+
QTimer *m_toggleGuardTimer;
87+
QTimer *m_hideDelayTimer;
8788
Launcher1Adaptor * m_launcher1Adaptor;
8889
bool m_visible;
8990
QString m_currentFrame;

shell-launcher-applet/package/launcheritem.qml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ AppletItem {
265265

266266
PanelPopup {
267267
id: windowedModeLauncher
268+
closeOnInactive: false
268269

269270
property bool visibility: LauncherController.visible && (LauncherController.currentFrame === "WindowedFrame")
270271

@@ -278,6 +279,7 @@ AppletItem {
278279
width, height)
279280

280281
WindowedFrame {
282+
id: windowedFrameContent
281283
anchors.fill: parent
282284
}
283285

@@ -295,6 +297,22 @@ AppletItem {
295297
if (popupVisible !== visibility) {
296298
LauncherController.visible = popupVisible
297299
}
300+
if (!popupVisible) {
301+
LauncherController.cancelHide()
302+
}
303+
}
304+
}
305+
306+
Connections {
307+
target: windowedModeLauncher.popupWindow
308+
function onActiveChanged() {
309+
if (LauncherController.currentFrame !== "WindowedFrame") return
310+
if (!windowedModeLauncher.popupVisible) return
311+
if (!windowedModeLauncher.popupWindow.active) {
312+
LauncherController.hideWithTimer()
313+
return
314+
}
315+
LauncherController.cancelHide()
298316
}
299317
}
300318

0 commit comments

Comments
 (0)