Files
Nebula-OS/shells/desktop/shell/qml/surfaces/DesktopSurface.qml
T
andrew b0c95b9e78 Add desktop app service and VM dev session tooling
Introduces a new `core/applications` QML/C++ module (`Nebula.Applications`) to discover `.desktop` entries, expose filterable application models, and launch installed apps safely from the shell. The desktop launcher now uses real installed apps with themed icon loading and fallback glyphs, adds output-aware surface sizing via `OutputTracker`, and wires in image/icon providers. It also adds VMware-focused Sway/shell wrapper scripts, updates Sway config/session env defaults, and refreshes README docs to document the new development flow and Desktop 0.1 behavior.
2026-08-26 17:19:30 +12:00

72 lines
2.7 KiB
QML

import QtQuick
import QtQuick.Window
import org.kde.layershell 1.0 as LayerShell
import Nebula.UI
Window {
id: root
readonly property int outputWidth: OutputTracker.width > 0
? OutputTracker.width
: (screen && screen.width > 0 ? screen.width : Screen.width)
readonly property int outputHeight: OutputTracker.height > 0
? OutputTracker.height
: (screen && screen.height > 0 ? screen.height : Screen.height)
title: qsTr("Nebula Desktop")
color: "transparent"
flags: Qt.FramelessWindowHint | Qt.WindowDoesNotAcceptFocus
visible: true
width: outputWidth
height: outputHeight
LayerShell.Window.scope: "nebula-desktop"
LayerShell.Window.layer: LayerShell.Window.LayerBackground
LayerShell.Window.anchors: LayerShell.Window.AnchorTop
| LayerShell.Window.AnchorBottom
| LayerShell.Window.AnchorLeft
| LayerShell.Window.AnchorRight
LayerShell.Window.exclusionZone: 0
LayerShell.Window.keyboardInteractivity: LayerShell.Window.KeyboardInteractivityNone
Canvas {
id: backdrop
anchors.fill: parent
onPaint: {
const ctx = getContext("2d")
ctx.reset()
ctx.fillStyle = Theme.background
ctx.fillRect(0, 0, width, height)
let glow = ctx.createRadialGradient(width * 0.12, height * -0.08, 0, width * 0.12, height * -0.08, width * 0.7)
glow.addColorStop(0, "rgba(110, 140, 180, 0.16)")
glow.addColorStop(0.52, "rgba(110, 140, 180, 0)")
ctx.fillStyle = glow
ctx.fillRect(0, 0, width, height)
glow = ctx.createRadialGradient(width * 0.88, height * 1.08, 0, width * 0.88, height * 1.08, width * 0.45)
glow.addColorStop(0, "rgba(42, 68, 98, 0.28)")
glow.addColorStop(0.58, "rgba(42, 68, 98, 0)")
ctx.fillStyle = glow
ctx.fillRect(0, 0, width, height)
glow = ctx.createRadialGradient(width * 0.62, height * 0.38, 0, width * 0.62, height * 0.38, width * 0.28)
glow.addColorStop(0, "rgba(72, 92, 120, 0.08)")
glow.addColorStop(0.7, "rgba(72, 92, 120, 0)")
ctx.fillStyle = glow
ctx.fillRect(0, 0, width, height)
const veil = ctx.createLinearGradient(0, 0, 0, height)
veil.addColorStop(0, "rgba(8, 11, 17, 0.22)")
veil.addColorStop(0.16, "rgba(8, 11, 17, 0)")
veil.addColorStop(0.78, "rgba(8, 11, 17, 0)")
veil.addColorStop(1, "rgba(8, 11, 17, 0.38)")
ctx.fillStyle = veil
ctx.fillRect(0, 0, width, height)
}
onWidthChanged: requestPaint()
onHeightChanged: requestPaint()
}
}