Alt+Delete closes the active tab; kill only pgids the compositor owns

Close the active tab on Alt+Delete: the tab vanishes immediately (active
moves to the right neighbor, or the left one for a rightmost tab), the
client's whole process group gets SIGTERM with a short SIGKILL escalation
if it ignores the TERM. Grabbed and repeat-latched so a single hold closes
one tab.

Slots are claimed in connection order (not launch order), so close signals
the process group recorded at claim time. Only groups the compositor owns
are group-signaled; a client started from the compositor's own terminal
shares our group and is killed by pid instead, so teardown can't group-kill
the launcher's session (a pytest run died 143/137 for exactly this).

Tests: settle the active-tab log before cycling (wait_any_active +
cycle_ack quiesce), spawn the extra client in its own session, retry
wl-paste when the host clipboard stalls, and only skip the host-colour
assertion when the host pixel is unobservable. Full suite 5/5 green.
This commit is contained in:
Andrew Hamilton 2026-08-17 10:26:48 +10:00
parent f197c229ca
commit fb29f03dc0
3 changed files with 422 additions and 28 deletions

View file

@ -99,6 +99,7 @@ Notes:
| `Alt` (hold) | Show the tab-title overlay (centered) |
| `Alt+Up` | Previous tab (hold to keep cycling) |
| `Alt+Down` | Next tab (hold to keep cycling) |
| `Alt+Delete` | Close the active tab (SIGTERM, SIGKILL fallback) |
| `Ctrl+Shift+T` | Open a new terminal tab next to the current one |
Holding `Alt` shows a passive overlay listing every tab's title with the
@ -119,6 +120,12 @@ The tab-cycling hotkey only emits a physical press for the first tab switch;
repeats are synthesized, so holding `Alt+Up/Down` keeps stepping through
tabs while any other key stops it.
`Alt+Delete` closes the active tab. The tab disappears immediately (the tab
to its right becomes active, or the left neighbor if it was the rightmost);
the client's process group gets a `SIGTERM`, escalated to `SIGKILL` after a
short grace if it ignores the signal. A tab that closes on its own (its
program exits) instead hands active off to the left neighbor.
Function keys are **not** grabbed: `F9`/`F10`/`F11` (and anything else) are
forwarded to the focused client, so apps keep their own bindings (e.g. a
browser's `F11`).