Commit graph

4212 commits

Author SHA1 Message Date
ed2fc8301b Seed lockscreen wallpaper defaults at startup
When kscreenlockerrc has no greeter wallpaper configured, or still
points at the legacy Next wallpaper, the lockscreen falls back to KDE
default imagery. Seed the greeter wallpaper settings from the installed
SHIFT wallpaper package during Plasma Mobile startup so the lockscreen
uses the fork default consistently.

Link ConfigCore for the startup module so it can read and update
kscreenlockerrc.
2026-05-05 09:06:46 +02:00
462ceddd66 Extract RunningAppsPanelButton to its own file
qmllint shipped with Qt 6.12 segfaults on the inline component
definition inside RunningAppsPanel.qml, breaking the
suse_tumbleweed_qt612 KDE Invent CI job.  Move PanelIconButton out
to a sibling RunningAppsPanelButton.qml so qmllint never has to
parse a UiInlineComponent here.

The extracted file inlines its own colour-mix helper to keep it
self-contained and avoid leaking RunningAppsPanel internals.
2026-05-04 20:34:54 +02:00
3fa5f90ed1 Add dynamic tiling toggle quick setting
Expose dynamicTilingEnabled (default true) on MobileShellSettings,
stored under the General group of plasmamobilerc and re-emitted by
the existing config watcher.  shift-tiling extends its activation
guard with this flag and clears the BSP layout when it goes false,
so users can fall back to KWin native quick-tile at will.

Add a quick-settings tile that surfaces the toggle.  available is
gated on convergenceModeEnabled and !gamingModeEnabled, so the tile
is hidden on the phone form factor and during gaming sessions.
2026-05-04 20:25:40 +02:00
d9b2e987dc Drop snap-assist hover stub from decoration
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.
2026-05-04 20:25:28 +02:00
9364cb29db Add SHIFT snap-assist KWin effect
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.
2026-05-04 20:25:17 +02:00
730385d8c8 Add SHIFT dynamic tiling KWin script
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
2026-05-04 20:25:06 +02:00
c52e331d31 Auto-clear startup feedback panel fill
The coloured rectangle that paints over the bottom panel during an
app-launch animation was reset only by a change of
WindowMaximizedTracker.showingWindow.  In convergence mode kwinrc
sets Placement=Centered, so launched apps stay non-maximized,
showingWindow never flips and the band remained on the panel
indefinitely.

Restart a 600 ms safety timer whenever the animation is triggered.
When it fires, clear colour and height to zero only if no maximized
or fullscreen window exists, preserving the original mobile reset
path while fixing the convergence one.
2026-05-04 20:24:53 +02:00
fe8b798cb2 lookandfeel: use Shift decoration by default
Switch kdecoration2 defaults from Breeze to Aurorae and select
org.shift.decoration as the theme.
2026-05-04 11:43:41 +02:00
92e7b78b5e kwin: add Shift Aurorae decoration
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.
2026-05-04 11:43:41 +02:00
c2f4c8ad88 Keep wallpaper selector drawer below the status bar
Pass topMargin to the WallpaperSelector in landscape/horizontal mode
so the drawer does not overlap the top status bar.
2026-05-04 11:43:41 +02:00
b0438bdf48 Fix wallpaper selector icon and surface colors
The header button used list-add icon and hard-coded white backgrounds
that did not match the dark theme. Change icon to configure (it opens
Configure Folio for advanced settings, not add-wallpaper), and use
Kirigami.Theme.backgroundColor for both the header and thumbnail
backgrounds.
2026-05-04 11:43:41 +02:00
9d076bf542 Sync lockscreen wallpaper with homescreen changes
When homescreen wallpaper is set, also persist the same image for lockscreen. Add a one-time migration in loadHomescreenSettings() that updates lockscreen when it is unset or still points to legacy Next wallpaper.
2026-05-04 11:43:41 +02:00
378e4830ac Guard convergentwindows against invalid windows
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.
2026-05-04 11:43:41 +02:00
e72165ec98 Unify convergence dock geometry and add invariant test
Introduce shared dock height/reveal constants and use them in folio and taskpanel to keep overlay and exclusion zone aligned. Keep dock backing stationary while only content slides, and add a CTest invariant script to prevent regressions.
2026-05-04 11:43:41 +02:00
709304c99c Restore convergence mode after undocking
Track docked state transitions in KScreenOSDProvider and only snapshot the initial convergence mode when transitioning into docked mode. This restores the previous user preference when outputs drop back to one.
2026-05-04 11:43:41 +02:00
9f7e1677eb Hide launcher tabs when not installed
Steam, Lutris, and Heroic filter tabs in the Game Center are now
only shown when those launchers are detected on the system. Detection
checks the native executable, known Flatpak data directories, and
standard data paths. The tab bar shrinks accordingly.
2026-05-04 11:43:41 +02:00
8632d47d68 Fix thumbnail popup x position on Wayland layer-shell
On a zwlr_layer_shell surface the compositor does not send the
window's screen position back to the client, so mapToGlobal
returns dock-local coordinates instead of screen-absolute ones.

