Fix saving maximized state on Linux

This commit is contained in:
Ilya Fedin 2020-09-18 13:09:05 +04:00 committed by John Preston
parent 70c993774a
commit 4c2779bbaf
4 changed files with 38 additions and 10 deletions

View file

@ -461,12 +461,6 @@ void MainWindow::initHook() {
handleAppMenuOwnerChanged(service, oldOwner, newOwner); handleAppMenuOwnerChanged(service, oldOwner, newOwner);
}); });
connect(
windowHandle(),
&QWindow::visibleChanged,
this,
[=](bool visible) { handleVisibleChanged(visible); });
if (AppMenuSupported) { if (AppMenuSupported) {
LOG(("Using D-Bus global menu.")); LOG(("Using D-Bus global menu."));
} else { } else {
@ -775,6 +769,9 @@ void MainWindow::createGlobalMenu() {
void MainWindow::updateGlobalMenuHook() { void MainWindow::updateGlobalMenuHook() {
} }
void MainWindow::handleVisibleChangedHook(bool visible) {
}
#else // DESKTOP_APP_DISABLE_DBUS_INTEGRATION #else // DESKTOP_APP_DISABLE_DBUS_INTEGRATION
void MainWindow::createGlobalMenu() { void MainWindow::createGlobalMenu() {
@ -1076,7 +1073,7 @@ void MainWindow::updateGlobalMenuHook() {
ForceDisabled(psClearFormat, !markdownEnabled); ForceDisabled(psClearFormat, !markdownEnabled);
} }
void MainWindow::handleVisibleChanged(bool visible) { void MainWindow::handleVisibleChangedHook(bool visible) {
if (AppMenuSupported && !_mainMenuPath.path().isEmpty()) { if (AppMenuSupported && !_mainMenuPath.path().isEmpty()) {
if (visible) { if (visible) {
RegisterAppMenu(winId(), _mainMenuPath); RegisterAppMenu(winId(), _mainMenuPath);

View file

@ -41,6 +41,7 @@ protected:
void initHook() override; void initHook() override;
void unreadCounterChangedHook() override; void unreadCounterChangedHook() override;
void updateGlobalMenuHook() override; void updateGlobalMenuHook() override;
void handleVisibleChangedHook(bool visible) override;
void initTrayMenuHook() override; void initTrayMenuHook() override;
bool hasTrayIcon() const override; bool hasTrayIcon() const override;
@ -67,7 +68,6 @@ private:
void updateIconCounters(); void updateIconCounters();
void updateWaylandDecorationColors(); void updateWaylandDecorationColors();
void handleVisibleChanged(bool visible);
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
StatusNotifierItem *_sniTrayIcon = nullptr; StatusNotifierItem *_sniTrayIcon = nullptr;

View file

@ -236,6 +236,11 @@ void MainWindow::init() {
&QWindow::windowStateChanged, &QWindow::windowStateChanged,
this, this,
[=](Qt::WindowState state) { handleStateChanged(state); }); [=](Qt::WindowState state) { handleStateChanged(state); });
connect(
windowHandle(),
&QWindow::visibleChanged,
this,
[=](bool visible) { handleVisibleChanged(visible); });
updatePalette(); updatePalette();
@ -278,6 +283,19 @@ void MainWindow::handleActiveChanged() {
}); });
} }
void MainWindow::handleVisibleChanged(bool visible) {
if (visible) {
if (_maximizedBeforeHide) {
DEBUG_LOG(("Window Pos: Window was maximized before hidding, setting maximized."));
setWindowState(Qt::WindowMaximized);
}
} else {
_maximizedBeforeHide = cWindowPos().maximized;
}
handleVisibleChangedHook(visible);
}
void MainWindow::updatePalette() { void MainWindow::updatePalette() {
Ui::ForceFullRepaint(this); Ui::ForceFullRepaint(this);
@ -521,8 +539,15 @@ void MainWindow::updateUnreadCounter() {
} }
void MainWindow::savePosition(Qt::WindowState state) { void MainWindow::savePosition(Qt::WindowState state) {
if (state == Qt::WindowActive) state = windowHandle()->windowState(); if (state == Qt::WindowActive) {
if (state == Qt::WindowMinimized || !positionInited()) return; state = windowHandle()->windowState();
}
if (state == Qt::WindowMinimized
|| !isVisible()
|| !positionInited()) {
return;
}
auto savedPosition = cWindowPos(); auto savedPosition = cWindowPos();
auto realPosition = savedPosition; auto realPosition = savedPosition;

View file

@ -124,6 +124,7 @@ protected:
void savePosition(Qt::WindowState state = Qt::WindowActive); void savePosition(Qt::WindowState state = Qt::WindowActive);
void handleStateChanged(Qt::WindowState state); void handleStateChanged(Qt::WindowState state);
void handleActiveChanged(); void handleActiveChanged();
void handleVisibleChanged(bool visible);
virtual void initHook() { virtual void initHook() {
} }
@ -134,6 +135,9 @@ protected:
virtual void handleActiveChangedHook() { virtual void handleActiveChangedHook() {
} }
virtual void handleVisibleChangedHook(bool visible) {
}
virtual void clearWidgetsHook() { virtual void clearWidgetsHook() {
} }
@ -210,6 +214,8 @@ private:
base::Observable<void> _dragFinished; base::Observable<void> _dragFinished;
rpl::event_stream<> _leaveEvents; rpl::event_stream<> _leaveEvents;
bool _maximizedBeforeHide = false;
}; };
} // namespace Window } // namespace Window