aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/modules
AgeCommit message (Collapse)AuthorFilesLines
4 dayssonix: folders breadcrumbs read as a path from "SD card /"Danilo M.3-5/+7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysisland: shuffle and repeat as two Sonix buttonsDanilo M.2-11/+41
The one mode button cycled all five SonixLink modes and showed repeat-off as its first state, so shuffle looked missing. Shuffle is now a toggle on the left and repeat a cycle on the right. SonixLink has no shuffle with repeat one, so with shuffle on repeat goes off and all only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 dayssonix: final review fixes: header, stale state, curl errors, plain textDanilo M.5-0/+10
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4 dayssonix: boot logo fixes from review, own HiBy R1 groupDanilo M.3-24/+32
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysdocs: the Sonix playerDanilo M.1-0/+67
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4 dayssonix: the boot logo page in the settings windowDanilo M.1-0/+54
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 dayssonix: the boot logo editor's controls, save and uploadDanilo M.1-0/+338
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 dayssonix: the boot logo canvas: picture, duotone text, grabDanilo M.1-0/+139
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 dayssonix: folders tab fixes from reviewDanilo M.1-2/+7
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4 dayssonix: playlists tab fixes from reviewDanilo M.1-4/+4
4 dayssonix: the Folders tab, with add to playlistDanilo M.2-1/+195
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4 dayssonix: the Playlists tabDanilo M.2-1/+152
4 dayssonix: no undefined in the Device tabDanilo M.1-2/+2
4 dayssonix: drawer tile and the Device tabDanilo M.5-0/+306
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
4 dayssonix: SonixLink's bitrate is in bits per secondDanilo M.2-3/+3
4 dayssonix: the four boot logo faces and Bungee Inline, SIL OFLDanilo M.10-0/+465
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
4 dayssonix: relay the player's UDP beacon to stdoutDanilo M.2-0/+66
4 dayssonix: pure helpers for the player, with their testDanilo M.2-0/+214
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
5 dayswallpaper engine: count down to the next changeDanilo M.1-2/+22
The header gave the clock time of the next change, which left the sum to the reader. It now counts down, from a one second timer that lives on the page, so nothing ticks while the page is closed. The engine still keeps only nextAt. The function is remaining(), not left(): left is Item's anchor line, so the call threw a TypeError and the status text went blank, which a clean hot reload does not show until the page is opened. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 dayswallpaper: one monitor to preview, a line per transitionDanilo M.6-138/+261
Selecting was unclear with a tile doing both jobs. A mock monitor now plays whatever line is clicked, and a click changes nothing else; the choice is an Active mark per line, and Random's pool a Switch beside it. Each line shows a frame caught halfway through its transition. MockScreen takes children, drawn on its panel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysdocs: wallpaper transitionsDanilo M.1-14/+24
Also how to check a shader headless: the offscreen platform is the software backend, where a ShaderEffect draws nothing, and an end frame check passes for every shader while proving nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 dayswallpaper: a page to preview and pick the transitionDanilo M.3-0/+220
A tile per transition plus Random. A click selects in the draft and plays the real shader between the two current wallpapers, and Apply or Reset in the header settle it, like every other draft page. Ticks are Random's pool. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 dayswallpaper: six more transitionsDanilo M.12-0/+281
Ink, shatter, ripple, melt, blinds and cross-warp. Each draws the old picture exactly at progress 0 and the new one at 1, or the cover would pop as it comes and goes: rendered under Xvfb with llvmpipe against the plain pictures, all seven differ by 0 at both ends. Ripple and cross-warp sample the new picture, the rest are transparent over it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 dayswallpaper: play the transition by nameDanilo M.5-22/+56
Transitions.next() is asked once per run and the name goes out through swapping, so both screens play the same effect, and the cover runs it through WallShader, which the settings page's thumbnails will share. progress is a plain 0 to 1 for every shader now; burn.frag keeps the range it was tuned for by remapping it. newImg gains a layer so it can be a shader's target: an Image sampled directly gives the whole picture, not its PreserveAspectCrop crop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 dayswallpaper: a singleton for the chosen transitionDanilo M.1-0/+63
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 dayswallpaper: choose a transition, by name or at randomDanilo M.2-0/+83
A named pick plays as it is; random draws from the ticked pool and skips what played last while anything else is there. Saved values are checked here too, so a stale or hand-edited name lands on something playable. A JS library rather than QML, to test it under node as Shuffle.js is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 daysvm: say what to do when a saved state won't restoreDanilo M.1-1/+9
A managed save written by libvirt 12.0.0's default raw format restores through an fd: migration, which QEMU 11.1.2 refuses with "migrate-incoming: fd: migration to a file is not supported. Use file: instead." The start then fails the same way every time, and the notification only carried that raw error, which does not say the fix is the page's own Discard saved state button. A start failure mentioning migrate-incoming now leads with that advice and keeps the raw error below it. The host side was fixed separately with save_image_format = "sparse" in qemu.conf, which restores through file: and was checked with a managedsave and start round trip. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 dayswallpaper: keep the pair the engine put upDanilo M.3-1/+25
The engine's ticks are light runs: udt-accent leaves GRUB, the homepage and SDDM on the home pair. When a tick lands on a combination worth keeping, there was no way to promote it short of re-picking both images by hand. "Keep this pair" reruns wallp on the current pair without UDT_ROTATION, so the full run brings those three along, and makes it the engine's home, so switching the engine off does not undo it. The timer restarts, as after a pick by hand. The button shows only while the engine is on and the pair up differs from home, so it hides once kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: keep unsaved edits across another page's reloadDanilo M.1-1/+4
Any configreloaded reread the draft, so saving on the Options or Keyboard shortcuts page silently dropped unsaved monitor edits. The handler now goes through refresh(), which skips a dirty draft, and revert() returns the draft to orig itself so its own reload still rereads. The spec now says one eval per monitor and the reload after a refusal, as built. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysdocs: the monitors settings pageDanilo M.1-0/+36
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: keep the drag, freeze the cards while pendingDanilo M.1-1/+10
The page's ScrollView took a vertical drag and cancelled the MouseArea, leaving the monitor drawn at its offset with nothing written; it now prevents stealing and clears the offset on cancel. A click without movement no longer snaps. The cards are disabled while an Apply waits for Keep, which writes the draft and so must not write untried edits. The mode list comes from orig, which set() leaves alone, so an edit to another field does not hand the ComboBox a new model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: the layout canvas and the per-monitor cardsDanilo M.1-3/+247
Monitors drawn at logical size, fitted to the canvas; a drag moves one by an offset and on release snaps it within 64 logical px of the other's edges and writes an exact position. The cards set mode from the deduplicated list, scale (read on every change, since a click on Apply does not end editing), rotation and flip, VRR, and auto or exact position. Leaving the page with an Apply unanswered reverts it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: report Keep's write, resync without the autoreloadDanilo M.1-2/+8
"saved" now waits for FileView's saved, and a failed write shows its error: the change is live but the next reload would bring the old file back. Keep sets orig from the draft itself rather than relying on the autoreload's read, apply() clears a skipRead a refusal's reload never consumed, and an unreadable hyprctl reply says so instead of showing an empty page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: settings module, try live then keep or revertDanilo M.2-0/+180
Apply evals each monitor's hl.monitor line, one call each because eval wraps its argument in a return. Keep writes sections/monitors.lua whole; Revert or 15s without an answer is hyprctl reload, which reapplies the untouched file. A refusal also reloads, since an earlier monitor's eval may have gone through. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: draw a scale being typed at 1Danilo M.2-2/+13
The page binds the canvas to size(), and an empty or partial scale gave Infinity or NaN and broke the fit. Apply is still held back until the scale is a positive number. Also marks the per-axis snap as a ceiling and checks a rotated scaled monitor and a two-monitor file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysmonitors: pure helpers for the settings pageDanilo M.2-0/+170
The Lua for a monitor and for monitors.lua, logical size, edge snapping and the mode list, with the duplicates the ASUS reports collapsed and the current mode matched by nearest refresh (99.943 against 99.94). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysai: drop local chatDanilo M.4-30/+9
local-chat (llamachat) is archived and uninstalled, superseded by desktop-assistant, so its row could only ever read stopped and its buttons called a command that no longer exists. Also folds the control comment that described llamachat's restart dance down to one line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 daysDrop breaktimer and the archived AI appsDanilo M.10-209/+21
breaktimer is parked and imggen and fanfictioner are archived and uninstalled, so the shell was reading files nothing writes and offering buttons that call commands that no longer exist. Status: remove the bt* properties, the file watchers behind them, the verb runner and the presentation-mode pause/resume. The status page loses BreakRow and the tile falls back to "All clear". AI: remove the imggen and fanfictioner rows from ai-state.sh, their labels and controls, and the pid-based fanfictioner stop. The sd-cli engine row stays, since the wallpaper upscaler uses sd-cli too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: upscale a too-small staged image in placeDanilo M.3-0/+147
A staged wallpaper smaller than its screen (yellow or red border) gets an "Upscale 4x" button. It rewrites the file with Real-ESRGAN through stable-diffusion.cpp's `sd-cli -M upscale`, keeping the name, so wallp's state and the engine's lists, which name it by path, still find it. sd-cli writes to a dot-named sibling the scan skips, and only a successful run is moved over the original. Success needs no [E] line as well as exit 0: with a model that fails to load, sd-cli logs "[E] new_upscaler_ctx failed", saves the input unscaled and exits 0 (measured). The button takes two clicks so the model choice shows before anything is rewritten. The first runs Imajev-4B, a small Jev-style vision decision model, through llama-mtmd-cli on a 512 px thumbnail, with a grammar that allows only A (anime) or B (photo or render); greedy decoding then returns the higher-logit option, about 1.7 s. The label becomes "Upscale 4x (anime)" or "(photo)", and the second click upscales with the anime or the general model. Anything but A, including a failed decider, picks the general model, safe on any image. Imajev-4B was chosen by measurement on 22 wallpapers: all 12 anime and 4 photos right, 4 of 6 painted 3D renders called anime (those come out smoother than painted). The 2B got 17 of 22, leaning to photo; a three-way prompt adding "painted or render" dropped both to 15 or fewer, with most anime called painted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 daysdocs: the wallpaper engine and the burnDanilo M.1-3/+51
The appearance README gains the burn (the cover, the covered() handshake and why, the shader cache trap) and the engine (sources, shuffle, light run, homes, the draft page, where its state lives and what starts it). The spec records what changed while building it: Prefs instead of list files, a page of its own, folder sources, the header buttons, the cover handshake. AGENTS.md gains the Field.edited trap, which applies to every page with a field and a button: a click does not end editing, so the value a button acts on must be read on every change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: keep the burn's cover clear until both pictures are decodedDanilo M.1-0/+6
A brief flicker was left at the start of the burn on both screens. The cover drew each picture as soon as it decoded, and the new one, under the old, usually decodes first, so it showed for a frame or two before the old one covered it. Both now stay hidden until both are ready; the surface is clear until then, and swaybg underneath is still showing the old picture, since wallp waits for covered(). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: start wallp only once the burn's cover is on screenDanilo M.2-4/+40
The new wallpaper flashed in for a moment, the old one came back over it, and only then did it burn. run() started wallp in the same turn as swapping, while the cover was still mapping and decoding its two pictures asynchronously, so swaybg swapped under an empty cover. run() now holds wallp until each cover reports it is drawing (its pictures decoded, then 50ms for a few frames), with a 1.5s fallback for a cover that never comes: a missing screen or a picture that fails to load. A run with nothing to cover starts at once, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: engine page commits like the others, Start changes at onceDanilo M.3-18/+100
The page was the only settings page without the header's buttons, and it switched the engine from a checkbox beside the interval. Both looked like the engine had been started when it had not: - The minutes field saved on editingFinished, which needs Enter or a focus change. Clicking the checkbox takes neither, so a typed 1 was left at 30 and the first change was half an hour away. - Even at the right interval, the first change waited one full interval, so starting the engine did nothing visible. The interval and the two sources are now a draft in WallEngine, updated on every keystroke, and the header carries the state ("running, next change at hh:mm", "stopped", "unsaved changes") with Reset, Stop and Start, which reads Apply while running. Start commits the draft, sets the homes and changes the wallpapers straight away; Apply commits and restarts the timer. Hearts stay undrafted, written as clicked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: a screen can draw from a gallery folder instead of its heartsDanilo M.2-4/+43
Every wallpaper in the gallery is wide, so hearting a whole folder one thumbnail at a time is the long way to say "this folder". Each screen now has a source on the engine page: its hearted list, or one gallery folder picked by chip, stored as the Wallpapers.groups key in Prefs (folderH, folderV, "" for the hearts). A folder that has left the gallery gives an empty pool, so that screen is left alone rather than quietly falling back to its hearts. The hearted list stays saved behind a folder source and comes back with the Hearted chip. Switching source needs nothing from the shuffle: draw() already drops bag entries that are no longer in the pool. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: engine page glyphs as escapes, like the rest of the treeDanilo M.2-2/+2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: the engine's settings pageDanilo M.2-0/+178
A page for the wallpaper engine: the on switch, the interval in minutes, a Next button, and each screen's hearted list with a remove control and a dim for files the gallery's scan did not find. The module reads WallEngine.on itself, because a singleton is built on first use and the timer has to run from session start, page opened or not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: the heart is back, for the engine's per-screen listsDanilo M.1-0/+22
A heart on each gallery thumbnail adds or removes the image from the engine's list for the screen the picker targets. It is the last child of the thumbnail, so it sits above the pick MouseArea and takes its own click, and it is outlined so it reads on a light image. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: the engine, a timer over the hearted lists with a home per screenDanilo M.1-0/+115
Ticks go through Wallpapers.run as the light run so the burn plays without touching GRUB, the homepage or SDDM. Switching off returns each screen to its home with a full run, deferred until any run in flight finishes. Not yet registered in the shell; that comes with the settings page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: one run() for Apply and the engine, with a finished signalDanilo M.2-11/+39
The engine's timer must set wallpapers the same way Apply does so the burn plays. run() is that one path; applied stays Apply's alone (save bar, window close) while finished marks every run's end, which is what the spread overlay now hides on. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 dayswallpaper: a shuffle bag for the engine's orderDanilo M.2-0/+80
Each round shows every hearted wallpaper once, in random order, so no picture is skipped or doubled within a round. A reshuffle never opens with the picture on screen, so the same wallpaper cannot appear twice in a row across the round boundary. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>