Compute position from screen.virtualX + targetDelegate.x directly;
the dock is full-width and bottom-anchored so no global mapping
is needed.
2026-05-04 11:43:41 +02:00
84a6fa8054 Show context menu on desktop right-click in convergence mode
Right-clicking the desktop or dock background opened the mobile
settings overlay, which is a long-press gesture for touchscreens.
In convergence mode show a popup menu instead with three items:
Desktop and Wallpaper, Add Widgets, and Configure Desktop.

Long-press still opens the settings overlay on all form factors.
2026-05-04 11:43:41 +02:00
6d79f8ed05 Add trash button to convergence dock
Show a trash icon to the left of the Overview button in convergence
mode. The icon toggles between user-trash and user-trash-full by
watching ~/.local/share/Trash/files via FolderListModel.

Left-click opens the trash in the default file manager via
Qt.openUrlExternally("trash:/"), making the feature file-manager-
agnostic. Right-click offers "Open Trash" and "Empty Trash"; the
latter shows a confirmation dialog before invoking KIO.Trash via
D-Bus.

The right wing of the virtual-desktop pager shifts left to make
room for the trash button.
2026-05-04 11:43:41 +02:00
a0bad0507f Add virtual desktop pager to convergence dock
Show compact numbered desktop buttons in the dock bar when two or
more virtual desktops exist. The buttons are split symmetrically
to the left and right of the centred app-icon cluster, matching
Plasma Desktop pager behaviour.

Click a button to switch desktops. Drag a running-task icon from
the dock and release it over a desktop button to move that window
to the target desktop. Right-click a task icon for a "Move to …"
submenu when the pager is visible.

The feature is a no-op on single-desktop sessions.
2026-05-04 11:43:41 +02:00
160bc97621 Drop KDE wallpaper packages from dependencies
SHIFT now ships its own wallpaper package; remove
breeze6-wallpapers and plasma6-workspace-wallpapers from the
runtime dependency list in HACKING.md. Add .preview-data/ to
.gitignore.
2026-05-04 11:43:41 +02:00
6e67728f46 Add SHIFT wallpaper as the shell default
Add a wallpapers/SHIFT package with light and dark images. Set
Image=SHIFT in the look-and-feel defaults.

Plasma's org.kde.image backend requires a directory URL, not a
bare package ID, when writing Image= in a layout.js. Use
configure_file to stamp the resolved KDE_INSTALL_WALLPAPERDIR
path into the installed layout.js at build time.
2026-05-04 11:43:41 +02:00
5c319d2e7e Rename look-and-feel package to org.shift.mobile
Update the package ID in metadata.json, the translation catalog
name in Messages.sh, the compile-time default in envmanager, and
the test suite --lookandfeel flag. Rename the 41 .po files from
the old org.kde.breeze.mobile catalog name.
2026-05-04 11:40:41 +02:00
4077292801 Add task panel to Folio drawer
Show running windows in the app drawer with previews, window
actions, and virtual desktop controls. Hide dock task icons while
the panel is open so the same windows are not duplicated.

