<feed xmlns='http://www.w3.org/2005/Atom'>
<title>term.git/include/term/term.h, branch main</title>
<subtitle>[no description]</subtitle>
<id>https://git.wsap.dev/term.git/atom?h=main</id>
<link rel='self' href='https://git.wsap.dev/term.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/'/>
<updated>2026-10-15T10:04:01+00:00</updated>
<entry>
<title>Rename the library to wsap_vtcore</title>
<updated>2026-10-15T10:04:01+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T10:04:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=dcebf9c7f954a55350b68d0ead1935612c4e2e05'/>
<id>urn:sha1:dcebf9c7f954a55350b68d0ead1935612c4e2e05</id>
<content type='text'>
ncurses installs &lt;term.h&gt; and defines struct term. In a file that
includes both headers, an ncurses TERMINAL * and this library's terminal
are silently the same type. The name wsap_vtcore avoids the clash.

The public header is now &lt;wsap_vtcore/wsap_vtcore.h&gt;. Every global
symbol uses the wsap_vtcore_ prefix, every macro uses WSAP_VTCORE_, and
the shared library is libwsap_vtcore.so.0. The default terminal name is
now "wsap_vtcore". The ISA override variable is WSAP_VTCORE_ISA.

No other behavior changes. The amalgamation writes wsap_vtcore.c and
wsap_vtcore.h.

Co-Authored-By: Claude Haiku 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Report selection allocation failure instead of truncating</title>
<updated>2026-10-15T09:42:11+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:42:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=6d2dc774947787dcef73a3251d1e9ec51bc526df'/>
<id>urn:sha1:6d2dc774947787dcef73a3251d1e9ec51bc526df</id>
<content type='text'>
On a screen taller than 256 rows the selection's row list is allocated.
When that failed, it fell back to the 256-entry stack array, so the
selection and the snapshot's selection spans silently stopped at row
256 while every call still reported success.

lines_init() now reports the failure. term_select_start() and
term_select_extend() return false and leave the selection unchanged,
term_snapshot_update() fails and keeps its previous content, and the
text getters return NULL, as they do for their other allocations.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Reject a scrollback above TERM_SCROLLBACK_MAX</title>
<updated>2026-10-15T09:40:44+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:40:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=7b31d6a05357953c035e2ab05ec117ef748f7798'/>
<id>urn:sha1:7b31d6a05357953c035e2ab05ec117ef748f7798</id>
<content type='text'>
term_new() silently cut a scrollback above 1000000 lines to 1000000.
The limit now has a name in term.h, and term_new() returns NULL above
it, as it does for the other invalid options.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'wt/snapshot-atomic' into api-hardening</title>
<updated>2026-10-15T09:39:21+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:39:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=ca69844a243a6e335b0ddafad057f35e89e0a576'/>
<id>urn:sha1:ca69844a243a6e335b0ddafad057f35e89e0a576</id>
<content type='text'>
# Conflicts:
#	src/snapshot.c
</content>
</entry>
<entry>
<title>Merge branch 'wt/lock' into api-hardening</title>
<updated>2026-10-15T09:38:54+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:38:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=6ee9eb37d8e616a972fb29b3fbdbc33991aa844f'/>
<id>urn:sha1:6ee9eb37d8e616a972fb29b3fbdbc33991aa844f</id>
<content type='text'>
# Conflicts:
#	src/screen.c
#	tests/term_test.c
</content>
</entry>
<entry>
<title>Merge branch 'wt/host-name' into api-hardening</title>
<updated>2026-10-15T09:38:43+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:38:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=caf7d446446a0af0b30886a6c4ee5851aab553e2'/>
<id>urn:sha1:caf7d446446a0af0b30886a6c4ee5851aab553e2</id>
<content type='text'>
# Conflicts:
#	src/screen.c
</content>
</entry>
<entry>
<title>Merge branch 'wt/strict-input' into api-hardening</title>
<updated>2026-10-15T09:38:37+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:38:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=6cd9ab6f73994b68e8453c92a014d1a372af2a24'/>
<id>urn:sha1:6cd9ab6f73994b68e8453c92a014d1a372af2a24</id>
<content type='text'>
# Conflicts:
#	src/screen.c
</content>
</entry>
<entry>
<title>Keep the snapshot unchanged when an update fails</title>
<updated>2026-10-15T09:38:32+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:38:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=4c72f7b02fbafd15d0cf843edece106714bcc5f7'/>
<id>urn:sha1:4c72f7b02fbafd15d0cf843edece106714bcc5f7</id>
<content type='text'>
term_snapshot_update converted the viewport in place, so an allocation
that failed midway left the snapshot empty and a renderer painted a blank
frame. Split the update into two phases. Phase 1 makes every allocation
the update needs and counts the arena words the converted rows add, then
grows the arena once. Phase 2 writes the view, cells, keys, clusters, and
selection, and cannot fail. A failed update now keeps the previous
content, and a retry is an ordinary incremental update.

invalidate() is removed. The term_snapshot_update comment and the
correctness audit now say the snapshot keeps its previous content.

The failure test fails each allocation in turn from the same starting
state. After every failed call it compares the view, cells, row keys,
selection spans, and cluster code points with the state before the call.
A retry must succeed and match a fresh capture. The cases are a first
update, a 32 by 16 screen of ZWJ families and regional-indicator flags
(arena growth), a resize, a 300-row screen (scratch arrays), and a long
scroll run.

Co-Authored-By: Claude Haiku 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'wt/abi-version' into api-hardening</title>
<updated>2026-10-15T09:38:28+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:38:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=86b1eed7dd946d6054eff37cdb7b4a784283e23b'/>
<id>urn:sha1:86b1eed7dd946d6054eff37cdb7b4a784283e23b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Replace the writer spin lock with a blocking mutex</title>
<updated>2026-10-15T09:37:10+00:00</updated>
<author>
<name>Berke Güzel</name>
<email>wenekar1@gmail.com</email>
</author>
<published>2026-10-15T09:37:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.wsap.dev/term.git/commit/?id=e3d8fe4854a7ef7ff0637688cda9e65feb680122'/>
<id>urn:sha1:e3d8fe4854a7ef7ff0637688cda9e65feb680122</id>
<content type='text'>
term_write_begin spun on an atomic sequence word. A waiter burned CPU,
and with no priority inheritance a SCHED_FIFO waiter could starve a
preempted holder on the same CPU. The writer section is now a pthread
mutex with PTHREAD_PRIO_INHERIT where the platform has it, and an SRWLOCK
on Windows. Re-entry on the owning thread still only counts the depth.

The platform wrapper (init, lock, unlock, destroy) is in compat.h. term_new
initializes the mutex, and term_free destroys it. Meson links the thread
library into the core, term_dep, and term_internal_dep. The README,
term.h, and the amalgamation note say that POSIX needs -pthread.

Tests: the feed and snapshot thread test now checks the final screen and
history against a serial reference. A new test checks that term_lock
nests and that another thread waits for the last term_unlock.

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