diff --git a/shell_client.cpp b/shell_client.cpp --- a/shell_client.cpp +++ b/shell_client.cpp @@ -945,14 +945,20 @@ void ShellClient::setFullScreen(bool set, bool user) { - if (!isFullScreen() && !set) + set = rules()->checkFullScreen(set); + + const bool wasFullscreen = isFullScreen(); + if (wasFullscreen == set) { + return; + } + if (isSpecialWindow()) { return; - if (user && !userCanSetFullScreen()) + } + if (user && !userCanSetFullScreen()) { return; - set = rules()->checkFullScreen(set && !isSpecialWindow()); - setShade(ShadeNone); - bool was_fs = isFullScreen(); - if (was_fs) { + } + + if (wasFullscreen) { workspace()->updateFocusMousePosition(Cursor::pos()); // may cause leave event } else { // in shell surface, maximise mode and fullscreen are exclusive @@ -964,18 +970,19 @@ } } m_fullScreen = set; - if (was_fs == isFullScreen()) - return; + if (set) { untab(); workspace()->raiseClient(this); } RequestGeometryBlocker requestBlocker(this); StackingUpdatesBlocker blocker1(workspace()); GeometryUpdatesBlocker blocker2(this); + workspace()->updateClientLayer(this); // active fullscreens get different layer updateDecoration(false, false); - if (isFullScreen()) { + + if (set) { setGeometry(workspace()->clientArea(FullScreenArea, this)); } else { if (m_geomFsRestore.isValid()) { @@ -989,11 +996,9 @@ setGeometry(QRect(workspace()->clientArea(PlacementArea, this).topLeft(), QSize(0, 0))); } } - updateWindowRules(Rules::Fullscreen|Rules::Position|Rules::Size); - if (was_fs != isFullScreen()) { - emit fullScreenChanged(); - } + updateWindowRules(Rules::Fullscreen|Rules::Position|Rules::Size); + emit fullScreenChanged(); } void ShellClient::setNoBorder(bool set)