Skip to content

Commit 70b89c6

Browse files
authored
Fix close glitch
1 parent 1c043e5 commit 70b89c6

3 files changed

Lines changed: 41 additions & 8 deletions

File tree

src/AppMenuButtonGroup.cc

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,22 @@ AppMenuButtonGroup::AppMenuButtonGroup(Decoration *decoration)
8989
m_delayedCacheTimer->setInterval(200);
9090
m_delayedCacheTimer->setSingleShot(true);
9191
connect(m_delayedCacheTimer, &QTimer::timeout, this, &AppMenuButtonGroup::onDelayedCacheTimerTimeout);
92+
93+
m_resetTimer = new QTimer(this);
94+
m_resetTimer->setInterval(250);
95+
m_resetTimer->setSingleShot(true);
96+
connect(m_resetTimer, &QTimer::timeout, this, &AppMenuButtonGroup::resetButtons);
97+
98+
m_menuLoadFallbackTimer = new QTimer(this);
99+
m_menuLoadFallbackTimer->setInterval(2000);
100+
m_menuLoadFallbackTimer->setSingleShot(true);
101+
connect(m_menuLoadFallbackTimer, &QTimer::timeout, this, [this]() {
102+
if (!m_menuLoadedOnce) {
103+
m_menuLoadedOnce = true;
104+
Q_EMIT menuUpdated();
105+
}
106+
});
107+
92108
// Assign showing and opacity before we bind the onShowingChanged animation
93109
// so that new windows do not animate.
94110
setAlwaysShow(decoration->menuAlwaysShow());
@@ -350,6 +366,10 @@ void AppMenuButtonGroup::onMenuReadyForSearch()
350366
void AppMenuButtonGroup::onHasApplicationMenuChanged(bool hasMenu)
351367
{
352368
if (hasMenu) {
369+
if (!m_menuLoadedOnce) {
370+
m_menuLoadFallbackTimer->start();
371+
}
372+
353373
if (m_isMenuUpdateThrottled) {
354374
m_pendingMenuUpdate = true;
355375
return;
@@ -361,7 +381,10 @@ void AppMenuButtonGroup::onHasApplicationMenuChanged(bool hasMenu)
361381
m_menuUpdateDebounceTimer->stop();
362382
m_isMenuUpdateThrottled = false;
363383
m_pendingMenuUpdate = false;
364-
resetButtons();
384+
m_menuLoadFallbackTimer->stop();
385+
386+
// Defer reset to avoid flicker during window closure
387+
m_resetTimer->start();
365388
m_menuLoadedOnce = false;
366389
}
367390
}
@@ -410,14 +433,13 @@ void AppMenuButtonGroup::performDebouncedMenuUpdate()
410433
if (!serviceName.isEmpty() && !menuObjectPath.isEmpty()) {
411434
m_appMenuModel->updateApplicationMenu(serviceName, menuObjectPath);
412435
} else {
413-
resetButtons();
436+
m_resetTimer->start();
414437
}
415438
}
416439
}
417440

418441
void AppMenuButtonGroup::updateAppMenuModel()
419442
{
420-
m_menuLoadedOnce = true;
421443
auto *deco = qobject_cast<Decoration *>(decoration());
422444
if (!deco) {
423445
return;
@@ -426,12 +448,13 @@ void AppMenuButtonGroup::updateAppMenuModel()
426448

427449
// Don't display AppMenu in modal windows.
428450
if (decoratedClient->isModal()) {
429-
resetButtons();
451+
m_resetTimer->start();
430452
return;
431453
}
432454

433455
if (!decoratedClient->hasApplicationMenu()) {
434-
resetButtons();
456+
// Defer reset to avoid flicker during window closure
457+
m_resetTimer->start();
435458
return;
436459
}
437460

@@ -440,10 +463,15 @@ void AppMenuButtonGroup::updateAppMenuModel()
440463

441464
QMenu *menu = m_appMenuModel->menu();
442465
if (!menu) {
443-
resetButtons();
466+
// Defer reset to avoid flicker during window closure
467+
m_resetTimer->start();
444468
return;
445469
}
446470

471+
m_resetTimer->stop();
472+
m_menuLoadFallbackTimer->stop();
473+
m_menuLoadedOnce = true;
474+
447475
const auto actions = menu->actions();
448476
const int menuActionCount = actions.count();
449477

@@ -488,7 +516,7 @@ void AppMenuButtonGroup::updateAppMenuModel()
488516
filterMenu(m_lastSearchQuery);
489517
}
490518
} else {
491-
resetButtons();
519+
resetButtons(); // Immediate reset is intended here for structural changes
492520

493521
// Populate
494522
for (int i = 0; i < menuActionCount; ++i) {

src/AppMenuButtonGroup.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,9 @@ private slots:
187187
QPointer<QLineEdit> m_searchLineEdit;
188188
QTimer *m_searchDebounceTimer;
189189
QTimer *m_menuUpdateDebounceTimer;
190-
191190
QTimer *m_delayedCacheTimer;
191+
QTimer *m_resetTimer;
192+
QTimer *m_menuLoadFallbackTimer;
192193

193194
bool m_searchUiVisible = false;
194195

src/Decoration.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,6 +1276,10 @@ void Decoration::paintCaption(QPainter *painter, const QRectF &repaintRegion) co
12761276
m_captionCache.alignment = alignment;
12771277
m_captionCache.elidedCaption = fontMetrics.elidedText(fullCaption, Qt::ElideMiddle, drawingRect.width());
12781278
}
1279+
1280+
//qCDebug(category) << "Caption: :" << decoratedClient->caption();
1281+
//qCDebug(category) << " hasAppMenu: " << hasAppMenu;
1282+
//qCDebug(category) << " menuLoaded: " << menuLoaded;
12791283

12801284
painter->drawText(drawingRect, alignment | Qt::TextSingleLine | Qt::AlignVCenter, m_captionCache.elidedCaption);
12811285
painter->restore();

0 commit comments

Comments
 (0)