In some setups, the FullScreen action would get out of sync with
the actual window state and thus kick Quassel into an endless loop
and finally a crash when toggling full screen mode.
Turns out reading the docs for KToggleFullScreenAction helped doing
this properly (avoiding this and other bugs when using QWidget's methods).
Thanks to yofel and hays for reporting, and apachelogger for putting
me on the right track for fixing this.
Fixes #1153, fixes #1258.
0, 0))->setCheckable(true);
#ifdef HAVE_KDE
0, 0))->setCheckable(true);
#ifdef HAVE_KDE
- QAction *fullScreenAct = KStandardAction::fullScreen(this, SLOT(toggleFullscreen()), this, coll);
+ QAction *fullScreenAct = KStandardAction::fullScreen(this, SLOT(onFullScreenToggled()), this, coll);
#else
QAction *fullScreenAct = new Action(SmallIcon("view-fullscreen"), tr("&Full Screen Mode"), coll,
#else
QAction *fullScreenAct = new Action(SmallIcon("view-fullscreen"), tr("&Full Screen Mode"), coll,
- this, SLOT(toggleFullscreen()), QKeySequence(Qt::Key_F11));
+ this, SLOT(onFullScreenToggled()), QKeySequence(Qt::Key_F11));
fullScreenAct->setCheckable(true);
#endif
fullScreenAct->setCheckable(true);
#endif
- coll->addAction("ToggleFullscreen", fullScreenAct);
+ coll->addAction("ToggleFullScreen", fullScreenAct);
// Settings
QAction *configureShortcutsAct = new Action(SmallIcon("configure-shortcuts"), tr("Configure &Shortcuts..."), coll,
// Settings
QAction *configureShortcutsAct = new Action(SmallIcon("configure-shortcuts"), tr("Configure &Shortcuts..."), coll,
void MainWin::setupViewMenuTail()
{
_viewMenu->addSeparator();
void MainWin::setupViewMenuTail()
{
_viewMenu->addSeparator();
- _viewMenu->addAction(QtUi::actionCollection("General")->action("ToggleFullscreen"));
+ _viewMenu->addAction(QtUi::actionCollection("General")->action("ToggleFullScreen"));
-void MainWin::toggleFullscreen()
+void MainWin::onFullScreenToggled()
- if (isFullScreen())
- showNormal();
+ // Relying on QWidget::isFullScreen is discouraged, see the KToggleFullScreenAction docs
+ // Also, one should not use showFullScreen() or showNormal(), as those reset all other window flags
+
+ QAction *action = QtUi::actionCollection("General")->action("ToggleFullScreen");
+ if (!action)
+ return;
+
+#ifdef HAVE_KDE
+ KToggleFullScreenAction *kAct = static_cast<KToggleFullScreenAction *>(action);
+ kAct->setFullScreen(this, kAct->isChecked());
+#else
+ if (action->isChecked())
+ setWindowState(windowState() | Qt::WindowFullScreen);
+ setWindowState(windowState() & ~Qt::WindowFullScreen);
+#endif
void showNotificationsDlg();
void showIgnoreList(QString newRule = QString());
void showShortcutsDlg();
void showNotificationsDlg();
void showIgnoreList(QString newRule = QString());
void showShortcutsDlg();
- void toggleFullscreen();
+ void onFullScreenToggled();
void handleCoreConnectionError(const QString &errorMsg);
void userAuthenticationRequired(CoreAccount *, bool *valid, const QString &errorMessage);
void handleCoreConnectionError(const QString &errorMsg);
void userAuthenticationRequired(CoreAccount *, bool *valid, const QString &errorMessage);