Commit graph

4106 commits

Author SHA1 Message Date
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
62243b7f64 Add gaming session control backends
Add PowerProfileControl and GameModeControl singletons and wire
them into gaming mode lifecycle handling. When gaming mode turns
on, keep DND on, switch to the performance profile when available,
and request GameMode. Restore previous state when gaming mode
turns off.

Add an overlayEnabled property in GameLauncherProvider so the
launcher can toggle MangoHud environment variables from QML.
2026-04-21 09:08:03 +02:00
bcb985c652 Add quick settings panel and game sources
Slide-out panel with brightness, volume, Wi-Fi, Bluetooth,
and airplane mode. Fully gamepad-navigable; D-pad and stick
input routed to the panel while open. System status bar
(clock, battery, connectivity) added to game center header.

Lutris games discovered from ~/.local/share/lutris/pga.db,
Heroic from ~/.config/heroic/store_cache/ JSON files.
Deduplication extended to cover all launcher sources.

Desktop entries launched via KIO::ApplicationLauncherJob to
expand Exec field codes. Generic commands parsed with
KShell::splitArgs. SQLite uses RAII cleanup guard.

Clamped SDL axis, rumble, and LED values. Renamed rumble
params from frequency to intensity. GamepadManager uses
singleton factory. setPlayerIndex checks SDL return.

FavouritesBar popup uses screen virtualX/Y for multi-monitor.
2026-04-20 14:09:33 +02:00
4a9a5b2a97 Add empty state, gamepad task controls, and X: Close
Show a PlaceholderMessage in the grid when no games are found,
with context-aware text for empty library vs no search results.

Map gamepad A to activate and X to close in RunningGamesView.
Update the legend bar to show X: Close when running tasks are
visible.
2026-04-20 11:39:58 +02:00
daa8fc7d8a Extract common launch logic into launchEntry
Both launch() and launchByStorageId() duplicated the process
spawn, signal emission, and timestamp bookkeeping. Move it to
a single private launchEntry(GameEntry&) method.
2026-04-20 11:39:50 +02:00
a1044567cd Map shoulder buttons, Start, and right stick
LB/RB cycle through source filter tabs (All/Steam/Desktop).
Start toggles focus between the search field and the grid.
Right stick Y-axis smoothly scrolls the grid at 60 Hz with
speed proportional to deflection. Update the gamepad legend
to show the new bindings.
2026-04-20 11:34:25 +02:00
764a8708f6 Deduplicate games found from multiple sources
When a game appears as both a Steam manifest and an XDG
desktop entry, drop the desktop duplicate. Steam entries are
preferred because they carry cover artwork and route through
the Steam launcher for Proton compatibility.
2026-04-20 11:24:03 +02:00