Skip to content

Commit 7ab7777

Browse files
authored
Fix caption glitch on open
1 parent 70b89c6 commit 7ab7777

3 files changed

Lines changed: 26 additions & 14 deletions

File tree

src/AppMenuButtonGroup.cc

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ AppMenuButtonGroup::AppMenuButtonGroup(Decoration *decoration)
9696
connect(m_resetTimer, &QTimer::timeout, this, &AppMenuButtonGroup::resetButtons);
9797

9898
m_menuLoadFallbackTimer = new QTimer(this);
99-
m_menuLoadFallbackTimer->setInterval(2000);
99+
m_menuLoadFallbackTimer->setInterval(750);
100100
m_menuLoadFallbackTimer->setSingleShot(true);
101101
connect(m_menuLoadFallbackTimer, &QTimer::timeout, this, [this]() {
102102
if (!m_menuLoadedOnce) {
@@ -148,6 +148,10 @@ AppMenuButtonGroup::AppMenuButtonGroup(Decoration *decoration)
148148

149149
if (decoratedClient->hasApplicationMenu()) {
150150
onHasApplicationMenuChanged(true);
151+
} else {
152+
// Initial wait to see if a menu appears later during startup.
153+
// This avoids the title appearing and then shifting.
154+
m_menuLoadFallbackTimer->start(500);
151155
}
152156
}
153157

@@ -366,9 +370,10 @@ void AppMenuButtonGroup::onMenuReadyForSearch()
366370
void AppMenuButtonGroup::onHasApplicationMenuChanged(bool hasMenu)
367371
{
368372
if (hasMenu) {
369-
if (!m_menuLoadedOnce) {
370-
m_menuLoadFallbackTimer->start();
371-
}
373+
m_resetTimer->stop();
374+
m_menuLoadedOnce = false;
375+
m_menuLoadFallbackTimer->start(750);
376+
Q_EMIT menuUpdated();
372377

373378
if (m_isMenuUpdateThrottled) {
374379
m_pendingMenuUpdate = true;
@@ -386,6 +391,7 @@ void AppMenuButtonGroup::onHasApplicationMenuChanged(bool hasMenu)
386391
// Defer reset to avoid flicker during window closure
387392
m_resetTimer->start();
388393
m_menuLoadedOnce = false;
394+
Q_EMIT menuUpdated();
389395
}
390396
}
391397

@@ -468,10 +474,6 @@ void AppMenuButtonGroup::updateAppMenuModel()
468474
return;
469475
}
470476

471-
m_resetTimer->stop();
472-
m_menuLoadFallbackTimer->stop();
473-
m_menuLoadedOnce = true;
474-
475477
const auto actions = menu->actions();
476478
const int menuActionCount = actions.count();
477479

@@ -566,6 +568,12 @@ void AppMenuButtonGroup::updateAppMenuModel()
566568
}
567569
}
568570

571+
if (menuActionCount > 0) {
572+
m_resetTimer->stop();
573+
m_menuLoadFallbackTimer->stop();
574+
m_menuLoadedOnce = true;
575+
}
576+
569577
Q_EMIT menuUpdated();
570578
}
571579
}
@@ -682,6 +690,11 @@ bool AppMenuButtonGroup::menuLoadedOnce() const
682690
return m_menuLoadedOnce;
683691
}
684692

693+
bool AppMenuButtonGroup::isWaitingForMenu() const
694+
{
695+
return m_menuLoadFallbackTimer && m_menuLoadFallbackTimer->isActive();
696+
}
697+
685698
void AppMenuButtonGroup::popupMenu(QMenu *menu, int buttonIndex)
686699
{
687700
// Stop any caching that may be in progress from a previously opened menu.

src/AppMenuButtonGroup.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class AppMenuButtonGroup : public KDecoration3::DecorationButtonGroup
7373
qreal visibleWidth() const;
7474

7575
bool menuLoadedOnce() const;
76+
bool isWaitingForMenu() const;
7677

7778
void handleHoverMove(const QPointF &pos);
7879

src/Decoration.cc

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,12 +1163,13 @@ void Decoration::paintCaption(QPainter *painter, const QRectF &repaintRegion) co
11631163
{
11641164
// 1. Pre-checks and data gathering
11651165
const auto *decoratedClient = window();
1166-
const bool hasAppMenu = decoratedClient->hasApplicationMenu();
11671166
const bool appMenuVisible = !m_menuButtons->buttons().isEmpty();
1168-
const bool menuLoaded = m_menuButtons->menuLoadedOnce();
1167+
const bool isWaitingForMenu = m_menuButtons->isWaitingForMenu();
1168+
const bool menuLoadedOnce = m_menuButtons->menuLoadedOnce();
1169+
const bool hasAppMenu = decoratedClient->hasApplicationMenu();
11691170
const bool isTitleHidden = m_internalSettings->titleAlignment() == InternalSettings::TitleHidden;
11701171

1171-
if ((hasAppMenu && !menuLoaded) || isTitleHidden) {
1172+
if (isTitleHidden || (!menuLoadedOnce && (isWaitingForMenu || hasAppMenu))) {
11721173
m_captionLimited = false;
11731174
m_captionRect = QRectF();
11741175
return;
@@ -1277,9 +1278,6 @@ void Decoration::paintCaption(QPainter *painter, const QRectF &repaintRegion) co
12771278
m_captionCache.elidedCaption = fontMetrics.elidedText(fullCaption, Qt::ElideMiddle, drawingRect.width());
12781279
}
12791280

1280-
//qCDebug(category) << "Caption: :" << decoratedClient->caption();
1281-
//qCDebug(category) << " hasAppMenu: " << hasAppMenu;
1282-
//qCDebug(category) << " menuLoaded: " << menuLoaded;
12831281

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

0 commit comments

Comments
 (0)