From 142454d08e434b3639a60d6e511eb8b570134ace Mon Sep 17 00:00:00 2001 From: WillyJL Date: Sun, 7 Sep 2025 16:55:06 +0200 Subject: [PATCH] Fix keyboard shortcuts when menubar is hidden (#12431) --------- Co-authored-by: Jonathan White --- src/gui/MainWindow.cpp | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 28594e945..035ea8c38 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -1672,9 +1672,16 @@ void MainWindow::applySettingsChanges() m_inactivityTimer->deactivate(); } - m_ui->actionShowToolbar->setChecked(!config()->get(Config::GUI_HideToolbar).toBool()); - m_ui->actionShowMenubar->setChecked(!config()->get(Config::GUI_HideMenubar).toBool()); - m_ui->menubar->setHidden(config()->get(Config::GUI_HideMenubar).toBool()); + auto hideToolbar = config()->get(Config::GUI_HideToolbar).toBool(); + auto hideMenubar = config()->get(Config::GUI_HideMenubar).toBool(); + + m_ui->actionShowToolbar->setChecked(!hideToolbar); + m_ui->actionShowMenubar->setChecked(!hideMenubar); + + // When menubar is hidden with setHidden() the menu keyboard shortcuts are disabled on Wayland, + // so force height of 0 instead and use maximumHeight() > 0 instead of isVisible() elsewhere + m_ui->menubar->setMaximumHeight(hideMenubar ? 0 : QWIDGETSIZE_MAX); + m_ui->toolBar->setHidden(config()->get(Config::GUI_HideToolbar).toBool()); auto movable = config()->get(Config::GUI_MovableToolbar).toBool(); m_ui->toolBar->setMovable(movable); @@ -2187,10 +2194,11 @@ MainWindowEventFilter::MainWindowEventFilter(QObject* parent) m_menubarTimer.setSingleShot(false); connect(&m_menubarTimer, &QTimer::timeout, this, [this] { auto mainwindow = getMainWindow(); - if (mainwindow && mainwindow->m_ui->menubar->isVisible() && config()->get(Config::GUI_HideMenubar).toBool()) { + if (mainwindow && mainwindow->m_ui->menubar->maximumHeight() > 0 + && config()->get(Config::GUI_HideMenubar).toBool()) { // If the menu bar is visible with no active menu, hide it if (!mainwindow->m_ui->menubar->activeAction()) { - mainwindow->m_ui->menubar->setVisible(false); + mainwindow->m_ui->menubar->setMaximumHeight(0); m_altCoolDown.start(); m_menubarTimer.stop(); } @@ -2249,9 +2257,13 @@ bool MainWindowEventFilter::eventFilter(QObject* watched, QEvent* event) if (keyEvent->key() == Qt::Key_Alt && !keyEvent->modifiers() && config()->get(Config::GUI_HideMenubar).toBool() && !m_altCoolDown.isActive()) { auto menubar = mainWindow->m_ui->menubar; - menubar->setVisible(!menubar->isVisible()); - if (menubar->isVisible()) { - menubar->setActiveAction(mainWindow->m_ui->menuFile->menuAction()); + menubar->setMaximumHeight(menubar->maximumHeight() > 0 ? 0 : QWIDGETSIZE_MAX); + if (menubar->maximumHeight() > 0) { + QTimer::singleShot(0, [menubar, mainWindow] { + // Run this with a singleshot timer so it's after menubar->setMaximumHeight() has taken effect, + // otherwise it won't be selected and menubarTimer will hide the menubar instantly + menubar->setActiveAction(mainWindow->m_ui->menuFile->menuAction()); + }); m_menubarTimer.start(); } else { m_menubarTimer.stop();