[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1110538: marked as done (unblock: lomiri/0.5.0-4)



Your message dated Thu, 14 Aug 2025 13:52:43 +0200
with message-id <906e549b-f761-4c21-b196-54e704c4bee0@debian.org>
and subject line close all open unblock requests, the trixie release happened
has caused the Debian Bug report #1110538,
regarding unblock: lomiri/0.5.0-4
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1110538: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1110538
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: lomiri@packages.debian.org
Control: affects -1 + src:lomiri
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package lomiri

This might come to late for the trixie release.

I have been sick over the past days and did not want to send this
unblock before some thorough testing. But it would be cool to get lomiri
0.5.0-4 (and current qtmir from unstable) into trixie.

[ Reason ]

CHANGES in 0.5.0-4:

+  * debian/patches:
+    + Add 0031_faster-session-exit.patch. Exit out of the process with the
+      respective exit code.

-> This accelerates the session logout and also the LightDM Greeter
teardown tremendously, so they now happen quasi in real time. Without
this patch you can observe irregular delays. Also, Lomiri Greeter
processes stay on in background long after the user has already logged
in.

+    + Add 0032_dont-ask-for-SIM-PIN-in-greeter.patch. Don't ask for SIM PIN in
+      login manager.

-> In LightDM Greeter mode, Lomiri should not offer the SIM PIN dialog. This should only
be queried after session login.

+    + Add 0033_remove-dangling-window-decorations-from-model.patch. qml &
+      plugins: Remove dangling window decorations from model. Latch onto
+      MirSurface signal indicating it's not being displayed anymore, and
+      remove the window from the TopLevelWindowModel when required.

-> Apps that can be launched multiple times (not all Lomiri apps support
that), such as lomiri-terminal-app, tear down the full Lomiri session if
you close one of the running apps. This patchset works around that and
at the end, the individual instance of the app gets closed.

This patch works around the problem but does not provide the fix that a
few days ago has been merged into upstream lomiri. For the first point
release we will replace this patch.

This patch 0033 requires a code change in qtmir, which I will send a
separate unblock request for.

+    + Add 0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch. Add
+      apps in fullscreen mode when Lomiri operates in tablet/phone mode. Fixes
+      non-maximized window content, but maximized window decorations for
+      GTK-3+4 applications when Lomiri is in staged mode.

-> When in tablet mode, GTK-3+4 apps open in non-fullscreen mode while
lomiri operates in every-window-is-always-fullscreen mode. This leads to
small windows with a large gray border around those apps (native lomiri
apps can handle this well). To work around this problem, all apps now
receive a maximize request when being created.

Unfortunately, I forgot one entry in d/changelog for the 0.5.0-4 upload
(I have added it post-upload for the next unstable upload and will also
cherry-pick it to the next trixie update of the package):

+  * debian/control:
+    + Update versioned D:s on qtmir & co.


CHANGES in 0.5.0-3:

+  * debian/control:
+    + Add to R: (lomiri): lomiri-indicator-location.

-> The location indicator should be installed with lomiri when
installing Lomiri from scratch.

+  * debian/patches:
+    + Add 1007_fix-scrolling-issues.patch. Fix scrolling issue. In desktop/
+      windowed mode make sure that scroll events get translated to Lomiri
+      coordinates, so that content directly under the mouse pointer is scrolled
+      and not something else elsewhere on the screen.

-> In Lomiri when operating it with a mouse pointer, we observed
glitches in the positioning of the mousepointer and the resulting scroll
event. The scroll event did not end up directly under the mouse pointer,
but always a bit next to it. This lead to users having to move the
pointer left of a window, to scroll inside that window. Patch 1007 fixes that.

+    + Add 1018a_Add-shortcut-to-toggle-side-stage.patch and 1018b_Add-shortcut-
+      for-moving-apps-between-stages.patch. Support moving apps between main
+      stage and side stage via hotkeys.

-> This adds hotkey support for enabling the side stage and moving apps to
the side stage in staged mode via the keyboard.

+    + Add 1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch. Make
+      fullscreen switching more smooth.

-> Rendering improvement, make window switching to fullscreen more
smooth (using less ressources).

+    + Add patches 1021 - 1028. Various Lomiri-on-desktop improvements esp. for
+      managing non-Lomiri windows (such as windows drawn via GTK, Xwayland,
+      etc.).

-> This adds various patches that fix multiple things on desktop, short summary:

  * patch 1021: Include launcher width when calculating the workspace
    switcher position
  * patch 1022: enable live blur when in windowed mode for more accurate
    effects on desktop systems where resources aren't scarce
  * patch 1023: in Stage view: drop smooth propert assignment to stay uniform across all users of MirSurfaceItem
  * patch 1024: Resize Window Decoration with app surfaces (e.g. gray area around GIMP's splash window)
  * patch 1025: pass down clip boolean down to SurfaceContainer.qml (needed for patch 1027)
  * patch 1027: pass down the Stage to the SurfaceContainer.qml to detect whether windowed applications shall be
    clipped in the stage (fix windows of different size in the application switcher of Lomiri)
  * patch 1026: prevent non-resizable windows from being resized
  * patch 1028: center the workspace preview in its parent horizontally

+    + Whitespace-fix in 1005_cursor-always-follow-cursor-position-from-mir.patch
+      and 1007_fix-scrolling-issues.patch.

-> noop changes

[ Impact ]
Many UI improvements won't land in Debian 13.

[ Tests ]
Loads of tests on different hardware devices (Lomiri on desktop, Lomiri on tablet).

[ Risks ]
Various for Lomiri users. Lomiri in Debian 13 still has
several issues and we plan to stabilize severe UI glitches over the Debian 13 cycle via point release updates.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
Relevant for Lomiri in Debian.

unblock lomiri/0.5.0-4
diff -Nru lomiri-0.5.0/debian/changelog lomiri-0.5.0/debian/changelog
--- lomiri-0.5.0/debian/changelog	2025-06-14 00:42:03.000000000 +0200
+++ lomiri-0.5.0/debian/changelog	2025-07-30 14:42:25.000000000 +0200
@@ -1,3 +1,43 @@
+lomiri (0.5.0-4) unstable; urgency=medium
+
+  * debian/patches:
+    + Add 0031_faster-session-exit.patch. Exit out of the process with the
+      respective exit code.
+    + Add 0032_dont-ask-for-SIM-PIN-in-greeter.patch. Don't ask for SIM PIN in
+      login manager.
+    + Add 0033_remove-dangling-window-decorations-from-model.patch. qml &
+      plugins: Remove dangling window decorations from model. Latch onto
+      MirSurface signal indicating it's not being displayed anymore, and
+      remove the window from the TopLevelWindowModel when required.
+    + Add 0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch. Add
+      apps in fullscreen mode when Lomiri operates in tablet/phone mode. Fixes
+      non-maximized window content, but maximized window decorations for
+      GTK-3+4 applications when Lomiri is in staged mode.
+
+ -- Mike Gabriel <sunweaver@debian.org>  Wed, 30 Jul 2025 14:42:25 +0200
+
+lomiri (0.5.0-3) unstable; urgency=medium
+
+  * debian/control:
+    + Add to R: (lomiri): lomiri-indicator-location.
+  * debian/patches:
+    + Add 1007_fix-scrolling-issues.patch. Fix scrolling issue. In desktop/
+      windowed mode make sure that scroll events get translated to Lomiri
+      coordinates, so that content directly under the mouse pointer is scrolled
+      and not something else elsewhere on the screen.
+    + Add 1018a_Add-shortcut-to-toggle-side-stage.patch and 1018b_Add-shortcut-
+      for-moving-apps-between-stages.patch. Support moving apps between main
+      stage and side stage via hotkeys.
+    + Add 1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch. Make
+      fullscreen switching more smooth.
+    + Add patches 1021 - 1028. Various Lomiri-on-desktop improvements esp. for
+      managing non-Lomiri windows (such as windows drawn via GTK, Xwayland,
+      etc.).
+    + Whitespace-fix in 1005_cursor-always-follow-cursor-position-from-mir.patch
+      and 1007_fix-scrolling-issues.patch.
+
+ -- Mike Gabriel <sunweaver@debian.org>  Thu, 24 Jul 2025 11:56:04 +0200
+
 lomiri (0.5.0-2) unstable; urgency=medium
 
   * debian/patches:
diff -Nru lomiri-0.5.0/debian/control lomiri-0.5.0/debian/control
--- lomiri-0.5.0/debian/control	2025-05-10 10:44:26.000000000 +0200
+++ lomiri-0.5.0/debian/control	2025-07-30 14:42:25.000000000 +0200
@@ -29,7 +29,7 @@
  libpam0g-dev,
  libpulse-dev,
  libqmenumodel-dev (>= 0.2.12),
- libqtmirserver-dev (>= 0.8.0~git20250305.794fa12-2~),
+ libqtmirserver-dev (>= 0.8.0~git20250407.ea2f477-2~),
  libmiroil-dev,
  libmiral-dev,
  libqt5sql5-sqlite,
@@ -71,7 +71,7 @@
  qml-module-lomiri-settings-components,
  qml-module-lomiri-settings-menus,
  qml-module-lomiri-test <!nocheck>,
- qml-module-qtmir (>= 0.8.0~git20250305.794fa12-2~),
+ qml-module-qtmir (>= 0.8.0~git20250407.ea2f477-2~),
  qtbase5-dev (>= 5.6),
  qtbase5-dev-tools,
  qtbase5-private-dev (>= 5.6),
@@ -146,12 +146,12 @@
  qml-module-qmenumodel1,
  qml-module-qt-labs-folderlistmodel,
  qml-module-qt-labs-settings,
- qml-module-qtmir (>= 0.8.0~git20250305.794fa12-2~),
+ qml-module-qtmir (>= 0.8.0~git20250407.ea2f477-2~),
  qml-module-qtqml-statemachine,
  qml-module-qtquick-xmllistmodel,
  qml-module-qtsysteminfo,
  qml-module-hfd,
- qtmir (>= 0.8.0~git20250305.794fa12-2~),
+ qtmir (>= 0.8.0~git20250407.ea2f477-2~),
  lomiri-indicator-datetime,
  lomiri-indicator-network,
  lomiri-system-settings (>= 1.2.0-1~),
@@ -168,6 +168,7 @@
  lomiri-greeter,
  lomiri-greeter-session-broadcast,
  lomiri-indicator-transfer,
+ lomiri-indicator-location,
  lomiri-polkit-agent,
  lomiri-keyboard,
 Breaks:
diff -Nru lomiri-0.5.0/debian/patches/0031_faster-session-exit.patch lomiri-0.5.0/debian/patches/0031_faster-session-exit.patch
--- lomiri-0.5.0/debian/patches/0031_faster-session-exit.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/0031_faster-session-exit.patch	2025-07-28 15:48:05.000000000 +0200
@@ -0,0 +1,26 @@
+From e45437266c7930190373f20edf4640c1efe98011 Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Tue, 22 Jul 2025 08:56:08 +0200
+Subject: [PATCH] src: Fix Quits & Exits from QML
+
+Exit out of the process with the respective exit code.
+---
+ src/LomiriApplication.cpp | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+--- a/src/LomiriApplication.cpp
++++ b/src/LomiriApplication.cpp
+@@ -135,5 +135,12 @@
+ 
+     m_qmlEngine->setNetworkAccessManagerFactory(new CachingNetworkManagerFactory);
+ 
+-    QObject::connect(m_qmlEngine, &QQmlEngine::quit, this, &QGuiApplication::quit);
++    QObject::connect(m_qmlEngine, &QQmlEngine::quit, this, [=](){
++        qDebug().nospace().noquote() << "Quitting Lomiri... Bye!";
++        ::exit(0);
++    });
++    QObject::connect(m_qmlEngine, &QQmlEngine::exit, this, [=](int ret){
++        qDebug().nospace().noquote() << "Exiting Lomiri... Bye!";
++        ::exit(ret);
++    });
+ }
diff -Nru lomiri-0.5.0/debian/patches/0032_dont-ask-for-SIM-PIN-in-greeter.patch lomiri-0.5.0/debian/patches/0032_dont-ask-for-SIM-PIN-in-greeter.patch
--- lomiri-0.5.0/debian/patches/0032_dont-ask-for-SIM-PIN-in-greeter.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/0032_dont-ask-for-SIM-PIN-in-greeter.patch	2025-07-28 15:52:23.000000000 +0200
@@ -0,0 +1,31 @@
+From 5bc8ad64cb761e0cf0bc61a72e73a02be3400580 Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Tue, 17 Jun 2025 15:52:09 +0200
+Subject: [PATCH] qml: Don't ask for SIM PIN in greeter mode
+
+UX wise it is annoying to have the SIM PIN dialog take over
+the screen twice, so avoid calling it twice with fscrypt enabled.
+
+I call this a win since it fixes UX repetition ("if I want it
+gone don't ask me again, goodbye") as well as hiding a problem
+of failing DNS requests from various apps when resolving DNS.
+---
+ qml/Shell.qml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/qml/Shell.qml b/qml/Shell.qml
+index de801a071..0c3494f76 100644
+--- a/qml/Shell.qml
++++ b/qml/Shell.qml
+@@ -765,7 +765,7 @@ StyledItem {
+             deferred: shell.mode === "greeter"
+ 
+             function unlockWhenDoneWithWizard() {
+-                if (!active) {
++                if (!active && shell.mode !== "greeter") {
+                     ModemConnectivity.unlockAllModems();
+                 }
+             }
+-- 
+GitLab
+
diff -Nru lomiri-0.5.0/debian/patches/0033_remove-dangling-window-decorations-from-model.patch lomiri-0.5.0/debian/patches/0033_remove-dangling-window-decorations-from-model.patch
--- lomiri-0.5.0/debian/patches/0033_remove-dangling-window-decorations-from-model.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/0033_remove-dangling-window-decorations-from-model.patch	2025-07-29 10:18:09.000000000 +0200
@@ -0,0 +1,53 @@
+From 4c9f7a1da8f67994e616ef0ddf289a8694af93ad Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Sat, 26 Jul 2025 16:52:48 +0200
+Subject: [PATCH] qml & plugins: Remove dangling window decorations from model
+
+Latch onto MirSurface signal indicating it's being torn down,
+and remove the window from the TopLevelWindowModel when required.
+---
+ plugins/WindowManager/TopLevelWindowModel.h |  6 +++++-
+ qml/Stage/Stage.qml                         | 10 ++++++++++
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+--- a/plugins/WindowManager/TopLevelWindowModel.h
++++ b/plugins/WindowManager/TopLevelWindowModel.h
+@@ -160,6 +160,11 @@
+     Q_INVOKABLE Window *windowAt(int index) const;
+ 
+     /**
++     * @brief Removes a window from the model at the given index
++     */
++    Q_INVOKABLE void removeAt(int index);
++
++    /**
+      * @brief Returns the application at the given index
+      */
+     Q_INVOKABLE lomiri::shell::application::ApplicationInfoInterface *applicationAt(int index) const;
+@@ -232,7 +237,6 @@
+     void setFocusedWindow(Window *window);
+     void removeInputMethodWindow();
+     void deleteAt(int index);
+-    void removeAt(int index);
+     void removeSurfaces(const QVector<lomiri::shell::application::MirSurfaceInterface *> surfaces);
+ 
+     void addApplication(lomiri::shell::application::ApplicationInfoInterface *application);
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -1083,6 +1083,16 @@
+                 }
+                 z: normalZ
+ 
++                Connections {
++                    target: decoratedWindow.surface
++                    function onTeardownRequested() {
++                        if (!decoratedWindow.surface)
++                            return;
++
++                        topLevelSurfaceList.removeAt(appRepeater.indexOf(appDelegate));
++                    }
++                }
++
+                 opacity: fakeDragItem.surface == model.window.surface && fakeDragItem.Drag.active ? 0 : 1
+                 Behavior on opacity { LomiriNumberAnimation {} }
+ 
diff -Nru lomiri-0.5.0/debian/patches/0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch lomiri-0.5.0/debian/patches/0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch
--- lomiri-0.5.0/debian/patches/0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch	2025-07-29 10:18:17.000000000 +0200
@@ -0,0 +1,26 @@
+From 6acad45a55bcfe2aa6e1e2974ebcf79b5881e4be Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Sun, 1 Dec 2024 16:07:21 +0100
+Subject: [PATCH] qml: Spawn windows maximized on phones & tablets
+
+Make all app windows maximized once spawned in staged modes.
+Has more effect on for example GTK applications, which now
+fill the screen with window contents instead of spawning with
+extents and window shadows.
+---
+ qml/Stage/Stage.qml | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -1449,6 +1449,10 @@
+ 
+                     updateQmlFocusFromMirSurfaceFocus();
+ 
++                    // Make apps maximized on phones & tablets
++                    if (root.mode == "staged" || root.mode == "stagedWithSideStage")
++                        appDelegate.maximize()
++
+                     refreshStage();
+                     _constructing = false;
+                 }
diff -Nru lomiri-0.5.0/debian/patches/1005_cursor-always-follow-cursor-position-from-mir.patch lomiri-0.5.0/debian/patches/1005_cursor-always-follow-cursor-position-from-mir.patch
--- lomiri-0.5.0/debian/patches/1005_cursor-always-follow-cursor-position-from-mir.patch	2025-06-13 23:52:55.000000000 +0200
+++ lomiri-0.5.0/debian/patches/1005_cursor-always-follow-cursor-position-from-mir.patch	2025-07-24 11:39:08.000000000 +0200
@@ -33,7 +33,7 @@
 +                oldPos = me->screenPos();
 +            }
 +            else {
-+                 oldPos = pointer->window()->geometry().topLeft() + pointer->position();
++                oldPos = pointer->window()->geometry().topLeft() + pointer->position();
 +            }
              QPointF newPos = adjustedPositionForMovement(oldPos, movement);
  
diff -Nru lomiri-0.5.0/debian/patches/1007_fix-scrolling-issues.patch lomiri-0.5.0/debian/patches/1007_fix-scrolling-issues.patch
--- lomiri-0.5.0/debian/patches/1007_fix-scrolling-issues.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1007_fix-scrolling-issues.patch	2025-07-24 15:25:42.000000000 +0200
@@ -0,0 +1,58 @@
+From 51b08756b48c295e0a136b26fd3c2d2b32e5e620 Mon Sep 17 00:00:00 2001
+From: Cedric CHEDALEUX <cedric.chedaleux@orange.com>
+Date: Thu, 3 Jul 2025 22:57:45 +0200
+Subject: [PATCH] cursor: fix scroll issues
+
+InputEventDispatcher filters the MouseEvent coming from the underlying Mir stack
+to adjust the position of the cursor in Lomiri system. Lomiri cursor
+position depends on the screen(s) configuration (virtual touch pad on phone screen,
+oriented shell, center reset position). The cursor bounds are also
+different from the screen geometry to trigger gestures.
+
+Only Mouse events (MouseMove, MouseButtons) are adjusted so far. The wheel
+events are propagated up to the top window and QML items and they
+still hold a global position of Mir and not the adjusted Lomiri one.
+
+Let's also adjust the position for WheelEvent.
+
+
+
+Bug: https://salsa.debian.org/ubports-team/qtmir/-/issues/6
+
+
+Signed-off-by: Cedric CHEDALEUX <cedric.chedaleux@orange.com>
+---
+ plugins/Cursor/InputDispatcherFilter.cpp | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+--- a/plugins/Cursor/InputDispatcherFilter.cpp
++++ b/plugins/Cursor/InputDispatcherFilter.cpp
+@@ -127,6 +127,28 @@
+             o->event(&eCopy);
+             return true;
+         }
++        // Adjust position for Wheel event the same way as mouse events
++        case QEvent::Wheel:
++        {
++            // if we don't have any pointers, filter all mouse events.
++            auto pointer = currentPointer();
++            if (!pointer || !pointer->window()) return true;
++
++            QWheelEvent* we = static_cast<QWheelEvent*>(e);
++
++            // Local position gives relative change of mouse pointer.
++            QPointF movement = we->position();
++
++            // Adjust the position
++            QPointF oldPos = pointer->window()->geometry().topLeft() + pointer->position();
++            QPointF newPos = adjustedPositionForMovement(oldPos, movement);
++
++            // Send the event
++            QWheelEvent eCopy(we->position(), newPos, we->pixelDelta(), we->angleDelta(), we->buttons(), we->modifiers(), we->phase(), we->inverted());
++            eCopy.setTimestamp(we->timestamp());
++            o->event(&eCopy);
++            return true;
++        }
+         default:
+             break;
+     }
diff -Nru lomiri-0.5.0/debian/patches/1018a_Add-shortcut-to-toggle-side-stage.patch lomiri-0.5.0/debian/patches/1018a_Add-shortcut-to-toggle-side-stage.patch
--- lomiri-0.5.0/debian/patches/1018a_Add-shortcut-to-toggle-side-stage.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1018a_Add-shortcut-to-toggle-side-stage.patch	2025-07-11 18:07:09.000000000 +0200
@@ -0,0 +1,82 @@
+From 87dc5915f263cb0038113ffe99c5211880eaf5aa Mon Sep 17 00:00:00 2001
+From: kugiigi <kugi_eusebio@protonmail.com>
+Date: Fri, 11 Jul 2025 16:02:43 +0200
+Subject: [PATCH 1/2] Add shortcut to toggle side stage.
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Components/KeyboardShortcutsOverlay.qml | 14 ++++++++++++
+ qml/Stage/Stage.qml                         | 25 ++++++++++++++++-----
+ 2 files changed, 33 insertions(+), 6 deletions(-)
+
+--- a/qml/Components/KeyboardShortcutsOverlay.qml
++++ b/qml/Components/KeyboardShortcutsOverlay.qml
+@@ -241,6 +241,20 @@
+                 }
+ 
+                 Label {
++                    text: i18n.tr("Super + S")
++                    fontSize: "small"
++                    font.weight: Font.Medium
++                }
++
++                Label {
++                    text: i18n.tr("Shows or hides the side stage.")
++                    fontSize: "small"
++                    font.weight: Font.Light
++                    wrapMode: Text.Wrap
++                    Layout.maximumWidth: maxTextSize
++                }
++
++                Label {
+                     text: i18n.tr("Cursor Left or Right")
+                     fontSize: "small"
+                     font.weight: Font.Medium
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -221,6 +221,15 @@
+     }
+ 
+     GlobalShortcut {
++        id: toggleSideStageShortcut
++        shortcut: Qt.MetaModifier|Qt.Key_S
++        active: priv.sideStageEnabled
++        onTriggered: {
++           priv.toggleSideStage()
++        }
++    }
++
++    GlobalShortcut {
+         id: minimizeAllShortcut
+         shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_D
+         onTriggered: priv.minimizeAllWindows()
+@@ -418,6 +427,15 @@
+             }
+         }
+ 
++        function toggleSideStage() {
++            if (sideStage.shown) {
++                sideStage.hide();
++            } else  {
++                sideStage.show();
++                updateMainAndSideStageIndexes()
++            }
++        }
++
+         function updateMainAndSideStageIndexes() {
+             if (root.mode != "stagedWithSideStage") {
+                 priv.sideStageDelegate = null;
+@@ -2417,12 +2435,7 @@
+         }
+ 
+         onClicked: {
+-            if (sideStage.shown) {
+-                sideStage.hide();
+-            } else  {
+-                sideStage.show();
+-                priv.updateMainAndSideStageIndexes()
+-            }
++            priv.toggleSideStage()
+         }
+ 
+         onDragStarted: {
diff -Nru lomiri-0.5.0/debian/patches/1018b_Add-shortcut-for-moving-apps-between-stages.patch lomiri-0.5.0/debian/patches/1018b_Add-shortcut-for-moving-apps-between-stages.patch
--- lomiri-0.5.0/debian/patches/1018b_Add-shortcut-for-moving-apps-between-stages.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1018b_Add-shortcut-for-moving-apps-between-stages.patch	2025-07-11 16:29:08.000000000 +0200
@@ -0,0 +1,135 @@
+From af24386001fc696dc792f05ecde76a041e344cc0 Mon Sep 17 00:00:00 2001
+From: kugiigi <kugi_eusebio@protonmail.com>
+Date: Fri, 11 Jul 2025 16:27:07 +0200
+Subject: [PATCH 2/2] Add shortcut for moving apps between stages.
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Components/KeyboardShortcutsOverlay.qml | 51 +++++++++++++++------
+ qml/Stage/Stage.qml                         | 36 +++++++++++++--
+ 2 files changed, 69 insertions(+), 18 deletions(-)
+
+diff --git a/qml/Components/KeyboardShortcutsOverlay.qml b/qml/Components/KeyboardShortcutsOverlay.qml
+index 438bd735f..d6b3d4d7f 100644
+--- a/qml/Components/KeyboardShortcutsOverlay.qml
++++ b/qml/Components/KeyboardShortcutsOverlay.qml
+@@ -240,20 +240,6 @@ Rectangle {
+                     Layout.maximumWidth: maxTextSize
+                 }
+ 
+-                Label {
+-                    text: i18n.tr("Super + S")
+-                    fontSize: "small"
+-                    font.weight: Font.Medium
+-                }
+-
+-                Label {
+-                    text: i18n.tr("Shows or hides the side stage.")
+-                    fontSize: "small"
+-                    font.weight: Font.Light
+-                    wrapMode: Text.Wrap
+-                    Layout.maximumWidth: maxTextSize
+-                }
+-
+                 Label {
+                     text: i18n.tr("Cursor Left or Right")
+                     fontSize: "small"
+@@ -342,6 +328,43 @@ Rectangle {
+                     wrapMode: Text.Wrap
+                     Layout.maximumWidth: maxTextSize
+                 }
++
++                // Stages section
++                Item { Layout.columnSpan: 2; height: units.gu(2) }
++                Label {
++                    Layout.columnSpan: 2
++                    text: i18n.tr("Stages")
++                    font.weight: Font.Light
++                    color: theme.palette.normal.baseText
++                    lineHeight: 1.3
++                }
++
++                Label {
++                    text: i18n.tr("Super + S")
++                    fontSize: "small"
++                    font.weight: Font.Medium
++                }
++                Label {
++                    text: i18n.tr("Shows or hides the side stage.")
++                    fontSize: "small"
++                    font.weight: Font.Light
++                    wrapMode: Text.Wrap
++                    Layout.maximumWidth: maxTextSize
++                }
++
++                Label {
++                    text: i18n.tr("Ctrl + Super + Left or Right")
++                    fontSize: "small"
++                    font.weight: Font.Medium
++                }
++
++                Label {
++                    text: i18n.tr("Moves app between main stage and side stage.")
++                    fontSize: "small"
++                    font.weight: Font.Light
++                    wrapMode: Text.Wrap
++                    Layout.maximumWidth: maxTextSize
++                }
+             }
+ 
+             Item { Layout.fillHeight: true; Layout.columnSpan: 2 } // spacer
+diff --git a/qml/Stage/Stage.qml b/qml/Stage/Stage.qml
+index 2629b7757..c61fb6990 100644
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -246,15 +246,43 @@ FocusScope {
+     GlobalShortcut {
+         id: maximizeWindowLeftShortcut
+         shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Left
+-        onTriggered: priv.focusedAppDelegate.requestMaximizeLeft()
+-        active: root.state == "windowed" && priv.focusedAppDelegate && priv.focusedAppDelegate.canBeMaximizedLeftRight
++        onTriggered: {
++            switch (root.mode) {
++                case "stagedWithSideStage":
++                    if (priv.focusedAppDelegate.stage == ApplicationInfoInterface.SideStage) {
++                        priv.focusedAppDelegate.saveStage(ApplicationInfoInterface.MainStage);
++                        priv.focusedAppDelegate.focus = true;
++                    }
++                    break;
++                case "windowed":
++                    priv.focusedAppDelegate.requestMaximizeLeft()
++                    break;
++            }
++        }
++        active: (root.state == "windowed" && priv.focusedAppDelegate && priv.focusedAppDelegate.canBeMaximizedLeftRight)
++                    ||  (root.state == "stagedWithSideStage" && priv.focusedAppDelegate.stage == ApplicationInfoInterface.SideStage)
+     }
+ 
+     GlobalShortcut {
+         id: maximizeWindowRightShortcut
+         shortcut: Qt.MetaModifier|Qt.ControlModifier|Qt.Key_Right
+-        onTriggered: priv.focusedAppDelegate.requestMaximizeRight()
+-        active: root.state == "windowed" && priv.focusedAppDelegate && priv.focusedAppDelegate.canBeMaximizedLeftRight
++        onTriggered: {
++            switch (root.mode) {
++                case "stagedWithSideStage":
++                    if (priv.focusedAppDelegate.stage == ApplicationInfoInterface.MainStage) {
++                        priv.focusedAppDelegate.saveStage(ApplicationInfoInterface.SideStage);
++                        priv.focusedAppDelegate.focus = true;
++                        sideStage.show();
++                        priv.updateMainAndSideStageIndexes()
++                    }
++                    break;
++                case "windowed":
++                    priv.focusedAppDelegate.requestMaximizeRight()
++                    break;
++            }
++        }
++        active: (root.state == "windowed" && priv.focusedAppDelegate && priv.focusedAppDelegate.canBeMaximizedLeftRight)
++                    ||  (root.state == "stagedWithSideStage" && priv.focusedAppDelegate.stage == ApplicationInfoInterface.MainStage)
+     }
+ 
+     GlobalShortcut {
+-- 
+2.47.2
+
diff -Nru lomiri-0.5.0/debian/patches/1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch lomiri-0.5.0/debian/patches/1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch
--- lomiri-0.5.0/debian/patches/1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch	2025-07-11 22:36:26.000000000 +0200
@@ -0,0 +1,36 @@
+From 6a55424041845a6e98fcf035cad5f29dc7611443 Mon Sep 17 00:00:00 2001
+From: Ratchanan Srirattanamet <ratchanan@ubports.com>
+Date: Tue, 7 Jan 2025 00:24:51 +0700
+Subject: [PATCH] WorkspacePreview: reduce lag when app enters/exit fullscreen
+
+As discovered in #122, after commit c4f50475 ("Fixes and adjustments in
+the workspace previews") WorkspacePreview is being resized when an app
+enter or leave fullscreen mode. This causes preview's background image
+to be reloaded as well.
+
+Commit 3f991507 ("Workspaces: use AvailableDesktopArea for screen space
+instead") allows image reload to not be tied to animation. This commit
+additionally set image to load asynchronously, which should reduce lag
+further.
+
+Bug: https://gitlab.com/ubports/development/core/lomiri/-/issues/122
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/Spread/WorkspacePreview.qml | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/qml/Stage/Spread/WorkspacePreview.qml b/qml/Stage/Spread/WorkspacePreview.qml
+index 3d0989f6d..85b6ae4fe 100644
+--- a/qml/Stage/Spread/WorkspacePreview.qml
++++ b/qml/Stage/Spread/WorkspacePreview.qml
+@@ -47,6 +47,7 @@ Item {
+         sourceSize.height: height
+         fillMode: Image.PreserveAspectCrop
+         autoTransform: true
++        asynchronous: true
+ 
+         Repeater {
+             id: topLevelSurfaceRepeater
+-- 
+2.47.2
+
diff -Nru lomiri-0.5.0/debian/patches/1021_qml-Fix-WorkspacePreview-positioning.patch lomiri-0.5.0/debian/patches/1021_qml-Fix-WorkspacePreview-positioning.patch
--- lomiri-0.5.0/debian/patches/1021_qml-Fix-WorkspacePreview-positioning.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1021_qml-Fix-WorkspacePreview-positioning.patch	2025-07-11 18:37:41.000000000 +0200
@@ -0,0 +1,34 @@
+From 4b5e87d5416d5794f267f51a9c4f1a029b9a2f9a Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Fri, 1 Mar 2024 20:44:33 +0100
+Subject: [PATCH 1/8] qml: Fix WorkspacePreview positioning
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/Spread/Workspaces.qml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/qml/Stage/Spread/Workspaces.qml b/qml/Stage/Spread/Workspaces.qml
+index 736119620..a628c8987 100644
+--- a/qml/Stage/Spread/Workspaces.qml
++++ b/qml/Stage/Spread/Workspaces.qml
+@@ -16,6 +16,7 @@
+ 
+ import QtQuick 2.15
+ import Lomiri.Components 1.3
++import GSettings 1.0
+ import WindowManager 1.0
+ import "MathUtils.js" as MathUtils
+ import "../../Components"
+@@ -277,7 +278,7 @@ Item {
+                 WorkspacePreview {
+                     id: workspacePreview
+                     height: listView.height
+-                    width: listView.itemWidth
++                    width: listView.itemWidth - settings.launcherWidth
+                     screen: root.screen
+                     background: root.background
+                     screenHeight: listView.screenSpaceHeight
+-- 
+2.47.2
+
diff -Nru lomiri-0.5.0/debian/patches/1022_qml-Enable-live-blur-when-in-windowed-mode-for-more-.patch lomiri-0.5.0/debian/patches/1022_qml-Enable-live-blur-when-in-windowed-mode-for-more-.patch
--- lomiri-0.5.0/debian/patches/1022_qml-Enable-live-blur-when-in-windowed-mode-for-more-.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1022_qml-Enable-live-blur-when-in-windowed-mode-for-more-.patch	2025-07-11 18:06:45.000000000 +0200
@@ -0,0 +1,93 @@
+From 9a786cbea7395057b22bae7ea35e204bd360c158 Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Sun, 3 Mar 2024 01:52:35 +0100
+Subject: [PATCH 2/8] qml: Enable live blur when in windowed mode for more
+ accurate effects on desktop systems where resources aren't scarce
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Components/BackgroundBlur.qml | 5 +++--
+ qml/Stage/ApplicationWindow.qml   | 2 ++
+ qml/Stage/DecoratedWindow.qml     | 1 +
+ qml/Stage/Stage.qml               | 1 +
+ qml/Stage/SurfaceContainer.qml    | 3 +++
+ 5 files changed, 10 insertions(+), 2 deletions(-)
+
+--- a/qml/Components/BackgroundBlur.qml
++++ b/qml/Components/BackgroundBlur.qml
+@@ -34,7 +34,8 @@
+         sourceItem: root.sourceItem
+         hideSource: root.occluding
+         sourceRect: root.blurRect
+-        live: false
++        // Phones and tablets are better off saving power
++        live: stage.mode === "windowed"
+         enabled: sourceItem != null
+     }
+ 
+@@ -50,7 +51,7 @@
+ 
+     Timer {
+         interval: 48
+-        repeat: root.visible && (sourceItem != null)
++        repeat: root.visible && (sourceItem != null) && (stage.mode !== "windowed")
+         running: repeat
+         onTriggered: shaderEffectSource.scheduleUpdate()
+     }
+--- a/qml/Stage/ApplicationWindow.qml
++++ b/qml/Stage/ApplicationWindow.qml
+@@ -38,6 +38,7 @@
+     property int requestedWidth: -1
+     property int requestedHeight: -1
+     property real splashRotation: 0
++    property var stage : null
+ 
+     readonly property int minimumWidth: surface ? surface.minimumWidth : 0
+     readonly property int minimumHeight: surface ? surface.minimumHeight : 0
+@@ -144,6 +145,7 @@
+         requestedWidth: root.requestedWidth
+         requestedHeight: root.requestedHeight
+         surfaceOrientationAngle: application && application.rotatesWindowContents ? root.surfaceOrientationAngle : 0
++        stage: root.stage
+     }
+ 
+     Loader {
+--- a/qml/Stage/DecoratedWindow.qml
++++ b/qml/Stage/DecoratedWindow.qml
+@@ -39,6 +39,7 @@
+     property alias interactive: applicationWindow.interactive
+     readonly property alias orientationChangesEnabled: applicationWindow.orientationChangesEnabled
+     property alias windowControlButtonsVisible: decoration.windowControlButtonsVisible
++    property alias stage: applicationWindow.stage
+     property PanelState panelState
+ 
+     // Changing this will actually add/remove a decoration, meaning, requestedHeight will take the decoration into account.
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -2100,6 +2100,7 @@
+                     objectName: "decoratedWindow"
+                     anchors.left: appDelegate.left
+                     anchors.top: appDelegate.top
++                    stage: root
+                     application: model.application
+                     surface: model.window.surface
+                     active: model.window.focused
+--- a/qml/Stage/SurfaceContainer.qml
++++ b/qml/Stage/SurfaceContainer.qml
+@@ -36,6 +36,7 @@
+     property bool interactive
+     property int surfaceOrientationAngle: 0
+     property bool isPromptSurface: false
++    property var stage : null
+     // FIME - dont export, use interactive property. Need to fix qtmir to handle consumesInputChanged
+     // to update surface activeFocus. See mock MirSurfaceItem.
+     property alias consumesInput: surfaceItem.consumesInput
+@@ -78,6 +79,8 @@
+         enabled: root.interactive
+         antialiasing: !root.interactive
+         orientationAngle: root.surfaceOrientationAngle
++
++        clip: stage && stage.mode === "windowed"
+     }
+ 
+     TouchGate {
diff -Nru lomiri-0.5.0/debian/patches/1023_qml-Remove-smooth-property-assignment-to-stay-unifor.patch lomiri-0.5.0/debian/patches/1023_qml-Remove-smooth-property-assignment-to-stay-unifor.patch
--- lomiri-0.5.0/debian/patches/1023_qml-Remove-smooth-property-assignment-to-stay-unifor.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1023_qml-Remove-smooth-property-assignment-to-stay-unifor.patch	2025-07-11 18:06:38.000000000 +0200
@@ -0,0 +1,21 @@
+From 3201bf808818172a8e5d69f4e6280082a5817834 Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Fri, 11 Jul 2025 17:55:30 +0200
+Subject: [PATCH 3/8] qml: Remove smooth property assignment to stay uniform
+ across all users of MirSurfaceItem
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/Stage.qml | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -1048,7 +1048,6 @@
+             Behavior on opacity { LomiriNumberAnimation {} }
+             visible: opacity > 0
+             enabled: workspaceSwitcher
+-            smooth: true
+ 
+             Drag.active: surface != null
+             Drag.keys: ["application"]
diff -Nru lomiri-0.5.0/debian/patches/1024_qml-Resize-Window-Decoration-with-surfaces.patch lomiri-0.5.0/debian/patches/1024_qml-Resize-Window-Decoration-with-surfaces.patch
--- lomiri-0.5.0/debian/patches/1024_qml-Resize-Window-Decoration-with-surfaces.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1024_qml-Resize-Window-Decoration-with-surfaces.patch	2025-07-11 18:06:08.000000000 +0200
@@ -0,0 +1,73 @@
+From 3357ede5ebec644190313d266f4467ac383f2987 Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Sun, 3 Mar 2024 12:56:39 +0100
+Subject: [PATCH 4/8] qml: Resize Window Decoration with surfaces
+
+Apparent in GIMP with its splash screen, the decorations draw outside
+of the surfaces geometry limits. React to surface's sizeChanged signals
+and pass the new value on to the decoration to set the size accordingly.
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/ApplicationWindow.qml | 3 +++
+ qml/Stage/DecoratedWindow.qml   | 4 ++++
+ qml/Stage/SurfaceContainer.qml  | 9 +++++++++
+ 3 files changed, 16 insertions(+)
+
+--- a/qml/Stage/ApplicationWindow.qml
++++ b/qml/Stage/ApplicationWindow.qml
+@@ -47,6 +47,8 @@
+     readonly property int widthIncrement: surface ? surface.widthIncrement : 0
+     readonly property int heightIncrement: surface ? surface.heightIncrement : 0
+ 
++    signal sizeChanged(size size)
++
+     Connections {
+         target: surface
+         function onReady() {  d.surfaceUp() }
+@@ -146,6 +148,7 @@
+         requestedHeight: root.requestedHeight
+         surfaceOrientationAngle: application && application.rotatesWindowContents ? root.surfaceOrientationAngle : 0
+         stage: root.stage
++        onSizeChanged: root.sizeChanged(size)
+     }
+ 
+     Loader {
+--- a/qml/Stage/DecoratedWindow.qml
++++ b/qml/Stage/DecoratedWindow.qml
+@@ -181,6 +181,10 @@
+ //        onRequestedWidthChanged: oldRequestedWidth = requestedWidth
+ //        onRequestedHeightChanged: oldRequestedHeight = requestedHeight
+         focus: true
++        onSizeChanged: {
++            implicitWidth = size.width
++            implicitHeight = size.height
++        }
+ 
+         property real itemScale: 1
+         property real minSize: Math.min(root.scaleToPreviewSize, Math.min(requestedHeight, Math.min(requestedWidth, Math.min(implicitHeight, implicitWidth))))
+--- a/qml/Stage/SurfaceContainer.qml
++++ b/qml/Stage/SurfaceContainer.qml
+@@ -43,6 +43,8 @@
+ 
+     property bool hadSurface: false
+ 
++    signal sizeChanged(size size)
++
+     onSurfaceChanged: {
+         // Not a binding because animations might remove the surface from the surfaceItem
+         // programatically (in order to signal that a zombie surface is free for deletion),
+@@ -81,6 +83,13 @@
+         orientationAngle: root.surfaceOrientationAngle
+ 
+         clip: stage && stage.mode === "windowed"
++
++        Connections {
++            target: surfaceItem.surface
++            onSizeChanged: {
++                root.sizeChanged(value)
++            }
++        }
+     }
+ 
+     TouchGate {
diff -Nru lomiri-0.5.0/debian/patches/1025_qml-Rework-application-window-surface-clipping.patch lomiri-0.5.0/debian/patches/1025_qml-Rework-application-window-surface-clipping.patch
--- lomiri-0.5.0/debian/patches/1025_qml-Rework-application-window-surface-clipping.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1025_qml-Rework-application-window-surface-clipping.patch	2025-07-11 18:06:04.000000000 +0200
@@ -0,0 +1,92 @@
+From b52de65bea25f3e49f4feefc6b6ec3668a6798d2 Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Sun, 3 Mar 2024 23:10:29 +0100
+Subject: [PATCH 5/8] qml: Rework application window surface clipping
+
+Don't pass the pointer too many layers down, instead rely
+on a good old bool property for handling the switch.
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/ApplicationWindow.qml | 4 ++--
+ qml/Stage/DecoratedWindow.qml   | 3 ++-
+ qml/Stage/Stage.qml             | 2 +-
+ qml/Stage/SurfaceContainer.qml  | 3 ---
+ 4 files changed, 5 insertions(+), 7 deletions(-)
+
+--- a/qml/Stage/ApplicationWindow.qml
++++ b/qml/Stage/ApplicationWindow.qml
+@@ -38,7 +38,7 @@
+     property int requestedWidth: -1
+     property int requestedHeight: -1
+     property real splashRotation: 0
+-    property var stage : null
++    property bool clip: false
+ 
+     readonly property int minimumWidth: surface ? surface.minimumWidth : 0
+     readonly property int minimumHeight: surface ? surface.minimumHeight : 0
+@@ -147,7 +147,7 @@
+         requestedWidth: root.requestedWidth
+         requestedHeight: root.requestedHeight
+         surfaceOrientationAngle: application && application.rotatesWindowContents ? root.surfaceOrientationAngle : 0
+-        stage: root.stage
++        clip: root.clip
+         onSizeChanged: root.sizeChanged(size)
+     }
+ 
+--- a/qml/Stage/DecoratedWindow.qml
++++ b/qml/Stage/DecoratedWindow.qml
+@@ -39,7 +39,6 @@
+     property alias interactive: applicationWindow.interactive
+     readonly property alias orientationChangesEnabled: applicationWindow.orientationChangesEnabled
+     property alias windowControlButtonsVisible: decoration.windowControlButtonsVisible
+-    property alias stage: applicationWindow.stage
+     property PanelState panelState
+ 
+     // Changing this will actually add/remove a decoration, meaning, requestedHeight will take the decoration into account.
+@@ -83,6 +82,8 @@
+ 
+     property alias altDragEnabled: altDragHandler.enabled
+ 
++    property alias clipSurface: applicationWindow.clip
++
+     property Item windowMargins
+ 
+     signal closeClicked()
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -2099,7 +2099,6 @@
+                     objectName: "decoratedWindow"
+                     anchors.left: appDelegate.left
+                     anchors.top: appDelegate.top
+-                    stage: root
+                     application: model.application
+                     surface: model.window.surface
+                     active: model.window.focused
+@@ -2116,6 +2115,7 @@
+                     panelState: root.panelState
+                     altDragEnabled: root.mode == "windowed"
+                     lightMode: root.lightMode
++                    clipSurface: root.mode === "windowed"
+ 
+                     requestedWidth: appDelegate.requestedWidth
+                     requestedHeight: appDelegate.requestedHeight
+--- a/qml/Stage/SurfaceContainer.qml
++++ b/qml/Stage/SurfaceContainer.qml
+@@ -36,7 +36,6 @@
+     property bool interactive
+     property int surfaceOrientationAngle: 0
+     property bool isPromptSurface: false
+-    property var stage : null
+     // FIME - dont export, use interactive property. Need to fix qtmir to handle consumesInputChanged
+     // to update surface activeFocus. See mock MirSurfaceItem.
+     property alias consumesInput: surfaceItem.consumesInput
+@@ -82,8 +81,6 @@
+         antialiasing: !root.interactive
+         orientationAngle: root.surfaceOrientationAngle
+ 
+-        clip: stage && stage.mode === "windowed"
+-
+         Connections {
+             target: surfaceItem.surface
+             onSizeChanged: {
diff -Nru lomiri-0.5.0/debian/patches/1026_qml-Disallow-resizing-unresizeable-windows-follow-ma.patch lomiri-0.5.0/debian/patches/1026_qml-Disallow-resizing-unresizeable-windows-follow-ma.patch
--- lomiri-0.5.0/debian/patches/1026_qml-Disallow-resizing-unresizeable-windows-follow-ma.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1026_qml-Disallow-resizing-unresizeable-windows-follow-ma.patch	2025-07-11 18:05:59.000000000 +0200
@@ -0,0 +1,71 @@
+From e6b3a2f006d3fb2ca3276b8473173becd11f74af Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Thu, 7 Mar 2024 14:50:13 +0100
+Subject: [PATCH 6/8] qml: Disallow resizing unresizeable windows & follow
+ maximum/minimum geometry
+
+- Set window geometry based on surface's minimum and maximum limits
+- Prevent resize handles from doing anything when minimum and maximum limits match
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/ApplicationWindow.qml | 12 ++++++++++++
+ qml/Stage/DecoratedWindow.qml   |  5 +----
+ 2 files changed, 13 insertions(+), 4 deletions(-)
+
+--- a/qml/Stage/ApplicationWindow.qml
++++ b/qml/Stage/ApplicationWindow.qml
+@@ -30,6 +30,7 @@
+     readonly property string title: surface && surface.name !== "" ? surface.name : d.name
+     readonly property QtObject focusedSurface: d.focusedSurface.surface
+     readonly property alias surfaceInitialized: d.surfaceInitialized
++    readonly property bool supportsResize: d.surfaceOldEnoughToBeResized && d.supportsSurfaceResize
+ 
+     // to be set from outside
+     property QtObject surface
+@@ -49,6 +50,15 @@
+ 
+     signal sizeChanged(size size)
+ 
++    onSizeChanged: {
++        let width = Math.max(size.width, root.minimumWidth)
++        width = Math.min(width, root.maximumWidth)
++        let height = Math.max(size.height, root.minimumHeight)
++        height = Math.min(height, root.maximumHeight)
++        implicitWidth = width
++        implicitHeight = height
++    }
++
+     Connections {
+         target: surface
+         function onReady() {  d.surfaceUp() }
+@@ -104,6 +114,8 @@
+                 &&
+                 ((application.supportedOrientations & Qt.LandscapeOrientation)
+                  || (application.supportedOrientations & Qt.InvertedLandscapeOrientation))
++                &&
++                !((root.minimumWidth === root.maximumWidth) && (root.minimumHeight === root.maximumHeight))
+ 
+         property bool surfaceOldEnoughToBeResized: false
+ 
+--- a/qml/Stage/DecoratedWindow.qml
++++ b/qml/Stage/DecoratedWindow.qml
+@@ -33,6 +33,7 @@
+     property alias application: applicationWindow.application
+     property alias surface: applicationWindow.surface
+     readonly property alias focusedSurface: applicationWindow.focusedSurface
++    readonly property alias supportsResize: applicationWindow.supportsResize
+     property alias active: decoration.active
+     readonly property alias title: applicationWindow.title
+     property alias maximizeButtonShown: decoration.maximizeButtonShown
+@@ -182,10 +183,6 @@
+ //        onRequestedWidthChanged: oldRequestedWidth = requestedWidth
+ //        onRequestedHeightChanged: oldRequestedHeight = requestedHeight
+         focus: true
+-        onSizeChanged: {
+-            implicitWidth = size.width
+-            implicitHeight = size.height
+-        }
+ 
+         property real itemScale: 1
+         property real minSize: Math.min(root.scaleToPreviewSize, Math.min(requestedHeight, Math.min(requestedWidth, Math.min(implicitHeight, implicitWidth))))
diff -Nru lomiri-0.5.0/debian/patches/1027_qml-Pass-on-the-Stage-down-to-the-SurfaceContainer-t.patch lomiri-0.5.0/debian/patches/1027_qml-Pass-on-the-Stage-down-to-the-SurfaceContainer-t.patch
--- lomiri-0.5.0/debian/patches/1027_qml-Pass-on-the-Stage-down-to-the-SurfaceContainer-t.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1027_qml-Pass-on-the-Stage-down-to-the-SurfaceContainer-t.patch	2025-07-11 18:06:22.000000000 +0200
@@ -0,0 +1,71 @@
+From 4caab5838e2ab48957de79906932319249f3fbff Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Sun, 3 Mar 2024 01:52:35 +0100
+Subject: [PATCH 7/8] qml: Pass on the Stage down to the SurfaceContainer to
+ determine whether it should enable clipping (slow on phones) the item in
+ windowed mode
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/ApplicationWindow.qml | 2 ++
+ qml/Stage/DecoratedWindow.qml   | 1 +
+ qml/Stage/Stage.qml             | 1 +
+ qml/Stage/SurfaceContainer.qml  | 2 ++
+ 4 files changed, 6 insertions(+)
+
+--- a/qml/Stage/ApplicationWindow.qml
++++ b/qml/Stage/ApplicationWindow.qml
+@@ -40,6 +40,7 @@
+     property int requestedHeight: -1
+     property real splashRotation: 0
+     property bool clip: false
++    property var stage : null
+ 
+     readonly property int minimumWidth: surface ? surface.minimumWidth : 0
+     readonly property int minimumHeight: surface ? surface.minimumHeight : 0
+@@ -161,6 +162,7 @@
+         surfaceOrientationAngle: application && application.rotatesWindowContents ? root.surfaceOrientationAngle : 0
+         clip: root.clip
+         onSizeChanged: root.sizeChanged(size)
++        stage: root.stage
+     }
+ 
+     Loader {
+--- a/qml/Stage/DecoratedWindow.qml
++++ b/qml/Stage/DecoratedWindow.qml
+@@ -40,6 +40,7 @@
+     property alias interactive: applicationWindow.interactive
+     readonly property alias orientationChangesEnabled: applicationWindow.orientationChangesEnabled
+     property alias windowControlButtonsVisible: decoration.windowControlButtonsVisible
++    property alias stage: applicationWindow.stage
+     property PanelState panelState
+ 
+     // Changing this will actually add/remove a decoration, meaning, requestedHeight will take the decoration into account.
+--- a/qml/Stage/Stage.qml
++++ b/qml/Stage/Stage.qml
+@@ -2099,6 +2099,7 @@
+                     objectName: "decoratedWindow"
+                     anchors.left: appDelegate.left
+                     anchors.top: appDelegate.top
++                    stage: root
+                     application: model.application
+                     surface: model.window.surface
+                     active: model.window.focused
+--- a/qml/Stage/SurfaceContainer.qml
++++ b/qml/Stage/SurfaceContainer.qml
+@@ -36,6 +36,7 @@
+     property bool interactive
+     property int surfaceOrientationAngle: 0
+     property bool isPromptSurface: false
++    property var stage : null
+     // FIME - dont export, use interactive property. Need to fix qtmir to handle consumesInputChanged
+     // to update surface activeFocus. See mock MirSurfaceItem.
+     property alias consumesInput: surfaceItem.consumesInput
+@@ -87,6 +88,7 @@
+                 root.sizeChanged(value)
+             }
+         }
++        clip: stage && stage.mode === "windowed"
+     }
+ 
+     TouchGate {
diff -Nru lomiri-0.5.0/debian/patches/1028_qml-Center-the-WorkspacePreview-in-its-parent-horizo.patch lomiri-0.5.0/debian/patches/1028_qml-Center-the-WorkspacePreview-in-its-parent-horizo.patch
--- lomiri-0.5.0/debian/patches/1028_qml-Center-the-WorkspacePreview-in-its-parent-horizo.patch	1970-01-01 01:00:00.000000000 +0100
+++ lomiri-0.5.0/debian/patches/1028_qml-Center-the-WorkspacePreview-in-its-parent-horizo.patch	2025-07-11 18:00:18.000000000 +0200
@@ -0,0 +1,26 @@
+From 924b38bc84f6c48678d2751ae5e67a34d2bafc5e Mon Sep 17 00:00:00 2001
+From: Alfred Neumayer <dev.beidl@gmail.com>
+Date: Fri, 11 Jul 2025 17:47:37 +0200
+Subject: [PATCH 8/8] qml: Center the WorkspacePreview in its parent
+ horizontally
+
+Signed-off-by: Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
+---
+ qml/Stage/Spread/Workspaces.qml | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/qml/Stage/Spread/Workspaces.qml b/qml/Stage/Spread/Workspaces.qml
+index a628c8987..62da5ae76 100644
+--- a/qml/Stage/Spread/Workspaces.qml
++++ b/qml/Stage/Spread/Workspaces.qml
+@@ -279,6 +279,7 @@ Item {
+                     id: workspacePreview
+                     height: listView.height
+                     width: listView.itemWidth - settings.launcherWidth
++                    anchors.horizontalCenter: parent.horizontalCenter
+                     screen: root.screen
+                     background: root.background
+                     screenHeight: listView.screenSpaceHeight
+-- 
+2.47.2
+
diff -Nru lomiri-0.5.0/debian/patches/series lomiri-0.5.0/debian/patches/series
--- lomiri-0.5.0/debian/patches/series	2025-06-06 19:47:45.000000000 +0200
+++ lomiri-0.5.0/debian/patches/series	2025-07-28 16:00:46.000000000 +0200
@@ -23,3 +23,19 @@
 2015_lomiri-greeter-use-wayland.patch
 1005_cursor-always-follow-cursor-position-from-mir.patch
 0030_lomiri-upstream-home-logo.patch
+1007_fix-scrolling-issues.patch
+1018a_Add-shortcut-to-toggle-side-stage.patch
+1018b_Add-shortcut-for-moving-apps-between-stages.patch
+1021_qml-Fix-WorkspacePreview-positioning.patch
+1022_qml-Enable-live-blur-when-in-windowed-mode-for-more-.patch
+1023_qml-Remove-smooth-property-assignment-to-stay-unifor.patch
+1024_qml-Resize-Window-Decoration-with-surfaces.patch
+1025_qml-Rework-application-window-surface-clipping.patch
+1026_qml-Disallow-resizing-unresizeable-windows-follow-ma.patch
+1027_qml-Pass-on-the-Stage-down-to-the-SurfaceContainer-t.patch
+1028_qml-Center-the-WorkspacePreview-in-its-parent-horizo.patch
+1019_WorkspacePreview-reduce-lag-when-app-enters-exit-ful.patch
+0031_faster-session-exit.patch
+0032_dont-ask-for-SIM-PIN-in-greeter.patch
+0033_remove-dangling-window-decorations-from-model.patch
+0034_spawn-apps-in-fullscreen-when-in-phone+tablet-mode.patch

--- End Message ---
--- Begin Message ---
Hi,

I'm sorry we couldn't unblock your request in time for trixie. I'm closing all open unblock requests in one go, so I'm not going into details of the particular request, but reasons are typically as follow:
- the request came after the deadline of 2025-07-30
- the request came late and we just didn't have the time to deal with it
- the request was waiting for action from the submitter (moreinfo tag)
- the request didn't appear to be in line with the freeze policy and we
  didn't have the energy to engage (sorry for that, see our FAQ [1])
- there was discussion in the unblock request but no agreement was
  reached in time for the release.

Paul

[1] https://release.debian.org/trixie/FAQ.html

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature


--- End Message ---

Reply to: