Commit graph

684 commits

Author SHA1 Message Date
2d7e689d8d Add a calendar to the action drawer
Use the unused lower-left convergence space for KDE's MonthView\ninstead of leaving wallpaper exposed below the notification list.
2026-05-24 15:48:57 +02:00
2e8ab6a741 Fix convergence notifications
Filter @other out of the history blacklist so senders without a\ndesktop entry still land in the drawer. Keep the convergence empty\nstate, dismiss path, and popup geometry aligned with the current\nframe and dock layout.
2026-05-24 15:48:49 +02:00
6cc92b7fa2 Add SPDX headers to motion QML components
Add missing SPDX copyright and license tags to Motion.qml,
MotionColorAnimation.qml, MotionNumberAnimation.qml, and
MotionStateLayer.qml to satisfy REUSE lint in CI.
2026-05-23 09:18:53 +02:00
5311dc8fe8 Own dynamic tiling window workflows 2026-05-22 09:39:11 +02:00
7f9087f342 Move shell popups to shared motion
Apply Motion tokens to notification drag and stack transitions, volume OSD feedback, KRunner field state, media controls height changes, and action-button popup affordances. Leave timeout and marquee animations as timing behavior.
2026-05-21 11:13:06 +02:00
1074b86225 Move shell chrome to shared motion
Use the Motion wrappers for action-drawer transitions, status bar feedback, panel reveal motion, startup feedback, and shell homescreen chrome. Keep non-animation settings reads in ShellSettings where they still control behavior.
2026-05-21 11:12:44 +02:00
8767df8b10 Add shared mobile shell motion primitives
Introduce a central Motion singleton for animation durations, easing, and press scale tokens. Add typed NumberAnimation/ColorAnimation wrappers and a reusable state-layer component so runtime QML can share the same animation policy.
2026-05-21 11:12:20 +02:00
6d766892b5 Unpage convergence quick settings 2026-05-19 09:18:46 +02:00
c38b32042b Fit action drawer surface 2026-05-19 09:18:46 +02:00
ae3319b120 Frame convergence work area 2026-05-19 09:18:46 +02:00
a3173160e2 Render shell-owned icons with theme masks
Use masked Kirigami icons with explicit theme colors for shell controls so the Shift icon theme renders reliably across light and dark surfaces. Replace the status-bar battery helper with theme icon names so battery glyphs also come from org.shift.icons.

Give the app-thumbnail close affordance a symbolic white X on a dark circular backing so it remains visible over previews.
2026-05-17 08:57:06 +02:00
3f6916cafc Add Dynamic Tiling task menu request bridge
Expose a KConfig-backed request channel in MobileShellSettings and use
it from the Folio task menu to request float/tile actions for a single
window.
2026-05-10 09:32:25 +02:00
c5582393bc Promote desktop utilities in action drawer
Reshape the convergence quick settings into a compact
promoted grid and add Clipboard, Disks & Devices, and a
drawer-hosted System Tray popup.

Retry applet popups when their full representation becomes
ready so the desktop utilities open reliably.
2026-05-09 10:00:58 +02:00
daf6ec3fd6 Smooth convergence mode transitions
Animate dock item sizing and button opacity when toggling convergence
mode so the dock does not snap abruptly between states.

FavouritesBar: promote cell/icon/nav/pager/trash sizing properties to
writable and attach NumberAnimation Behaviors (InOutCubic, longDuration).
Home, Overview, and trash buttons fade in/out with an InOutQuad opacity
Behavior so they appear gradually rather than popping.

Dock overlay (main.qml): introduce an `active` guard property so the
window can be driven by opacity (InOutQuad, shortDuration) rather than
toggling visibility directly. Switch the dockOffset slide easing from
a directional InExpo/OutExpo pair to a single InOutCubic so the motion
feels symmetrical.

StatusBar: smooth the background colour and convergence affordance
transitions.
2026-05-06 13:33:25 +02:00
3fba9798e4 Add snap layouts shell setting
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.
2026-05-06 11:44:54 +02:00
ba1428851e Expose KWin titlebar button order to QML
Snap-assist needs the configured decoration button order to find the
maximize button after users move titlebar controls between sides.
2026-05-05 13:30:52 +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
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
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
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
c469ad49b6 Polish quick settings states 2026-04-29 08:39:34 +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
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
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
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
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
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
d58f691c7a Add left-stick navigation and launch fade transition
Expose SDL_GamepadAxis as an Axis enum in GamepadManager so
QML can identify axis events by name.

Convert left-stick deflection into repeated grid navigation
events with a 150ms interval and 0.4 deadzone. First movement
fires immediately when the stick crosses the threshold.

