aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
25 hoursfix(desktop): name the kdeconnect injected property kc, not modDanilo M.5-29/+36
The tile, page and row each took a required property named mod while the module object's id is also mod. In a Component scope the id resolves to the property's own unset self, so every page.mod read was undefined and the device list never rendered. Only a runtime TypeError showed it; the smoke check was clean because the drawer was closed. kc matches the net and bt convention and cannot collide with the id.
25 hoursdocs: record the KDE Connect trapsDanilo M.2-0/+20
No D-Bus module means shell-outs and no push; the daemon and the indicator are separate; the battery plugin is not on every device; and qdbus reads properties and methods through one call shape.
25 hoursdocs(desktop): document the kdeconnect moduleDanilo M.2-7/+53
Records that the phone-to-PC clipboard is the daemon's plugin and not the indicator's, so removing the indicator does not break it, and that polling stops when the drawer closes.
25 hoursfeat(desktop): share a file to a KDE Connect deviceDanilo M.2-0/+30
A QtQuick.Dialogs FileDialog held on the module, not the page, so a closed drawer does not destroy it mid-pick. The path is decoded from the file:// URL before it reaches kdeconnect-cli.
25 hoursfeat(desktop): KDE Connect pairingDanilo M.2-0/+54
Outgoing pair and unpair go through kdeconnect-cli; accepting and rejecting an incoming request go straight to the daemon, since the CLI has no verb for them. The verification key is shown on the row while a pairing is in flight so the two ends can be compared. An incoming request is not noticed while the drawer is closed, because the poll only runs when it is open; the daemon keeps the request, so it is there on the next open.
25 hoursfeat(desktop): KDE Connect device actionsDanilo M.1-0/+30
Ring, clipboard, mount and unpair, all shell-outs since there is no D-Bus module. Actions share one serialized Process and a failure notifies, for the case where the drawer has closed by the time the command returns. Mount runs --mount and then --get-mount-point in one shell, because --mount prints nothing and the path is a second call.
25 hoursfeat(desktop): KDE Connect module, tile and pageDanilo M.5-0/+359
State is polled from kdeconnect-state.sh because there is no D-Bus module to subscribe with. The poll runs only while the drawer is open: the tile is created when the panel loads and destroyed when it unloads, and it flips the module's polling flag. The laptop reports no battery plugin, so an absent charge is an empty field and renders as nothing, never as a zero.
25 hoursfeat(desktop): KDE Connect state scriptDanilo M.2-0/+218
Quickshell 0.3.1 has no generic D-Bus module, so device state comes from qdbus6 shell-outs. The script emits a tab line protocol for the QML side and is checked by a stub-daemon test, since the live daemon is not an oracle an agent can rely on. A failed daemon query exits non-zero with no output so the module keeps its last list, which is not the same as a valid empty device list.
25 hoursdocs: KDE Connect module design and planDanilo M.2-2/+1226
Absorbs the kdeconnect-indicator into the drawer: status, battery, pairing, ping, clipboard send, file share, refresh and mount. State is polled from a qdbus6 helper script while the drawer is open, since quickshell 0.3.1 has no generic D-Bus module. The spec notes the phone-to-PC clipboard is the daemon's plugin, not the indicator's, so removing the indicator does not touch it.
25 hoursdocs: KDE Connect state protocol carries the pair flagsDanilo M.1-8/+14
The pairing flow needs isPairRequested, isPairRequestedByPeer and the verification key, so the polled line carries them; the key is only queried with a pairing in flight. A failed daemon query is a non-zero exit with no output, which is how the module tells it apart from a valid empty list. Pairing failure comes from the kdeconnect-cli exit code, not the pairingFailed signal, since there is no generic D-Bus module to watch it.
25 hoursdocs: KDE Connect module designDanilo M.1-0/+217
Status plus basic actions, absorbed from the indicator. State comes from qdbus6 over kdeconnectd, since quickshell 0.3.1 has no generic DBus module. Polled while the drawer is open, driven by the tile lifecycle. Notes the indicator is not what serves the phone-to-PC clipboard, and the FileDialog focus risk under an Exclusive layer surface.
26 hoursdocs: hot reload does not pick up a new component fileDanilo M.1-0/+10
Adding desktop/Switch.qml while only editing files under modules/ left it out of the running shell's generated qmldir, so the two pages that use Switch could not resolve it and their tiles dropped from the grid. The code was correct; a fresh process rendered it. The directory's qmldir is regenerated only when a file that imports the directory reloads.
26 hoursfix(desktop): disable bluetooth switches until the adapter is upDanilo M.1-0/+2
26 hoursfeat(desktop): a theme-coloured SwitchDanilo M.3-2/+47
26 hourschore: ignore the local TODO.mdDanilo M.1-0/+1
26 hoursdocs: glyphs render with Theme.iconFamily, pinned to InconsolataDanilo M.1-0/+9
Fontconfig falls back per codepoint, so the same codepoint can be a different glyph in a different Nerd Font: the ethernet codepoint rendered as a gamepad. The theme now pins the family and the note says to check the font cmap for a new glyph.
26 hoursfeat(desktop): pin glyphs to Inconsolata Nerd FontDanilo M.8-11/+17
Glyphs are Nerd Font private-use codepoints, and relying on per-codepoint fontconfig fallback from Noto Sans let the same codepoint resolve to a different glyph in a different Nerd Font. A Theme.iconFamily now names the render family once, and every glyph Text uses it, while fontFamily stays Noto Sans for words and labels. The ethernet glyph moves from \uf6ff to \uef44, the fa-ethernet codepoint present in Inconsolata.
26 hoursfix(desktop): use the real ethernet glyph, not a gamepadDanilo M.1-1/+1
26 hoursdocs: the network tile is a globe and reads the local IPDanilo M.1-4/+13
The tile no longer swaps a wired/wifi icon, and the local IP comes from ip -j because Quickshell.Networking exposes only the MAC. Recorded in the spec so it matches the code.
26 hoursfeat(desktop): globe network tile with per-link IPsDanilo M.4-30/+122
30 hoursfix(desktop): wire tile active state and clear connect errorsDanilo M.8-10/+26
30 hoursdocs: record the network and bluetooth trapsDanilo M.2-0/+18
The native backends start empty for about two seconds, device lists are ObjectModels, NMSettings is not in QML scope, and quickshell has no BlueZ agent. Each one cost a probe to learn; writing them down is cheaper than re-learning them.
30 hoursdocs: correct three plan details found during executionDanilo M.1-14/+32
The Connections block needs a typed property on a QtObject, the bluetooth README lines belong to Task 6 so every commit stays self-consistent, and Pairing has no status property. Each was found by a task review and fixed in the plan as well as the code.
30 hoursdocs(desktop): document the bluetooth moduleDanilo M.2-6/+46
30 hoursfeat(desktop): pair bluetooth devicesDanilo M.3-0/+117
Quickshell has no BlueZ agent and no generic D-Bus module, so a pairing that needs a passkey confirmed cannot be done from QML. bluetoothctl registers its own agent, so pairing is the one shell-out; adapter state, scanning, connecting and forgetting all stay native. The timeout is the ceiling: a device bluetoothctl cannot auto-confirm fails visibly rather than hanging the page.
30 hoursfix(desktop): scale bluetooth battery to a percentageDanilo M.1-1/+1
30 hoursfeat(desktop): bluetooth module, tile and pageDanilo M.5-0/+295
Native Quickshell.Bluetooth for adapter power, discoverable, scan, connect, disconnect, trust and forget. Pairing is separate, because quickshell ships no BlueZ agent. The adapter is null for the first ~2s, so every access is navigated safely rather than assuming a first paint.
31 hoursdocs(desktop): keep the network module docs self-consistentDanilo M.2-11/+11
31 hoursdocs(desktop): document the network moduleDanilo M.2-1/+37
31 hoursfeat(desktop): network wifi pageDanilo M.2-1/+211
Radio switch, scan, and a list ordered connected, known, strongest. A secured unknown network reveals an inline password field rather than opening a popup, since a QtQuick.Controls popup is a separate window that positions badly on this layer surface, the same reason the sound page expands in place. Connection failures come through the Network.connectionFailed signal and show inline; the same failure also notifies, for the case where the drawer has closed by the time it lands.
31 hoursfeat(desktop): network module, live tile and wired pageDanilo M.4-0/+228
Wired first because it is the simpler half and proves the module wiring. Native Quickshell.Networking, no polling: the singletons push, and alwaysActive is true with no Service.qml because there is nothing to gate. The tile shows one line per active link rather than picking a primary, since the API exposes no route metric and guessing wrong would be worse than showing both.
31 hoursdocs: plan the network and bluetooth modulesDanilo M.2-5/+1350
Eight tasks, each leaving the tree working: network wired page, wifi section, README, bluetooth module and page, pairing, README, then the waybar removal and the trap notes. The spec's failure section is corrected in the same commit: it claimed forget and disconnect failures would surface inline, but neither backend exposes a failure signal for them, so that is a ceiling rather than a feature. Verified by probe before writing any task: the singletons start empty for about two seconds, the device lists are ObjectModels, signalStrength is 0..1, scanner and discovering are writable, and NMSettings is not in QML scope, which drops the hidden-network join the spec had left conditional.
31 hoursdocs: design for network and bluetooth modulesDanilo M.1-0/+160
Two drawer modules covering wired, wifi and bluetooth, using the native Quickshell.Networking and Quickshell.Bluetooth backends rather than nmcli or bluetoothctl. The one exception is pairing: quickshell ships no BlueZ agent and no generic D-Bus module, so a device needing passkey confirmation is paired through bluetoothctl, whose own agent handles it. The wifi module became Network so a connected eth0 does not mask the wifi state; the tile shows both links when both are up because the API exposes no route metric. Replaces waybar's network and bluetooth indicators, per the drawer being the single place they are managed.
31 hoursfeat(sound): switch default device, control the levelDanilo M.2-24/+179
The sound page showed the default sink and source but gave no way to choose another device and the meter was inert. Each section now lists the real audio devices, streams and monitor nodes filtered out, behind an in-place dropdown that sets Pipewire.preferredDefaultAudioSink or preferredDefaultAudioSource. The meter takes the wheel, click and drag, and the state glyph beside the percentage toggles mute. The list expands in place rather than in a popup because a QtQuick.Controls popup is a separate window and does not position reliably on a layer surface. The meter accepts the wheel and prevents stealing so the page's ScrollView neither scrolls nor flicks instead.
32 hoursfix(desktop): honest alwaysActive docs and working Escape in confirmDanilo M.7-41/+51
32 hoursdocs: correct drawer exit behaviour and dead module commandsDanilo M.4-26/+33
The README claimed a click outside returns to the grid; it closes the drawer, and only Escape-with-a-page or the back arrow return to the grid. The three moved module READMEs' run and IPC commands still named the deleted volume-osd, mail-overview and vm-manager paths, so point them at qs -p desktop and ipc call drawer open sound|mail|vm.
32 hoursdocs: the desktop shell and what the merge changedDanilo M.6-20/+180
Five components become three, and the Theme symlink count with them. Two new notes: a pragma Singleton in a subdirectory resolves through a plain directory import with no qmldir, and Virsh.sampling gates only the stats poll, not the lifecycle stream that keeps the tile correct while the page is closed.
32 hoursfeat(desktop): move vm-manager in as the vm moduleDanilo M.11-544/+457
Virsh.qml is unchanged; VmPanel's body becomes the page and the stat row becomes a Flow, because four stats with 150px bars do not fit a 600px drawer as one row. The page starts and stops Virsh.sampling, so the 2s poll runs only while something is looking at it; the lifecycle event stream still runs always, which is what keeps the tile's dots current.
32 hoursfix(desktop): start the mail Accounts singleton at shell launchDanilo M.1-0/+7
The singleton was referenced only inside lazy Components, so its qtmaildir.conf watcher and unread-count refresh did not start until the drawer first opened, contradicting alwaysActive and the old MailPanel, which shell.qml instantiated directly. Naming Accounts at the Module top level creates it at shell load; the page keeps its own refresh on open.
32 hoursfeat(desktop): move mail-overview in as the mail moduleDanilo M.12-331/+274
Accounts.qml is unchanged and MailPanel's body becomes the page. The three scripts move with it, which changes the absolute paths in autostart and in the waybar module; both are outside this repo and listed in the plan's final task. Button.qml, byte-identical here and in vm-manager, lands at the shell root as the single copy.
32 hoursfeat(desktop): move volume-osd in as the sound moduleDanilo M.10-126/+346
VolumeOsd.qml did three jobs in one file: PipeWire tracking, the OSD surface and the player transport. They become Service, Osd and the page. The OSD keeps its namespace so the existing Hyprland blur rule still matches, and the service stays always-active because the OSD has to answer a keypress with no drawer open.
32 hoursfeat(desktop): the appearance tileDanilo M.2-1/+39
A tile with no page: appearance stays its own process because a wallpaper picker needs more room than a 600px drawer, so the tile only fires its existing IPC. This is the case the contract's activate() exists for.
32 hoursdocs: correct the plan's no-arg ipc open and the head pipeDanilo M.1-6/+20
Quickshell 0.3.1 IPC requires every declared argument, so the plan's `ipc call drawer open` with no page fails; the page-less grid entry is the zero-argument `toggle`. Also records that `... | head` races timeout and kills the shell early, so verification uses a file redirect.
32 hoursfix(desktop): slide the page with a transform, not anchored xDanilo M.1-3/+7
The page Loader is anchored to its parent, so the x binding on it was overridden and the slide never rendered. Drive the motion with a Translate transform instead, which the anchors do not touch. Opacity and the back-arrow wiring are unchanged.
32 hoursfeat(desktop): the drawer, with the top reservedDanilo M.2-4/+210
Left of DP-1 because conky holds the right; ExclusionMode.Normal so the bar the drawer is reached from stays visible and clickable. The top is an empty Item claiming the space the notification engine will fill, so the grid already sits where it will sit once that lands.
32 hoursfeat(desktop): tile and page chromeDanilo M.2-0/+147
The page body scrolls because mail with several accounts and vm with several VMs both exceed the drawer height; the tile grid deliberately does not, being fixed at a 3x3 ceiling.
32 hoursfeat(desktop): the module contractDanilo M.1-0/+49
A module provides a tile, a page, both or neither, plus alwaysActive, which governs the background service rather than the page: the drawer is closed most of the time and three of four modules have background work.
34 hoursdocs: a subdirectory singleton needs no qmldir, drop it from the planDanilo M.1-71/+54
The plan claimed a pragma Singleton outside the config root is invisible until a qmldir names it, and had Task 1 create one plus Tasks 6, 7 and 8 append a line each. That premise was wrong. Tested: a pragma Singleton in modules/sub/, reached by a plain import "modules/sub", resolves with no qmldir anywhere. The control was a reference to a genuinely undefined type, which warns "ReferenceError: <name> is not defined"; the singleton case produced no such warning and the binding evaluated. This matches what AGENTS.md already documented about Theme.qml, which the code review pointed out. Four registration steps removed and the remaining steps renumbered. The AGENTS.md note Task 9 adds now records the tested behaviour rather than the invented one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
34 hoursfeat(desktop): skeleton shell with the keepalive windowDanilo M.2-0/+30
The window draws nothing and catches nothing; it exists because a quickshell config with no visible window exits silently, and this shell's drawer is closed most of the time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
34 hoursdocs: warn that the config task's tilde paths must be typed absoluteDanilo M.1-0/+9
The paths are written with a tilde because this file is committed and the repo forbids home paths in committed files. But neither Hyprland's exec_cmd nor waybar's exec goes through a shell, so a tilde there never expands and fails silently, which reads as a broken keybind rather than a bad path. The two rules genuinely conflict here, so the plan now says which form goes where instead of shipping lines that would not run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv