<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pardes.git/src/layout.zig, branch release-0.24</title>
<subtitle>Pardes</subtitle>
<id>https://git.0x4200.cafe/pardes.git/atom?h=release-0.24</id>
<link rel='self' href='https://git.0x4200.cafe/pardes.git/atom?h=release-0.24'/>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/'/>
<updated>2026-10-01T03:12:17Z</updated>
<entry>
<title>Joincol is refused, as Newcol is, when the joined column cannot give each pane its tag and 2 rows</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-30T22:16:56Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=3189900c13b98298776d0da8dcbcb4e0d88858cf'/>
<id>urn:sha1:3189900c13b98298776d0da8dcbcb4e0d88858cf</id>
<content type='text'>
Joincol moved every pane of the keyboard's column into the next one
whether they fit or not. Two columns of two panes in a 12-row window
became one column of four, wanting 12 rows where 10 were free, a layout
that `size` then refused as it stood. Joincol now tries the join in place
first (layout.joinFits: the panes and width moved, minimaFit asked,
everything put back, nothing dropped or logged). A join that does not
fit is refused, "Joincol: no space: the joined column cannot give each
pane its tag and 2 rows".

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A Newcol refused because the panes' tags would not fit logs its err alone and spends no column serial</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-30T16:30:40Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=23d7f949b8595ed42e938a28b0d433d90853b341'/>
<id>urn:sha1:23d7f949b8595ed42e938a28b0d433d90853b341</id>
<content type='text'>
Newcol tries its column before keeping it: the new column is inserted,
the panes' rows are shared out again, and where a pane would be left
under its tag and two rows the column is taken back. The trial showed.
insertColumn logged `newcol N` and the take-back `delcol N`, so a
follower saw a column come and go around the err. Laying the column out
also gave it a serial, so the next column made skipped one. The trial is
now unannounced, since insert and drop have unlogged forms. A refusal puts
the serial counter back where it was, after first giving every existing
column its serial so the trial's is the only one spent. Only a column
that stays is logged, and it gets the next serial.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Terminal.zig is terminal.zig: a file of functions and no fields takes a namespace's lowercase name</title>
<updated>2026-10-01T03:12:17Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T23:56:14Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=04b047fb366ea2c595708fb62467f690fce4b9ec'/>
<id>urn:sha1:04b047fb366ea2c595708fb62467f690fce4b9ec</id>
<content type='text'>
The last of the deferred renames, now that the tty and theme agents have landed: panes.terminal at its importers, the alias lines in Text.zig and File.zig and panes.zig's own uses following. dump.zig's Terminal struct, a dump record, is not this. The served sources list and docs/design.typ name the new file. test/perf.zig's references change, so the three perf baselines take its new harness id with their numbers as recorded. No behaviour changes.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Delcol on the last column leaves the window, empty but for its workspace tag, as acme's does</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T17:20:12Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=25c847e28ae77f5c648d423d64011736f55eda4a'/>
<id>urn:sha1:25c847e28ae77f5c648d423d64011736f55eda4a</id>
<content type='text'>
The last column's Delcol ended the session. The window now stays, with only the workspace tag; Newcol, and New (which makes the column it goes in), start it again. A word run with no pane at all runs with a stand-in that is no pane, the root ctl takes session words, and pane/new makes its scratch in the session's directory.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A column takes panes until their minimums fill it, not until none can be halved</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T13:11:14Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=f207f1d4d56d1012766e6206e713f2b3da70579d'/>
<id>urn:sha1:f207f1d4d56d1012766e6206e713f2b3da70579d</id>
<content type='text'>
Placement halved the tallest pane or refused, so 11 panes filled 48 rows
that hold 16 at their tag and two rows each: the refusal did not match
the documented arithmetic. When no pane can be halved but the minimums
with the new pane's fit, the column's rows are shared out again; and a
refused pane's removal leaves no pane under its minimum.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>`size` is refused only when the panes' own minima do not fit, so it is monotonic</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T10:15:20Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=03773fac517a2a26dc2f2813db9906d3bf7e91db'/>
<id>urn:sha1:03773fac517a2a26dc2f2813db9906d3bf7e91db</id>
<content type='text'>
The check read how the weights shared the rows after the resize, not
whether the rows could hold every pane's tag and two rows: a pane the
proportional squeeze took short made `size` refuse, growing included,
and refuse sizes it took a moment before. It now asks layout.minRows,
the minimum placement asks, per column; a size they fit is taken, and a
pane the resize took under its minimum gets its rows back. An out of
range size says `invalid size`, which 9ns reads as EINVAL, as the doc had.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A terminal keeps its tag and two body rows through drags, squeezes and a smaller window</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T09:43:39Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=96383331f09e8af3fa24f767b3c56863309723b8'/>
<id>urn:sha1:96383331f09e8af3fa24f767b3c56863309723b8</id>
<content type='text'>
A terminal of one body row loses its prompt's mark and reads busy for
ever. Placement already refused to make one that short; now layout never
leaves one there either: a grip drag stops at the floor, and a column
squeezed by weights or by the window takes the rows from its other panes.
Text panes keep acme's way and can still be dragged to their tag, since
acme has no terminals to follow. The shrinktag, splitparent and cornerdrag
goldens are re-recorded for it, shrinktag's re-grab moved to where the
grip now is.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>A new pane with no room under the last goes last all the same</title>
<updated>2026-10-01T03:12:16Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T09:10:43Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=4dc55f7e3ae8232e6994b92e6b1948bd8c190baf'/>
<id>urn:sha1:4dc55f7e3ae8232e6994b92e6b1948bd8c190baf</id>
<content type='text'>
A pane from pane/new or New takes the bottom half of its column's last
pane, as acme's coladd does (cols.c:62-65); when that pane is too short
to give it a tag and 2 rows, the fallback halved the tallest pane and
put the new one under it, mid-column (the 7 9 8 found). It now goes last
all the same, with half the tallest pane's rows (its tag measured at the
column's width). Tty from a pane's ctl already follows acme's
makenewwindow (the active column first, util.c:456-467); fs.md now says
so rather than beside that pane.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>size says its limits, keeps every pane its rows, and ptys follow their panes</title>
<updated>2026-10-01T03:12:15Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T06:39:43Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=84d23aef86c0bcb6ee14bb69b1e4d6d65205e2f6'/>
<id>urn:sha1:84d23aef86c0bcb6ee14bb69b1e4d6d65205e2f6</id>
<content type='text'>
size refused an out-of-range line without saying the range, took a size
too small for the panes (leaving bodies of no rows), and a terminal
squeezed to its tag kept a pty of its old size. The refusal now names
20x6 to 4096x4096 (a bare size is EINVAL like any malformed line), a size
that would leave any pane less than its tag and 2 rows is refused and
undone, and a terminal's pty is resized with its pane down to one row
(only a folded or unplaced one keeps its grid).

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>No placement leaves a pane shorter than its tag and two rows</title>
<updated>2026-10-01T03:12:15Z</updated>
<author>
<name>Gabriel Schneider</name>
<email>gbrls@0x4200.cafe</email>
</author>
<published>2026-09-29T05:32:33Z</published>
<link rel='alternate' type='text/html' href='https://git.0x4200.cafe/pardes.git/commit/?id=672b2643583d13feef5d47600e0f6c15f276fba2'/>
<id>urn:sha1:672b2643583d13feef5d47600e0f6c15f276fba2</id>
<content type='text'>
Placement could split a pane down to a tag and one row, or give a new one
less. Every placement now checks the pane it made and each pane it shrank
against its tag (wrapped at its width) plus two rows: where they lack the
room, the column's tallest pane is halved instead, and where none can give
it the new pane is refused with "no space for a pane in that column"
(ENOSPC over 9P) and closed at the step's end, once its maker is done with
it. splitBelow and splitParent leave two body rows (a boot layout, split
before any row exists, is as before). Re-recorded by name: lookpanes (panes
one or two rows lower) and splitparent (the 6-row squeeze now refuses);
fs.py closes the scratches and long-named panes it no longer needs, since
its 24-row session filled.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
