Skip to content

Releases: mnsky-tyan/mnpaper

v2.7.28

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 28 Oct 06:19

Linux (Wayland) port.

A full codebase audit of linux/ (2026-10-28), fixed:

  • Documentation now matches the code: the scale-invariance test is
    described as it really is (six scales including the fractional ones,
    sampled at shared logical points, 1-level alpha tolerance), the
    PAPER_MAG_SCALE history distinguishes the old 2.9 from the current 2.3f,
    a nonexistent IPC command was removed from the protocol list, the tray
    icon section describes the generated six-size icon_tables.h instead of
    the retired 24x24 table, and the cleanup recipe no longer checks for a
    /dev/shm object that is unlinked at open.
  • The tray wire tests now reach every row they used to skip: the Warmth
    submenu is drilled and clicked (first and last rows, checkmark push
    asserted moving both ways), Start at login, Edit settings file... and
    Quit are clicked with counting callbacks, and Scroll is driven end to
    end (preset stepping, clamping at both ends without re-firing, and a
    custom value snapping into the ladder). A wiring regression in any of
    those used to pass the whole suite silently.
  • The config round-trip test is total: write, parse, re-write, byte
    comparison, plus a scan that every one of the 15 keys is present and
    seeded away from its default.
  • CompositeOver existed in three copies (Linux daemon, Windows daemon,
    tests); the Linux side now shares one copy in paper_core.h and the
    Windows twin keeps a byte-identical copy with a keep-identical note.

No behaviour change: the daemon binary is identical in behaviour to
2.7.27; this release lands the audit's documentation and test hardening.

Asset sha256: 54b9d50deda263e04eebe029ab5254167c0da22e7cf927f54d01e32ed8c1b205

v2.7.27

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 27 Oct 17:32

Linux (Wayland) port.

  • A settings change always lands on the first try. When a bake finished
    while the surface was briefly showing something else (a resize or a
    toggle whose commit was skipped for a buffer still owned by the
    compositor), the generation was stamped but the new pixels were never
    committed - and the stamp is exactly what tells the queue "this paper is
    ready", so every following change was a silent no-op until you cycled
    Show paper off and on. The commit now always follows the stamp. This is
    the second symptom you reported: "the effect needs untick and tick
    before the config change actually lands".
  • The boot race survives slow compositors. The autostart wait was 20 s and
    a real boot on 2026-10-24 outlived it: the autostart instance gave up
    with "cannot connect to a Wayland compositor", so the paper you had left
    ticked appeared off after reboot, and only Plasma's session-restore
    second start brought anything up. The wait is now 60 s and logs its
    progress every 10 s.
  • The log can now answer questions like these: every line carries a
    wall-clock timestamp, every Show-paper transition logs the direction and
    its source (tray menu, --toggle, --on, --off), every IPC command is
    recorded, and every texture regeneration logs the five values it baked.

Asset sha256: b4dcfd300f4aff99ab873a419f4bf811201cabc8e5441cb128b383786b3af6d3

v2.7.26

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 27 Oct 15:21

Linux (Wayland) port.

  • The fibre and blotch sliders no longer repaint the paper's pattern. They
    used to re-weight the mix that decides which patches are warm highlights
    and which are shadows, so adjacent steps moved under 2% of pixels while
    the top of the dial re-decided a tenth of the screen across the
    highlight/shadow line (22% with both sliders swept end to end). The
    result was a control that sometimes did nothing and sometimes produced a
    different paper, which read as "same settings, different output".
  • The pattern now belongs to the grain field alone. Fibre lays in paper
    strands and blotch in uneven patches as pure alpha overlays, warmth only
    tints. Every ten-step of fibre is now linear and even - 37-58% of pixels
    per step at default strength - and no step flips a single pixel between
    the highlight and shadow families. fibre=0 is a strand-free paper with no
    ghost structure left behind.
  • PAPER_MAG_SCALE refit 2.9 -> 2.3 for the single-field distribution
    (measured mean 0.216, sd 0.152, max 0.895; scale = 1/(3 sigma)), which
    preserves the calibration the user accepted in 2.7.23: median veil alpha
    38 at intensity 30, p99 68.
  • Tests: TestStrengthSlidersDoNotRepaintPattern pins the guarantee in
    both suites - the un-premultiplied colour of every pixel is identical at
    fibre/blotch 0 and 100. Verified to fail against the old engine: 10.3%
    of pixels flipped. The Windows warmth floor drops 8 -> 6 with the
    measurement recorded, because the swing now measures warm -11 / cool +7
    and the old floor was set with zero margin on the number it measured.

The render itself was never nondeterministic: the real state machine
converges to byte-identical pixels from any settings history, and the same
settings keep rendering the same paper.

Asset sha256: acc5f0f028957dabb5c18499bf52b68605b7cd2f0f644f2ce10063732a1699e1