Wrap game launches in a brief fade-to-black curtain (250ms)
before dismissing the overlay, giving visual feedback that the
launch is in progress.
2026-04-20 11:23:55 +02:00
976c770af4 Add cover art, search, filters, and recently played
Grid tiles now show Steam library artwork when available,
falling back to icon+label for games without cover art.
Cell proportions adjusted to 2:3 for portrait covers.

Search bar filters the library by name. Source tabs filter
by All/Steam/Desktop. Both properties live in C++ so QML
just binds filterString and sourceFilter.

"Continue Playing" row shows the last 5 launched games
with artwork, persisted across sessions via plasmamobilerc.

Remove orphaned GameTile.qml (replaced by inline delegate).
2026-04-20 10:03:41 +02:00
1bf8cfb2ba Add gamingshellplugin with SDL3 and game library
SDL3-backed gamepad manager polls at 60Hz, handles hotplug,
exposes battery/rumble/LED per device. Game launcher aggregates
XDG desktop entries, Steam appmanifests, and Flatpak into a
single sorted model.

Game Center uses the new model instead of folio's search model.
D-pad/A/B/Y navigate and launch. Guide button toggles the
overlay. Battery and controller status shown in the HUD.
2026-04-20 09:46:41 +02:00
70fa861b30 Harden gaming mode and fix startup crash
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.
2026-04-20 09:46:32 +02:00
d901815c9d Add gaming mode setting and quick settings tiles
Add a gamingModeEnabled bool and a gamingDismissHintEnabled bool to
the shell settings plugin, persisted in plasmamobilerc [General],
following the same pattern as convergenceModeEnabled.

Two new quick settings tiles:
- org.kde.plasma.quicksetting.gaming: toggles gaming mode on/off,
  shows explicit on/off label matching the convergence tile style.
- org.kde.plasma.quicksetting.gaminghint: shown while gaming mode
  is active; dismisses the Game Center hint.

Both tiles are added to the default group in quicksettings config.
2026-04-19 13:51:00 +02:00
e72beb7296 Show status bar down-arrow at rest in convergence 2026-04-19 09:22:53 +02:00
6a1631023e Theme-aware status bar hover and remove dead nav panel code
Use Kirigami.Theme.textColor for the status bar hover overlay
so it works on both light and dark themes instead of hardcoded
white. Remove convergence-mode branches from the navigation
panel left action since it is hidden in convergence mode and
the code paths were unreachable.
2026-04-18 20:25:26 +02:00
acecbcc86a Fix notification popup position in convergence mode
The input region Y was computed from the bottom of the screen
instead of from the top, causing the touch region to be offset
from the actual popup. Use openOffset directly since the popup
anchors to the top. Unify the popup margin into a single
property so the delegate x and the input-region regionX stay
consistent.
2026-04-18 20:24:48 +02:00
aa4103f72a Add null guards in QuickSettingsDelegate and convergentwindows
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.
2026-04-18 20:24:28 +02:00
8fecdf1d2d Guard against invalid KPackage in AppletHost
loadPackage + setPath can produce an invalid package if the shell
package is missing. Guard with isValid() to avoid passing a bad
package to setKPackage. Add the QML_SINGLETON factory that the
QML engine requires for proper singleton instantiation.
2026-04-18 20:24:11 +02:00
a29019631e Fix KF6Auth find_package order in kauth helpers
find_package(KF6Auth) was placed after target_link_libraries, so
KF6::AuthCore could be undefined when the linker target was
created. Move it before target_link_libraries in both the
flashlight and waydroid helpers.
2026-04-18 19:05:11 +02:00
667efec483 Fix panel interactive flag and reserved height
NavigationPanel: the taskStrip ListView checked contentWidth > width
to decide whether scrolling is enabled, which is wrong when the
panel is vertical. Check contentHeight > height in that case.

taskpanel: dockSpaceReserver used a hardcoded gridUnit * 3 for both
height and exclusionZone. Use navigationPanelHeight so the reserved
strip tracks the actual panel thickness.
2026-04-18 19:04:56 +02:00
9b94c200ee Fix action drawer toolButtons ref and page indicator sync
NotificationDrawer referenced toolButtons, a sibling defined in
ContentContainer, not a local property. Add toolButtonsItem: Item
and wire it at the call site. Replace the magic literal 10 with
Kirigami.Units.largeSpacing while here.

The PageIndicator had a one-way binding to swipeView.currentIndex
that would break after a user tap. Make it bidirectional with a
Connections block and a loop guard on both sides.
2026-04-18 19:04:49 +02:00
2059f14faf Add null guards in AppletHost and TaskWidget
AppletHost: setPreloadFullRepresentation(true) does not guarantee
fullRepresentationItem() is non-null on return — the applet loads
asynchronously. Wire a single-shot connection to
fullRepresentationItemChanged to emit appletReady() when the item
arrives.

TaskWidget: operationDescription() can return null for an unknown
operation name; bail out rather than dereferencing it.
2026-04-18 19:04:40 +02:00