Replace MobileShell motion imports/animations with local Qt Quick ColorAnimation and NumberAnimation timings so decoration and snap-assist effects animate consistently without shell plugin coupling.
Add a KWin JavaScript effect for compositor-side size and translation transitions, and enable it in convergence mode. Keep the tile preview effect as an outline driver so nested preview does not activate a SceneEffect surface.
Expose layout requests and state through shell settings so Folio
can offer alternatives for the current tiled workspace. Keep KWin
as the owner of layout changes, snapshot request serials so requests
are not dropped, and hide the edge menu when fewer than two windows
are tiled.
Reserve side and bottom decoration borders for normal windows and draw a rounded decoration frame so windows match the convergence workspace shape. Add static guards for the decoration and existing workspace-frame corner geometry.
Apply Motion tokens to startup, applet configuration, lockscreen controls, logout and splash transitions, KWin effects, and the mobile task switcher. Preserve timing-specific behavior where it drives runtime state.
Keep one layout per output and virtual desktop. Move new windows to another existing desktop when the current page is full.
When a user moves a window onto a full page, replace the last focused window on that page and send it back to the source desktop. Use stable slot swaps instead of insert splits so the layout shape does not change during moves.
Use a concrete wallpaper image in generated shell config. Disable KSycoca watches when preview opts out, and keep the convergent window connection target nullable.
Replace the flat per-screen tiling order with a persistent layout
tree so split orientation and window relationships survive retiles.
Derive the per-screen tile cache from the tree when applying
geometries.
Make drag insertion deterministic by mapping the cursor position
over a target tile to the nearest split direction and previewing
the exact half that will be assigned.
Retile on Workspace.onScreensChanged so screen rotation and output
changes recompute tiled window geometry from the updated work area,
and reconcile tiled windows that KWin moved to another output.
Use edge insert zones for drag-and-drop reordering, keep drag signal
connections stable across window creation, and consume task-menu tiling
requests through the script settings bridge.
Expose snapLayoutsEnabled through MobileShellSettings and store it\nin plasmamobilerc.\n\nUse the setting in the Shift snap assist effect eligibility logic\nand add a Convergence KCM switch to control it.\n\nKeep the switch disabled when convergence is off, gaming mode is on,\nor dynamic tiling is enabled so window-placement ownership stays\nconsistent.
Move maximize-hover handling into the snap-assist effect so it can use
the actual decoration button geometry. Render the scene below the picker,
anchor layouts near the cursor, and preview the selected zone without a
fullscreen modal surface.
A normal maximize click keeps priority: hover activation requires a
deliberate pause, dismissal starts a short cooldown, and clicks on the
maximize button still toggle maximize while closing the suggestion.
The decoration QML sandbox has no DBus or kglobalaccel access, so
the Qt.callDBus call from the maximize-button hover Timer was a
silent no-op. Remove the dead Timer, hover state and grid-dot
overlay; the shift-tiling script now polls the cursor over the
title-bar button strip and triggers SHIFT Snap Assist itself.
Also refresh the SPDX header on both decoration files.
Declarative SceneEffect that shows a floating panel of layout
presets (halves, thirds, quadrants). Activated via Meta+Shift+S or
by the shift-tiling script when the cursor hovers the title-bar
controls of the active window for 500 ms.
Clicking a preset assigns the active window to the chosen zone with
the same outer gap used by the BSP engine; remaining zones are shown
as snap-assist drop targets for recently-used windows.
Introduce a declarative KWin script that maintains a binary-space
partition layout per output for normal windows in convergence mode.
New windows are added to the active screen and the layout is
recomputed with 8 px outer and 8 px inner gaps; closed windows are
removed and neighbours expand to fill the freed area.
Windows that fail isTileable (panels, fixed-size dialogs, fullscreen,
xwaylandvideobridge, manually-floated) are left untouched. A 200 ms
deferred-retile timer mirrors the convergentwindows pattern so the
dockSpaceReserver layer-shell exclusive zone is settled before
clientArea is queried.
Dragging a tile and dropping it onto another tile swaps the two slots
in the BSP layout; an outline is drawn on the hovered target as a
visual cue. Drops elsewhere snap the tile back to its original slot
and leave KWin native quick-tile and electric borders untouched.
Keyboard bindings:
Meta+H/J/K/L focus left/down/up/right
Meta+F toggle float on the active window
Meta+T toggle tiling globally
Add a KWin decoration package under kwin/decorations and install it
into share/kwin/decorations. The QML theme defines Shift titlebar
colors, button rendering, and maximized border geometry.
Wire the new decorations subdirectory from kwin/CMakeLists.txt.
Return early in run(window) when the window object is null, deleted, or non-normal before accessing resourceClass. This prevents runtime errors during window lifecycle races.
Strut windows committed zero height to layer-shell during
early init, causing a protocol error and session exit. Wrap
height and exclusionZone in Math.max(1, ...) for top bar
and dock.
Persisted gamingModeEnabled=true with hardcoded
gameCenterOpen=false hid panels with no overlay visible.
Initialize gameCenterOpen from the stored setting.
Fix HUD visibility regression from an emergency visible:true
override. Various null-guard and positioning fixes from
static analysis across the gaming shell QML.
Hide the navigation panel, status bar, and app drawer while
gamingModeEnabled is active. The KWin convergent-windows script
skips its window policy so game windows are not forcibly tiled
or maximized.
The Home button in gaming mode re-opens the Game Center overlay
rather than the app drawer. A configurable hint nudges the user
toward the HUD button after launching a game.
Check restrictedPermissions before opening the detail popup in
convergence mode. Guard against null output in the KWin script
window-setup handler to prevent TypeError when a window has no
assigned output yet.
KWin restores geometry before the compositor re-commits the
exclusive zone, so the window can land partly behind the dock.
A deferred check clips the bottom edge once the round-trip
completes.
This adds a gesture handle mode to the navigation panel, which can be
enabled during gesture-only mode. This reserves space for the system
gesture to be able to be used, allowing us to extend the height in KWin
of the gesture recognition area (which is currently far too short for devices such as Pixel 3a).
This also allows for navigation with a mouse; clicking on the handle
triggers the task switcher, holding it triggers the "home" action.
This adds support for specifying options needed to deal with phone
display panel pecularities (ex. screen curves, notches, punch holes)
This is implemented as settings in ~/.config/plasmamobilerc, which can
set panel heights, paddings, and center spacings to duck display
cutouts. The pixel values are scaling independent, and so are not
affected when the display scaling is changed.
This is then exposed over DBus, so that components from outside of
plasmashell (ex. KWin) can access it easily without needing to connect to
kscreen themselves. Each screen is exposed as a single object.
Currently support is only added in the status bar and the navigation
panel.
Currently all screens have the settings applied. In the future, we may
want to limit this just to the internal screen (?)
---
This also adds a "devices" folder (in `devices/configs`) where per-device configs can be set.
This is installed to `/usr/share/plasma-mobile-device-configs`.
In `plasmamobilerc` (installed to `/etc/xdg/plasmamobilerc`, or
`~/.config/plasmamobilerc`), envmanager will read:
```toml
[Device]
device=oneplus-enchilada
```
for the device config to use and write its settings to
`~/.config/plasma-mobile/plasmamobilerc`.
This converts many of the animation durations to Kirigami units so that
they can be controlled system wide. It also speeds up several of the
animation durations (ex. in folio) from 800ms to 400ms to improve the
feel and responsiveness of the shell.
Fixes typos in various source comments.
Found via `codespell -S "*.po,*.svg,*.pgm,*.xml,./po,*.desktop,*.json,*.actions" -L aline,aparent,childs,distroname,indexin,indx,logicaly,lokal,nd,splitted,te`
Apparently i18n doesn't support string literals with single quotes as
parameters. Fix occurrences of this and add a CI check to ensure this
won't happen in the future.
The module exposes TaskFilterModel, which extends QSortFilterProxyModel
QSortFilterProxyModel is registered to QML as part of the QtCore module, so we need to add that to DEPENDENCIES for tools like qmllint to work properly