Use TaskManager to move windows between desktops, and expose
desktop activation through the containment.
2026-04-29 12:10:31 +02:00
c469ad49b6 Polish quick settings states 2026-04-29 08:39:34 +02:00
c9f219ad60 Adjust ShiftDark surface colors 2026-04-29 08:39:29 +02:00
1ad9fb3e3d Polish convergence dock controls 2026-04-29 08:39:22 +02:00
566c7f69c3 Reserve convergence dock space 2026-04-29 08:39:12 +02:00
5c5d962b34 Make SDL3 optional
Gaming shell plugin only builds when SDL3 is present.
KDE CI does not provide SDL3, so the hard REQUIRED was
breaking configure on every pipeline run.
2026-04-28 08:44:36 +02:00
7494733ca5 Fix REUSE compliance for workspace file and brand icon 2026-04-28 08:33:04 +02:00
ddc2e4cb81 Ignore .preview-config/ 2026-04-28 08:20:41 +02:00
f0c6abc6d0 Default to ShiftDark in the look-and-feel package
Switch from BreezeLight to ShiftDark and enable the breeze-dark icon
theme and window decoration to match.
2026-04-28 00:13:49 +02:00
75bcbb4718 Add Shift color schemes
Replace KDE blue (#3DAEE9) with a glacial teal (#2EB8A8) accent.
Neutral surfaces and semantic status colors unchanged from Breeze.
Both dark and light variants install to ${KDE_INSTALL_DATADIR}/color-schemes.
2026-04-28 00:13:36 +02:00
d8c8f61c57 Fix app drawer not scrolling in convergence mode
interactive starts false at atYBeginning so HomeScreenState can
own the swipe-up gesture that opens the drawer on phones. No such
gesture exists in convergence mode, leaving the grid permanently
non-interactive. Short-circuit the condition when convergence
mode is active.
2026-04-27 20:51:47 +02:00
1c0efb522f Keep status bar opaque in convergence mode
In mobile mode the status bar goes transparent when on the
homescreen so the wallpaper shows through. That is correct for
phone UX. In convergence/desktop mode it clashes with the always-
opaque dark dock: the top area looks light while the bottom is
dark. Return transparentBackground=false when convergence mode
is enabled so the panel stays consistently opaque.
2026-04-27 14:28:28 +02:00
c520a8e960 Use system theme colors in app drawer and dock
Remove hardcoded Complementary override and white color literals
from AppDrawerHeader. In mobile mode the Plasma containment
framework already provides Complementary context; in convergence
mode the drawerOverlay Window starts a fresh Window context.
Both cases now propagate correctly without an explicit override.

Also set Kirigami.Theme.Window on the convergence dock
FavouritesBar so icon labels and hover highlights follow the
active system palette instead of the wallpaper context.
2026-04-27 14:28:21 +02:00
8a4087bf96 Replace KDE logo with Shift brand icon
Three white circles on dark background. Replaces start-here-kde in
the dock home button and the phone navigation bar.
2026-04-27 13:51:25 +02:00
f07c56716a Use monochrome gamepad icon for gaming tile
input-gaming is a full-color Breeze icon with hard-coded gradients;
it cannot be made monochrome by a delegate-level mask. Switch to
input-gamepad, which uses fill:currentColor and matches the line-art
style of every other quick-settings tile icon.
2026-04-25 10:34:17 +02:00
76a4a7111e Merge feature/gaming-shell-mode into master 2026-04-25 10:22:50 +02:00
bbb22b9289 Remove dead code before merge
Drop the empty loadFlatpakGames() stub — desktop .desktop files
with the Game category are already covered by loadDesktopGames().

Remove InstalledRole: the field was always true and nothing in QML
consumed it.

gamepadAt() is an internal helper; drop Q_INVOKABLE so it isn't
part of the public QML surface.
2026-04-25 10:19:04 +02:00
69b8484025 Hide HUD while a game window is fullscreen
A mapped LayerShell surface prevents KWin from using DRM direct
scanout for fullscreen windows. Setting showing=false fades out
the HUD then sets visible=false, unmapping the Wayland surface
and allowing KWin to bypass the compositor render loop entirely
for the game frame.

The HUD reappears when the game exits or is minimised. Error
toasts still work because a failed launch never produces a
fullscreen window, so showingWindow remains false.
2026-04-25 09:48:50 +02:00
0ce8d6eb46 Add HUD toasts and quick-resume shortcut
Connect to gameLaunched and gameLaunchFailed signals. Launch
toasts dismiss after 3 s; error toasts after 5 s with a red
background. The window grows downward from the HUD pill to
accommodate the toast pill.

When recentGamesChanged fires, the most recently played game
is stored in quickResumeGame. While set, the HUD pill widens
leftward to show the game name and a play button that calls
launchByStorageId directly — no need to open Game Center.
2026-04-25 09:48:42 +02:00
739cc33049 Update Game Center with pinning and per-game settings
Star badge on pinned tiles (passive Kirigami.Icon, no event
handlers to avoid pointer-feedback loops). Pin/Unpin action
and per-game FPS cap + overlay rows added to the details dialog.

Per-game FPS and overlay rows use ButtonGroup with a Global
option that deletes the per-game key and falls back to the
global quick-settings value.

Remove isCurrent from info button visibility; add Menu and I
key handlers on the grid for keyboard/gamepad access to details.
2026-04-25 09:48:34 +02:00
b42ef44e23 Add MangoHud overlay, FPS cap, and game pinning
Inject MangoHud when launching desktop and command-line games.
MANGOHUD_CONFIG is built per-launch via a QProcess instance so
env vars are isolated to each child process — qputenv is not used.

Global overlay toggle and FPS cap (Off/30/40/60) are stored as
properties on GameLauncherProvider and reflected in the quick
settings panel. Per-game overrides stored in plasmamobilerc under
[GamingPerGame/<storageId>] take precedence over the globals at
launch time.

Games can be pinned to the top of the grid. The pinned set is
persisted in plasmamobilerc [GamingPinned] and restored on start.
applyFilter() uses stable_sort so pinned games float to the top
while alphabetical order is preserved within each group.
2026-04-25 09:48:25 +02:00
26945e83fa Show Waydroid apps in Game Center
Read the Waydroid allowlist from plasmamobilerc and treat matching
Waydroid launchers as their own source in the gaming shell.

Surface that source in Game Center so Android titles get their own tab,
source chip, and empty-state guidance.
2026-04-24 09:40:53 +02:00
a8e76002f4 Improve Waydroid app management
Handle unavailable Waydroid sessions more cleanly and add KCM controls for launching apps, Game Shell visibility, and compatibility overrides.
2026-04-24 09:35:28 +02:00
eb177e0394 Harden VDF token parsing
Handle unterminated quoted strings as invalid tokens and stop returning raw pointers to entries in the game list.
2026-04-22 12:42:55 +02:00
4dd0e17afb Track launch state in Game Center
Record recent launches only after the launcher reports success instead of
optimistically on every attempt. For desktop entries, wait for the
ApplicationLauncherJob result; for detached commands, use startDetached's
return value and show an inline error when startup fails.

Parse Steam libraryfolders and app manifests as KeyValues instead of
matching individual lines. This makes Steam discovery less brittle when
the files contain comments, nested blocks, or different formatting.

Keep Continue Playing visible alongside Running and show a temporary
launching state so the overlay does not pretend a task already exists.
Rename the GameMode status text to say what the shell actually knows.
2026-04-22 11:36:49 +02:00
d913c2ab0a Improve SDL gamepad prompts and feedback
Use SDL button labels so shell prompts match the connected
controller instead of always using Xbox-style wording. Expose
trigger rumble, touchpad count, gyro, and accelerometer support
through the gamepad wrapper and surface the relevant capability
labels in the overlay.

Enable background gamepad events and add short rumble feedback
for major shell actions such as opening quick settings, opening
the exit prompt, and launching a game.
2026-04-21 09:57:51 +02:00
55f778ebe8 Refine gaming quick settings visuals and toggles
Expose missing gaming controls directly in the panel so they
remain reachable in convergence mode. Add toggles for DND,
Launch Hint, Night Color, and Perf Overlay with gamepad focus
order updates.

Restyle brightness and volume sliders with rounded Plasma-themed
tracks and handles to remove harsh bar visuals while keeping
existing behavior unchanged.
2026-04-21 09:08:49 +02:00