<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://gt.sacha.house/</id>
  <title>gui_toolkit: releases</title>
  <subtitle>A fast, native, immediate-mode GUI toolkit in Odin</subtitle>
  <link rel="self" type="application/atom+xml" href="https://gt.sacha.house/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://gt.sacha.house/"/>
  <icon>https://gt.sacha.house/img/logo.png</icon>
  <author><name>Sacha Froment</name><uri>https://froment.software</uri></author>
  <updated>2026-11-09T00:00:00Z</updated>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.119.0</id>
    <title>gui_toolkit 0.119.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.119.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Web addresses in plain text become links&lt;/strong&gt;: &lt;code&gt;ui.rich_links(text, style, &amp;amp;runs)&lt;/code&gt; turns a string into rich runs whose &lt;code&gt;http://&lt;/code&gt; and &lt;code&gt;https://&lt;/code&gt; addresses are links in the theme's link colour, underlined, without the sentence's closing marks around them (&lt;code&gt;ui.web_address_len&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.118.0</id>
    <title>gui_toolkit 0.118.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.118.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Automatic partial redraw&lt;/strong&gt;: &lt;code&gt;ui.set_partial_redraw&lt;/code&gt; (or &lt;code&gt;Host.partial_redraw&lt;/code&gt; in &lt;code&gt;host&lt;/code&gt;) redraws only the boxes whose drawing changed since the last frame, with no rectangle marked by hand; an idle frame redraws nothing, a caret blink or a hover a small rectangle, custom draws included. Underneath, &lt;code&gt;draw.damage_auto&lt;/code&gt; with &lt;code&gt;draw.damage_span_begin&lt;/code&gt; / &lt;code&gt;damage_span_end&lt;/code&gt; compares a digest of what each span draws (&lt;code&gt;draw.Damage_Memory&lt;/code&gt;, &lt;code&gt;damage_volatile&lt;/code&gt;, &lt;code&gt;damage_whole&lt;/code&gt;, &lt;code&gt;ui.damage_stats&lt;/code&gt;); &lt;code&gt;render.texture_version&lt;/code&gt; and &lt;code&gt;render.damage_building&lt;/code&gt; are new, and a frame with a region is whole when the clear colour, blend space, text or corner settings change. &lt;code&gt;Toolkit.metrics&lt;/code&gt; (DevTools) reports it: the partial frames, why the others were whole, and the share of pixels drawn.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.117.0</id>
    <title>gui_toolkit 0.117.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.117.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The machined finish&lt;/strong&gt; (&lt;code&gt;Finish.Machined&lt;/code&gt;): bevelled buttons that sink when pressed, fields and segmented tracks as sunken wells with a ring of the accent when focused, separators as carved grooves (box flags &lt;code&gt;.Sunken&lt;/code&gt;, &lt;code&gt;.Groove&lt;/code&gt;); flat on a light palette. Its primitives for a program's own surfaces: &lt;code&gt;machined_bevel&lt;/code&gt;, &lt;code&gt;machined_well&lt;/code&gt;, &lt;code&gt;machined_groove&lt;/code&gt;, &lt;code&gt;machined_plate&lt;/code&gt;, &lt;code&gt;machined_lamp&lt;/code&gt;, &lt;code&gt;machined_pip&lt;/code&gt; (each draws its flat form outside the finish); &lt;code&gt;Theme.glow&lt;/code&gt; sets its halos. It draws up to &lt;code&gt;MACHINED_OVERFLOW_PX&lt;/code&gt; outside a box: a region redrawn alone must hold that margin. fidget: a Machined finish switch (Ctrl+M).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Themes replace the named palettes&lt;/strong&gt;: &lt;code&gt;ui.THEMES&lt;/code&gt; (25 themes, most with a dark and a light version: opencode native's and the toolkit's), &lt;code&gt;Theme_Def&lt;/code&gt;, &lt;code&gt;Theme_Colors&lt;/code&gt;, &lt;code&gt;theme_palette&lt;/code&gt;, &lt;code&gt;theme_palettes&lt;/code&gt;, &lt;code&gt;palette_of&lt;/code&gt;, &lt;code&gt;theme_find&lt;/code&gt;; &lt;code&gt;theme_show&lt;/code&gt; applies a theme, a mode (system, dark, light) and a finish, and follows the system; &lt;code&gt;theme_recolor&lt;/code&gt; moves a program's own colours to the theme shown; &lt;code&gt;themes_read&lt;/code&gt; reads a user's themes. &lt;code&gt;NAMED_PALETTES&lt;/code&gt;, &lt;code&gt;palette_named&lt;/code&gt; and the &lt;code&gt;PALETTE_*&lt;/code&gt; constants are gone: &lt;code&gt;palette_of(&amp;quot;Midnight&amp;quot;)&lt;/code&gt;, &lt;code&gt;palette_of(&amp;quot;Midnight&amp;quot;, light = true)&lt;/code&gt; for Daylight. &lt;code&gt;Palette.well&lt;/code&gt;: the colour of sunken surfaces. See docs/themes.md.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.116.0</id>
    <title>gui_toolkit 0.116.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.116.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;desktop.handlers_for_file&lt;/code&gt;, &lt;code&gt;desktop.open_with&lt;/code&gt;&lt;/strong&gt;: &amp;quot;Open with&amp;quot;: the applications the system knows for a type of file, the default first, and a file opened with one of them (Linux: shared-mime-info, desktop entries, mimeapps.list; Windows: the shell's handlers). Also &lt;code&gt;desktop.exec_arguments&lt;/code&gt;, &lt;code&gt;desktop.exec_expand&lt;/code&gt; and &lt;code&gt;platform.launch_detached&lt;/code&gt; (Linux).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.114.2</id>
    <title>gui_toolkit 0.114.2</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.114.2"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A window never shown is in no task bar (Wayland)&lt;/strong&gt;: &lt;code&gt;open_window&lt;/code&gt; makes a surface with no role, and the toplevel is made at the first &lt;code&gt;show_window&lt;/code&gt;. A program that starts hidden in the notification area was listed in the task bars that show every toplevel (ShojiWM). &lt;code&gt;set_maximized&lt;/code&gt; and &lt;code&gt;set_fullscreen&lt;/code&gt; asked before the first show are asked by the new toplevel.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.115.0</id>
    <title>gui_toolkit 0.115.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.115.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The wheel goes to the box that scrolls its way&lt;/strong&gt;: a box that scrolls only sideways (&lt;code&gt;.View_Scroll_X&lt;/code&gt;, a wide table) no longer takes an up-and-down wheel from the page around it, and Shift+wheel scrolls such a box sideways, as in a browser. A box that scrolls itself still gets the wheel as it is (a number field steps further with Shift).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.114.1</id>
    <title>gui_toolkit 0.114.1</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.114.1"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The tests of the toolbox build on Windows again&lt;/strong&gt;: the test of &lt;code&gt;start_group&lt;/code&gt; is Linux's only (&lt;code&gt;#+build linux&lt;/code&gt;: a file name that ends in &lt;code&gt;_test&lt;/code&gt; gives Odin no system). The test of a host at rest counts its wakes: an event of the desktop may end one wait, a wait that does not sleep wakes hundreds of times.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.wait_event&lt;/code&gt; (Wayland)&lt;/strong&gt;: less than a millisecond left is a millisecond of sleep. It returned at once, and a loop that waits until a deadline spun through its last millisecond (about 150 wakes).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.114.0</id>
    <title>gui_toolkit 0.114.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.114.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;ui.field_frame&lt;/code&gt;, the box flag &lt;code&gt;.Focus_Within&lt;/code&gt;, the theme tag &lt;code&gt;bare&lt;/code&gt;&lt;/strong&gt;: one surface for a field and what goes with it (an icon, a count), with one focus ring around all of it while a box inside has the focus. A field built under &lt;code&gt;bare&lt;/code&gt; draws no background, border or focus ring of its own: no box inside a box, no square ring inside round corners.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.113.0</id>
    <title>gui_toolkit 0.113.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.113.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;toolbox.start_group&lt;/code&gt;, &lt;code&gt;toolbox.stop_group&lt;/code&gt;&lt;/strong&gt; (Linux): a command in a process group of its own, stopped with all it started (a wrapper such as NixOS's sway leaves its real program running when only the wrapper is stopped). &lt;code&gt;tk desktop_tests&lt;/code&gt; uses them.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.112.0</id>
    <title>gui_toolkit 0.112.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.112.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.raise_window&lt;/code&gt; (Wayland)&lt;/strong&gt;: asks the focus through &lt;code&gt;xdg_activation_v1&lt;/code&gt;, with the seat's last input serial. It did nothing before. A program shown by a shortcut of the compositor now gets the keyboard on compositors that do not focus a new window by themselves.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.111.3</id>
    <title>gui_toolkit 0.111.3</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.111.3"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Tray (Linux)&lt;/strong&gt;: &lt;code&gt;GetAll&lt;/code&gt; of the StatusNotifierItem includes &lt;code&gt;IconPixmap&lt;/code&gt;. Panels that read the properties in one call (Quickshell, Waybar) showed the &amp;quot;missing icon&amp;quot; pattern.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.111.2</id>
    <title>gui_toolkit 0.111.2</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.111.2"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Wayland: a wait sleeps through the renderer's own traffic&lt;/strong&gt;: the presentation feedback and the FIFO events of the frame just shown, and the ids of the renderer's callbacks, made the connection readable at each refresh, and every wait ended there: a window at rest drew a frame at each refresh. A wait now ends on what is the window's (its input, a repaint asked for), a change of the clipboard, a wake, a bus or the time. &lt;code&gt;tests/linux_desktop&lt;/code&gt; checks that a wait at rest sleeps its time.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.111.1</id>
    <title>gui_toolkit 0.111.1</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.111.1"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Linux: the loop sleeps at rest again&lt;/strong&gt;: the system's repaint request (a configure, an expose) stayed set, so every &lt;code&gt;hosts_wait&lt;/code&gt; ended at once and a window drew frames for ever (60 a second; a core for a hidden one). &lt;code&gt;host_frame&lt;/code&gt; now takes the request (its frame answers it), and a hidden window's request ends no wait. &lt;code&gt;tests/linux_desktop&lt;/code&gt; checks that no frame is due at rest.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.111.0</id>
    <title>gui_toolkit 0.111.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.111.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;desktop&lt;/code&gt;: the &lt;code&gt;Autostart&lt;/code&gt; part&lt;/strong&gt;: the program starts with the user's session (&lt;code&gt;Options.autostart&lt;/code&gt;, with &lt;code&gt;autostart_arguments&lt;/code&gt;: &lt;code&gt;--hidden&lt;/code&gt; for a program of the notification area). Linux: an XDG autostart entry (&lt;code&gt;$XDG_CONFIG_HOME/autostart/&amp;lt;slug&amp;gt;.desktop&lt;/code&gt;, &lt;code&gt;autostart_dir&lt;/code&gt;, &lt;code&gt;&amp;lt;prefix&amp;gt;AUTOSTART_DIR&lt;/code&gt;); Windows: the value of the key under &lt;code&gt;HKCU\...\CurrentVersion\Run&lt;/code&gt;. Status, repair when the arguments change, removal of only what is the program's.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.110.0</id>
    <title>gui_toolkit 0.110.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.110.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;host.host_hide&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;host.host_show&lt;/code&gt;&lt;/strong&gt;: a window with its renderer off the screen and back, the renderer's surface released first (&lt;strong&gt;&lt;code&gt;render.surface_drop&lt;/code&gt;&lt;/strong&gt;) and made again at the first frame after the show (&lt;code&gt;render.surface_remake(r, handles)&lt;/code&gt;, which now takes the window's native handles). &lt;code&gt;tk desktop_tests&lt;/code&gt; builds its tests with the native text backend and tests a host's hide and show with its renderer.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Wayland&lt;/strong&gt;: a window shown again after &lt;code&gt;hide_window&lt;/code&gt; no longer ends the connection (&lt;code&gt;must ack the initial configure before attaching buffer&lt;/code&gt;): the hide destroys the surface with its role, since the last frames' content updates could wait behind a FIFO barrier of &lt;code&gt;wp_fifo_v1&lt;/code&gt; that an unmapped surface never clears, and the new role's first commit with them.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.109.0</id>
    <title>gui_toolkit 0.109.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.109.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.hide_window&lt;/code&gt;&lt;/strong&gt;: a shown window off the screen and back with &lt;code&gt;show_window&lt;/code&gt; in a few milliseconds, its interface kept (a program in the notification area): Wayland (the toplevel role made again, its first configure waited for), X11 (withdrawn), Windows (&lt;code&gt;SW_HIDE&lt;/code&gt;). &lt;code&gt;Window.shown_again&lt;/code&gt; counts the shows after a hide; &lt;code&gt;host_frame&lt;/code&gt; then makes a new swap chain (&lt;strong&gt;&lt;code&gt;render.surface_remake&lt;/code&gt;&lt;/strong&gt;), which Vulkan's FIFO on Wayland would otherwise wait on for good.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.108.0</id>
    <title>gui_toolkit 0.108.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.108.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.needs_frame_outline&lt;/code&gt;&lt;/strong&gt;: a window with an integrated title bar and no frame of the system's (Linux: no server-side decorations, not tiled, no X11 frame extents; neither maximized nor full screen) gets a 1-pixel outline in the theme's border colour, drawn by &lt;code&gt;ui&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;An integrated title bar on Linux works as a frame&lt;/strong&gt;: a press on the caption moves the window (Wayland &lt;code&gt;xdg_toplevel.move&lt;/code&gt;, X11 &lt;code&gt;_NET_WM_MOVERESIZE&lt;/code&gt;), the bands along its four sides resize it (with the resize cursor over them), a double click on the caption maximizes or restores it, and a right click there opens the compositor's window menu. Nothing of that happened: the window could not be moved. The window menu now gets the press's serial and the surface's coordinates.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.107.0</id>
    <title>gui_toolkit 0.107.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.107.0"/>
    <updated>2026-11-09T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;png&lt;/code&gt; package&lt;/strong&gt;: the one PNG codec of the toolkit. &lt;code&gt;png.encode(rgba, width, height, .Small | .Fast)&lt;/code&gt; writes straight RGBA8 as a PNG file (&lt;code&gt;.Small&lt;/code&gt;: the filter of least sum per row and &lt;code&gt;flate.deflate&lt;/code&gt;; &lt;code&gt;.Fast&lt;/code&gt;: Sub and &lt;code&gt;flate.deflate_runs&lt;/code&gt;), &lt;code&gt;png.decode&lt;/code&gt; reads any PNG (every colour type, bit depth, palette, &lt;code&gt;tRNS&lt;/code&gt;; 16 bits rounded to 8) as straight RGBA8, &lt;code&gt;png.rgba8_of&lt;/code&gt; converts any &lt;code&gt;core:image&lt;/code&gt; picture. &lt;code&gt;platform.clipboard_image_decode(mime, bytes)&lt;/code&gt; reads a PNG, JPEG or BMP file, &lt;code&gt;platform.clipboard_pick_mime(offered, wanted)&lt;/code&gt; picks the type to read of another program's offer.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;One PNG codec everywhere&lt;/strong&gt;: &lt;code&gt;paint.png_encode&lt;/code&gt; / &lt;code&gt;png_decode&lt;/code&gt;, &lt;code&gt;cdp.png_encode&lt;/code&gt; / &lt;code&gt;png_decode&lt;/code&gt;, the screenshots of &lt;code&gt;devtools&lt;/code&gt;, &lt;code&gt;testkit/session&lt;/code&gt;'s pictures, the CBDT emoji of &lt;code&gt;font&lt;/code&gt; and the Windows clipboard use the &lt;code&gt;png&lt;/code&gt; package. &lt;code&gt;devtools.png_encode&lt;/code&gt; is removed: &lt;code&gt;png.encode(rgba, w, h, .Fast)&lt;/code&gt; writes the same file. The Windows clipboard no longer links &lt;code&gt;vendor:stb/image&lt;/code&gt;, and &lt;code&gt;platform.png_encode&lt;/code&gt; writes at &lt;code&gt;.Fast&lt;/code&gt; (a 1400 x 925 picture in 2 ms rather than 90).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Removed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.png_encode_hook&lt;/code&gt; and &lt;code&gt;platform.png_decode_hook&lt;/code&gt;&lt;/strong&gt;: the toolkit has its own PNG codec on every system (&lt;code&gt;platform.png_encode&lt;/code&gt; / &lt;code&gt;png_decode&lt;/code&gt;), so an application has nothing to set.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Linux: pasting another program's image or files&lt;/strong&gt;: &lt;code&gt;platform.clipboard_get_image&lt;/code&gt; read nothing unless the application had set a PNG hook, so an image copied by a screenshot tool, a browser's Copy image or &lt;code&gt;wl-copy --type image/png&lt;/code&gt; did not paste. It is read now on Wayland and X11 through the toolkit's PNG codec, and an offer of &lt;code&gt;image/jpeg&lt;/code&gt; or &lt;code&gt;image/bmp&lt;/code&gt; alone is read too; &lt;code&gt;clipboard_formats&lt;/code&gt; says &lt;code&gt;.Image&lt;/code&gt; for them. &lt;code&gt;clipboard_get_files&lt;/code&gt; also reads GNOME Files' &lt;code&gt;x-special/gnome-copied-files&lt;/code&gt; when there is no &lt;code&gt;text/uri-list&lt;/code&gt;. The tray's PNG icon is decoded the same way.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tk desktop_tests&lt;/code&gt; leaves no compositor running&lt;/strong&gt;: a server it starts (and the test program) runs in a process group of its own, and is stopped with its whole group, also on a failure, a time limit or a signal to &lt;code&gt;tk&lt;/code&gt;. A wrapper such as NixOS's sway (&lt;code&gt;dbus-run-session&lt;/code&gt;, which runs sway and a session bus beside it) took the signal alone and left sway, swaybg and the bus running, holding the command's output open. Their output goes to files now, the test program's printed when it ends. &lt;code&gt;a_lost_server_closes_its_windows&lt;/code&gt; stops its second server with its children, so the window hears the compositor go.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.106.0</id>
    <title>gui_toolkit 0.106.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.106.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Content that fades out at its edges&lt;/strong&gt;: &lt;code&gt;draw.mask_edge_fade&lt;/code&gt; draws the mask of a &lt;code&gt;push_mask&lt;/code&gt; that fades the content to transparent over given widths at the left, top, right and bottom edges; &lt;code&gt;ui.next({edge_fade = ...})&lt;/code&gt; gives it to a box that clips, so that a list that scrolls fades out where it goes on instead of ending in a straight cut.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.105.0</id>
    <title>gui_toolkit 0.105.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.105.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.can_hide_windows&lt;/code&gt;&lt;/strong&gt;: whether a window can exist unseen, made and never shown. Yes on Windows; no on Wayland and X11, where a toplevel is shown as soon as it has a buffer: a program that needs an unseen window opens an offscreen one there.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Variable faces off Windows&lt;/strong&gt;: &lt;code&gt;font.axes&lt;/code&gt; reads a face's axes from its &lt;code&gt;fvar&lt;/code&gt; table, and &lt;code&gt;font.with_variations&lt;/code&gt; makes an instance the native backend opens at its location (a simulation of it keeps it). Both did nothing there, so a variable font was drawn at its default instance: a web font in &lt;code&gt;font-weight: 400&lt;/code&gt; whose default is 300 came out light.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.104.1</id>
    <title>gui_toolkit 0.104.1</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.104.1"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Docs tables on a phone, on every site&lt;/strong&gt;: the rule that keeps a table's columns wide enough is in the documentation's own style sheet (&lt;code&gt;docs_css&lt;/code&gt;), not only in &lt;code&gt;DOCS_CODE_CSS&lt;/code&gt;; Wren's docs, whose site has its own table styles, squeezed them still.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.104.0</id>
    <title>gui_toolkit 0.104.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.104.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;site.Meta.changelog_page&lt;/code&gt; and &lt;code&gt;version_anchor&lt;/code&gt;&lt;/strong&gt;: where a site tells a version (the feed's links, llms.txt), for a site whose changelog is another page or whose anchors are written otherwise (Wren's &lt;code&gt;changelog/#v0-7-0&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Docs tables on a phone&lt;/strong&gt;: each column keeps room for its text (26 characters, at most 70 % of the screen) and the table scrolls sideways in its frame. The columns were squeezed to one word a line.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.103.0</id>
    <title>gui_toolkit 0.103.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.103.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;site.build_docs&lt;/code&gt;&lt;/strong&gt;: a documentation site from a project's Markdown: a page per document in the site's header and footer, a menu from &lt;code&gt;docs/_nav.txt&lt;/code&gt; (folded under a &amp;quot;Documentation&amp;quot; toggle on a phone, no script), a search with no server, collapsible groups, a breadcrumb, the previous and next pages, &amp;quot;On this page&amp;quot;, the old addresses sent on. &lt;code&gt;site.check_links&lt;/code&gt; checks a built site's links without a browser; &lt;code&gt;site.check&lt;/code&gt; also checks the documentation pages at 390 px. Wren's documentation generator moved here; the toolkit's Docs section uses it.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;site.render_markdown&lt;/code&gt;&lt;/strong&gt; replaces &lt;code&gt;markdown_html&lt;/code&gt;: one converter (Wren's, which reads more: blockquotes, HTML blocks, aligned tables, autolinks, titles, heading anchors, unique ids), with coloured code blocks (&lt;code&gt;site.write_code_block&lt;/code&gt;, &lt;code&gt;site.Code_Language&lt;/code&gt;), the headings and the plain text of a document. A &lt;code&gt;|&lt;/code&gt; in a code span no longer splits a table cell, two trailing spaces are a hard break, and a title keeps a &lt;code&gt;_&lt;/code&gt; inside a word.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.102.0</id>
    <title>gui_toolkit 0.102.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.102.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;toolbox&lt;/code&gt; package&lt;/strong&gt; (&lt;code&gt;tk_toolbox&lt;/code&gt;, [docs/toolbox.md](docs/toolbox.md)): what the tools of a project share. &lt;code&gt;run&lt;/code&gt; (the output shown or appended to a log; a working directory, an environment, a time limit, &lt;code&gt;echo&lt;/code&gt;), &lt;code&gt;capture&lt;/code&gt; (the standard output and the exit code, the standard error shown on failure), &lt;code&gt;env_with&lt;/code&gt;, &lt;code&gt;exit_code&lt;/code&gt; and &lt;code&gt;succeeded&lt;/code&gt; (a Windows exit code read as the program's signed 32-bit code), &lt;code&gt;sha256_hex&lt;/code&gt; and &lt;code&gt;sha256_file&lt;/code&gt;, &lt;code&gt;download_pinned&lt;/code&gt; (curl with retries, GitHub's API when a release download fails, a file whose SHA-256 is wrong removed), &lt;code&gt;download_through_api&lt;/code&gt;, &lt;code&gt;release_asset_id&lt;/code&gt; and &lt;code&gt;system_program&lt;/code&gt;. &lt;code&gt;tools/tk&lt;/code&gt; uses it; its own copies of these procedures are gone.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;paint&lt;/code&gt; package&lt;/strong&gt; (&lt;code&gt;tk_paint&lt;/code&gt;, [docs/paint.md](docs/paint.md)): a vector rasterizer on the CPU for pictures made ahead of time, pure Odin and deterministic: an RGBA canvas with a transform, paths (lines, quadratic and cubic Béziers, arcs, rounded rectangles, ellipses, polygons), &lt;code&gt;fill&lt;/code&gt; (non-zero, even-odd) and &lt;code&gt;stroke&lt;/code&gt; / &lt;code&gt;widen&lt;/code&gt; (width, miter, bevel and round joins, flat, square and round caps) with antialiasing, solid colours and linear / radial gradients that pad or repeat, &lt;code&gt;set_clip&lt;/code&gt;, &lt;code&gt;draw_canvas&lt;/code&gt; / &lt;code&gt;resize&lt;/code&gt; (cubic for downscaling, nearest for magnifying), &lt;code&gt;png_encode&lt;/code&gt; / &lt;code&gt;png_decode&lt;/code&gt;, &lt;code&gt;ico_encode&lt;/code&gt; with PNG or DIB entries (&lt;code&gt;dib_encode&lt;/code&gt;). &lt;code&gt;tk make_logo&lt;/code&gt; and &lt;code&gt;tk make_icon&lt;/code&gt; draw with it on Windows and Linux; GDI+ and tools/tk/gdiplus_windows.odin are gone.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;desktop&lt;/code&gt; package&lt;/strong&gt; (&lt;code&gt;tk_desktop&lt;/code&gt;, [docs/desktop.md](docs/desktop.md)): the integration of a program with the user's desktop (Start menu and desktop shortcuts, the PATH with a console launcher, the freedesktop.org entry and icons, a link in &lt;code&gt;~/.local/bin&lt;/code&gt;, and for a browser its registration and URL schemes), its watcher, its command line, and the installed copy (manifest, Settings &amp;gt; Apps record, uninstall, NixOS runtime). Every name and mark is a field of the program's &lt;code&gt;Identity&lt;/code&gt;; every place is an injectable root. Moved from Wren and made generic. &lt;strong&gt;&lt;code&gt;process&lt;/code&gt; package&lt;/strong&gt; (&lt;code&gt;tk_process&lt;/code&gt;, [docs/process.md](docs/process.md)): &lt;code&gt;command_line_args&lt;/code&gt; (UTF-8 on Windows), &lt;code&gt;console_write&lt;/code&gt; / &lt;code&gt;console_error&lt;/code&gt; (a Windows program with a window writes to its parent's console), &lt;code&gt;executable_path&lt;/code&gt;, &lt;code&gt;parent_dir&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tk site_docs&lt;/code&gt;&lt;/strong&gt;: the documents of &lt;code&gt;docs/&lt;/code&gt; as a &amp;quot;Docs&amp;quot; section of the website, with its own Markdown to HTML converter (&lt;code&gt;tools/tk/site_docs.odin&lt;/code&gt;). The Pages workflow runs it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;cdp&lt;/code&gt; and &lt;code&gt;site&lt;/code&gt; packages&lt;/strong&gt; (src/cdp, src/site): a client of the DevTools protocol for tools (a window or a browser, input, waits, pictures, screencasts, scripts, timelines compared with another run) and the steps of a project website (CHANGELOG.md to a changelog page, news and classic pages, what a page says when shared, Markdown to HTML, the pages checked in a real browser), generic: opencode native uses both. docs/cdp.md, docs/site.md.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The Node tools are tk commands&lt;/strong&gt;: &lt;code&gt;tk cdp&lt;/code&gt; (was tools/cdp.mjs), &lt;code&gt;tk screenshots&lt;/code&gt;, &lt;code&gt;tk theme_shots&lt;/code&gt;, &lt;code&gt;tk timeline_test&lt;/code&gt; (was tests/e2e/timeline.mjs), &lt;code&gt;tk doc_check&lt;/code&gt; (same flags: &lt;code&gt;--root&lt;/code&gt;, &lt;code&gt;--extra&lt;/code&gt;), &lt;code&gt;tk site_build&lt;/code&gt;, &lt;code&gt;site_changelog&lt;/code&gt;, &lt;code&gt;site_meta&lt;/code&gt;, &lt;code&gt;site_card&lt;/code&gt;, &lt;code&gt;site_check&lt;/code&gt;. The CI and the Pages workflow run only Odin; Node is no longer needed.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tk site_check&lt;/code&gt;&lt;/strong&gt; checks the site as it is published (the Docs pages and the 404 too) and waits for what each step leads to instead of fixed delays (opencode native's check, now shared): the old check hung when the viewer did not open. &lt;strong&gt;&lt;code&gt;tk theme_shots&lt;/code&gt;&lt;/strong&gt; reads the palettes from src/ui/theme_default.odin (tools/theme_shots.mjs still read ui/, gone since the packages moved to src/).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.101.0</id>
    <title>gui_toolkit 0.101.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.101.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The library's packages are in &lt;code&gt;src/&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;src/ui&lt;/code&gt;, &lt;code&gt;src/platform&lt;/code&gt;...): a program's collection points there (&lt;code&gt;-collection:gt=&amp;lt;toolkit&amp;gt;/src&lt;/code&gt;), and the examples, tests, tools and docs apart from it. &lt;strong&gt;Every step is a command of &lt;code&gt;tools/tk&lt;/code&gt;&lt;/strong&gt;, on Windows and Linux: &lt;code&gt;build&lt;/code&gt; (an example; &lt;code&gt;build.bat&lt;/code&gt; and &lt;code&gt;./build.sh&lt;/code&gt; are its shortcuts), &lt;code&gt;ci&lt;/code&gt; (what tools/linux_ci.sh did), &lt;code&gt;desktop_tests&lt;/code&gt; (what tools/linux_desktop.sh did, its fake xdg-open an Odin program), &lt;code&gt;build_text&lt;/code&gt; on Linux too. The scripts are gone. &lt;code&gt;flake.nix&lt;/code&gt;: the development shell on Linux (the pinned Odin with wgpu-native, Rust, the virtual desktops' servers).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.100.0</id>
    <title>gui_toolkit 0.100.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.100.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;config.Search&lt;/code&gt;&lt;/strong&gt;: the search of a settings UI made of pages (&lt;code&gt;search_begin&lt;/code&gt;, &lt;code&gt;search_page&lt;/code&gt;, &lt;code&gt;search_shows&lt;/code&gt;, &lt;code&gt;searching&lt;/code&gt;): which preferences a query shows (every word in the name, the title or the description; a page whose title matches shows all of it) and each page's heading before its first match. The UI keeps its own layout.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.99.0</id>
    <title>gui_toolkit 0.99.0</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.99.0"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Added&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;update&lt;/code&gt;&lt;/strong&gt; (package &lt;code&gt;tk_update&lt;/code&gt;): signed updates of a program, from Wren and opencode native. A &lt;code&gt;Product&lt;/code&gt; (name, signing context, public key) checks what a release publishes: one manifest per platform and channel (&lt;code&gt;manifest_name&lt;/code&gt;, channels optional), signed with Ed25519, for a strictly newer version and the release's own file name (&lt;code&gt;check_release&lt;/code&gt;). &lt;code&gt;place&lt;/code&gt; puts the downloaded program in place of the running one after its size and SHA-256 (Windows: renamed aside, put back on failure; Linux: renamed over), &lt;code&gt;remove_leftovers&lt;/code&gt; cleans up at the next start, and &lt;code&gt;manifest_of&lt;/code&gt;, &lt;code&gt;manifest_bytes&lt;/code&gt; and &lt;code&gt;sign&lt;/code&gt; are the release tool's side. [docs/update.md](docs/update.md).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.set_app_id&lt;/code&gt;&lt;/strong&gt;: the program's id on the Linux desktop, the name of its .desktop file: Wayland's app_id and X11's WM_CLASS (which windows on X11 had none of). By default the executable's file name, where every window said &amp;quot;gui_toolkit&amp;quot;, so a task bar could not find the program's icon and name.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Changed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tk release&lt;/code&gt;&lt;/strong&gt; publishes a version on Windows or Linux (tools/tk), in place of tools/release.ps1, which is gone: the CHANGELOG section and the version, the commit, the annotated tag, the push and the GitHub release. The About picture is taken again on Windows only.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;System fonts on Linux take fontconfig's aliases and generic families&lt;/strong&gt;: &lt;code&gt;font.load_system&lt;/code&gt; and &lt;code&gt;font.has_system_family&lt;/code&gt; give &amp;quot;Courier New&amp;quot; the installed font the configuration binds to it (Liberation Mono, by 30-metric-aliases.conf), and &lt;code&gt;monospace&lt;/code&gt;, &lt;code&gt;serif&lt;/code&gt;, &lt;code&gt;sans-serif&lt;/code&gt; and the other generic families the font fontconfig picks. They refused any answer whose family was not the one asked for, so such a name was missing and text fell to the next font.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.98.3</id>
    <title>gui_toolkit 0.98.3</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.98.3"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tools/tk&lt;/code&gt;'s pinned downloads&lt;/strong&gt; (wgpu-native, DXC, the emoji font) try again, and a file of a GitHub release whose download fails comes through GitHub's API (with &lt;code&gt;GH_TOKEN&lt;/code&gt; or &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; when set), checked against its SHA-256 as before: GitHub's release downloads answered 504 for over an hour while its API served the same files, and a CI fetching wgpu-native failed. The tool's own tests run in &lt;code&gt;run_tests&lt;/code&gt; (&lt;code&gt;tk_tool&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.98.2</id>
    <title>gui_toolkit 0.98.2</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.98.2"/>
    <updated>2026-11-08T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;platform.custom_cursor_info&lt;/code&gt; on Linux&lt;/strong&gt; says the size and hotspot of the cursor as it is shown, the image at the scale it is shown at (&lt;code&gt;scale&lt;/code&gt;, or the window's: &lt;code&gt;custom_cursor_scale&lt;/code&gt;), as on Windows; it said those of the source image whatever the scale. The scaling is shared with the pixels made for X and Wayland (&lt;code&gt;custom_cursor_geometry&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <id>https://gt.sacha.house/changelog.html#v0.98.1</id>
    <title>gui_toolkit 0.98.1</title>
    <link rel="alternate" type="text/html" href="https://gt.sacha.house/changelog.html#v0.98.1"/>
    <updated>2026-11-07T00:00:00Z</updated>
    <content type="html">&lt;h3&gt;Fixed&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;A lazy column lets its view move by less than a pixel&lt;/strong&gt;: the item the view is on was kept in its place by its rect, rounded to whole pixels; that error, read as a move of the content, put a view moving by less than a pixel a frame (a slow glide, the wheel's click just past its dead zone) back where it was every few frames, and it did not move. Its place is now read where the layout put it, not rounded.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
</feed>