v2.7.25

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 27 Oct 04:12

Linux (Wayland) port.

  • The tray icon is crisp now. It was served as a single 24x24 pixmap, and
    this display runs at compositor scale 2, so the panel smoothed it into
    48 device pixels every frame. IconPixmap is an array precisely so the
    shell can pick a size at its own scale: the tray now serves 16, 24, 32,
    48, 64 and 128, so a scale-2 panel gets a native 48.
  • The icon is the brand card, not the full square board: cropped to the
    card's outer stroke, square-fitted with transparent padding, and clipped
    to the shared corner radius r = 43/277 of the icon edge (~15.5%) with a
    4x4 supersampled alpha mask. Only alpha outside the card changes; no
    pixel inside it is altered.
  • mnPaper.ico comes from the same generator, so every size the two share
    is the same pixels; each .ico entry is verified byte-identical to its
    per-size render.
  • The radius is written down once for all mn projects in
    mnbrand/docs/icon-corner-radius.md, and each app's switch instructions
    point at it, so future icon work in any of them uses the same corner.
  • Tests: tests/test_tray.c now drives the real property on the wire and
    pins six square entries with wh4 bytes, transparent corners and solid
    centres - verified to fail against the old single-size icon.

Asset sha256: 3f980138d8c6d3769f7a29d9b56772b82bb92ed752b4652560957caf53485801

v2.7.24

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 24 Oct 19:08

Linux (Wayland) port.

  • The paper texture is now a property of the screen, not of the pixel
    buffer. The port had dropped the Windows build's coordinate scale, so
    PaperPixel sampled raw device pixels while the noise lattice periods
    were derived from the device-pixel buffer width. BufferGeometry picks
    that width from whichever scale the compositor last reported, so the
    same 1800-logical panel was a 2880px buffer under fractional 1.6 and a
    3600px buffer at integer 2 - the same screen, completely different
    paper. Measured over the same logical surface: 96.14% of alphas differed
    by more than one level, max drift 111.
  • The settings path itself was never order dependent: four different
    orders of the same five settings already produced byte-identical pixels,
    so what looked like "the same config behaves differently depending on
    the order I set it" was the buffer width varying between bakes.
  • Restored the fs contract in both engine copies. PaperParams takes
    the sampling width and the scale, PaperPixel divides the coordinate by
    it, and BuildPaperFull takes it explicitly so a caller that forgets it
    cannot silently get the old behaviour. A bake is now also only accepted
    when the scale it was built at still matches the output's.
  • Test: TestTextureIsScaleInvariant renders one logical surface at 1.0,
    2.0, 3.0, 1.25, 1.5 and 1.6 and requires pixel-identical output, sampled
    at the logical points both grids hold exactly. Verified to fail against
    the pre-fix engine (56277 pixels moved at 2.0x).
  • After the fix the same logical surface is pixel-identical at every
    scale: 0 of 810000 pixels differ.

Asset sha256: 10f9093e9d4b742399b66a2d9395234963e32242b3cbfb3af634f942273512da

v2.7.23

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 24 Oct 12:47

Linux (Wayland) port.

  • App icon switched to the mn-brand mnPaper artwork. mnPaper.ico is
    regenerated from the 2048x2048 vector render, keeping the same seven
    sizes (16, 24, 32, 48, 64, 128, 256). The Linux tray icon is the same
    artwork downscaled to 24x24 and baked into tray.c as a pixel table, so
    it still ships no binary asset; it is byte-identical to the 24x24 entry
    of the .ico.
  • Texture settings now visibly change the screen. The paper's modulation
    was a folded deviation of a normalised average of three fbm fields
    (measured mean 0.158, so only ~4.7 of a nominal 30 alpha levels were
    delivered), a flat colourless veil carried 56% of the median alpha, and
    every colour was premultiplied down to a ~7% pixel change. The engine
    now normalises that deviation, lets texture rather than bias carry the
    veil, moves highlights below a white page, and computes the fibre and
    blotch gains in float. At the default intensity the median alpha goes
    from 7% to 15% and the peak from 18% to 29%; warmth now moves 35.6% of
    pixels by two or more levels instead of 0.9%.
  • Tests assert the composite, not the plumbing: each control must move at
    least 15% of pixels by two levels on a light, mid and dark background,
    measured through the real bakers.
  • The engine generator is duplicated on purpose (linux/paper_core.h and
    mnPaper.c); both copies carry the identical change.

The artwork is a source-derived candidate, not a pixel-identical copy of
the originally supplied brand board, and mnpaper's stronger green wash is
kept as requested.

Asset sha256: 9b087ba48c63b89a7fc7f8f65959f7474f8ffea4458c6b259e66089a7b047ffe

v2.7.22 - the paper reaches the screen edge

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 23 Oct 11:13

Linux (Wayland) port.

  • The paper now covers the bottom of the screen by default: panelgap default 96 -> 0. 96 logical pixels was reserved for a floating panel, but an auto-hiding panel reserves no space and is usually not on screen, so the default painted an uncovered band ~8.5% tall. Existing configs migrate once (cfgver=2): a pre-v2 file holding exactly the old default 96 becomes 0, and any other value is treated as a deliberate choice and kept.
  • The tray menu now carries Grain, Fibre and Blotch as ten-step submenus, so every texture parameter is reachable without editing the config file.
  • share is documented as a real gap rather than a switch that does nothing: KWin's capture exclusion is a PlasmaWindowInterface property and a layer surface is not a Plasma window.
  • Tests: the migration's four branches, each new submenu end to end over a private bus (including GetLayout drill-down), and that each texture setting produces a different image.

Asset sha256: 0b1aab2fe9f019ce8edaa9e14dc8cf069befe70e2034e1b9d65f86b531361798

2.7.21: keep autostart working across an upgrade

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 23 Oct 00:46

Installing a new build over the running daemon could silently switch autostart off.

Linux reports the running executable as /path/to/binary (deleted) once that file has been replaced. The port read that string straight from /proc/self/exe and wrote it into both Exec= and X-Mnpaper-Exe= of ~/.config/autostart/mnpaper.desktop. The entry then named a file that does not exist, so the next login would have started nothing - and because the ownership check compares that same path, autostart also flipped back to 0 by itself.

The path is now resolved once at startup, the suffix stripped, and the result required to exist. A path that is genuinely gone yields no path at all, and the port keeps its existing fail-soft: it leaves the entry untouched instead of writing a broken one. A plain rename no longer repoints the entry either, since the path is pinned to the one the process started from.

Verified: make clean under -Wall -Wextra, both suites green, and the behaviour exercised directly - a process whose binary is replaced reports the real install path, while one whose file is removed reports no path and the entry is left alone.

Windows: the update feed (version.txt) stays at 2.7.19; this release ships no new Windows exe.

2.7.20: Linux Wayland port - black-frame fix and true device-pixel render

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 22 Oct 23:17

The paper overlay now reaches all four screen edges cleanly, and it renders at the panel's real device pixels.

Black frame gone. The paper came back framed by a one pixel black border after every show/hide toggle, and a re-bake did not clear it. The cause was not the texture: KWin maps a layer surface's scope to a window type and defaults an unrecognized scope to a normal window, so the ShapeCorners effect stroked its inactive-window outline around the overlay. The surface now asks for the on-screen-display scope, because a persistent screen overlay is not a user window. Verified on KWin 6.6.6: the old scope framed every toggle, four consecutive toggles with the fix stay clean.

True device pixels. A 160% panel was given an integer scale-2 buffer (3600x2058 for a 2880x1800 screen), 1.25x more pixels than the panel has, which the compositor then resampled down. The port now uses wp_fractional_scale_v1 plus wp_viewport: the buffer is exactly the device pixels and the viewport maps it to the surface size. Sharper paper, and a full bake drops from ~1.7 s to ~1.0 s (shm 62 MB -> 36 MiB, steady RAM ~95 MB -> ~40 MB).

This release also ships the Linux port itself (merged via PR #27): the Wayland overlay, a system tray icon (StatusNotifierItem + DBusMenu, no toolkit - left-click toggles, scroll steps strength, menu carries strength/warmth/autostart/quit), panel-aware tbmode with a panelgap setting so a floating panel and its tray stay visible, and the CLI (--on/--off/--toggle, --set k=v, --status, --dump-tex). Wayland only, no X11; e-ink mode, the settings GUI, global hotkeys and self-update are not ported.

Windows: the update feed (version.txt) stays at 2.7.19 on purpose. This release contains no new Windows exe - the change is Linux-only - and a 2.7.20 feed would offer clients an exe that does not exist. The Linux binary here is a plain shared-library-dependent build (libwayland-client, libsystemd); cd linux && make && sudo make install is still the recommended path if your distro differs.

mnPaper 2.7.19

Choose a tag to compare

@mnsky-tyan mnsky-tyan released this 14 Oct 13:34

The taskbar buttons now do exactly what they say.

  • Cover genuinely covers the taskbar: the paper texture stays over a revealed taskbar, which keeps working underneath through the click-through strips.
  • Not cover shows the taskbar cleanly by lifting it above the paper. The old transparent hole is gone, so the white frame around the bar's rounded corners can no longer appear.
  • Both modes are pure window z-order now; the texture is never cut open. The hole machinery was deleted entirely.
  • Switching to Cover from the settings window no longer lets the paper flash over the dialog.
  • Restored the help note: if the taskbar ever seems stuck under the texture, pick Not cover.