47 Commits
Author SHA1 Message Date
Greyson Parrelli 2a0e03cc41 Improve review-tool performance. 2026-09-08 14:13:53 -04:00
Greyson Parrelli 8b3aadbd48 Fix scroll position after folding in review tool. 2026-09-04 14:27:24 -04:00
Greyson Parrelli 8ad7b3307d Improve efficiency of review tool rendering. 2026-08-28 10:07:48 -04:00
Greyson Parrelli d7452c2262 Fix clogged up git operations. 2026-08-27 13:32:47 -04:00
Greyson Parrelli 2e3af19d00 Fix branch refresh. 2026-08-27 12:10:32 -04:00
Greyson Parrelli 11ebe07e4f Improve review tool viewed diffs. 2026-08-27 11:47:26 -04:00
Greyson Parrelli 1223499369 Fix pasting bug. 2026-08-27 11:11:49 -04:00
Greyson Parrelli 553e1f5424 Update tab styling. 2026-08-27 11:02:32 -04:00
Greyson Parrelli 0bf85b3b2a Add ability to restore previous layout. 2026-08-27 10:55:04 -04:00
Greyson Parrelli 5cb9bb117a Fix review perf issues. 2026-08-27 10:22:32 -04:00
Greyson Parrelli 7414c89fe6 Add notifications. 2026-08-26 23:24:14 -04:00
Greyson Parrelli afad6a2636 Simplify sidebar styling. 2026-08-26 22:38:03 -04:00
Greyson Parrelli 4327c17fd7 Fix webview dragging. 2026-08-26 14:03:49 -04:00
Greyson Parrelli 0fd0aa44c7 Improve toolbar review layout. 2026-08-25 19:51:42 -04:00
Greyson Parrelli 44619293c3 Hopefully fix some copy-paste stuff. 2026-08-25 16:48:34 -04:00
Greyson Parrelli 198258c181 Added a hopeful quit blocking dialog. 2026-08-25 16:24:00 -04:00
Greyson Parrelli 3721ec38ba Add layout dialog helper. 2026-08-25 15:54:43 -04:00
Greyson Parrelli 448e31ae88 Render markdown in comments. 2026-08-25 14:54:50 -04:00
Greyson Parrelli 07ed03b570 Add ctrl+f for review tool. 2026-08-25 09:35:25 -04:00
Greyson Parrelli 071522f67c Add quick theming tool. 2026-08-24 16:45:21 -04:00
Greyson Parrelli 407dd81512 Build in the review tool. 2026-08-24 09:24:01 -04:00
Greyson Parrelli 4eef6a28d3 Fix icon sizing. 2026-08-23 14:35:47 -04:00
Greyson Parrelli 63203433dc Fix button sizing. 2026-08-21 22:35:58 -04:00
Greyson Parrelli db69dc41b2 Bundle all the icons together. 2026-08-20 14:19:30 -04:00
Greyson Parrelli a742b51d3b Add better and configurable shortcuts. 2026-08-15 00:00:06 -04:00
Greyson Parrelli 043b994a15 Fix pager rendering slowness. 2026-08-14 23:00:27 -04:00
Greyson Parrelli e4b9fac3c9 Improve terminal rendering performance. 2026-08-14 22:39:48 -04:00
Greyson Parrelli 9df3d35422 Some perf optimizations for blank screens. 2026-08-14 22:18:40 -04:00
Greyson Parrelli b50e2f4108 Add tab re-ordering. 2026-08-14 21:21:13 -04:00
Greyson Parrelli 695417a601 Add theme customizer. 2026-08-13 15:55:23 -04:00
Greyson Parrelli 2daeb6125f Fix mouse interactions in terminal. 2026-08-13 11:46:48 -04:00
Greyson Parrelli 71b3c93521 Add find shortcut in browser. 2026-08-13 11:18:33 -04:00
Greyson Parrelli 4e622b15af Add ability to set boot layout. 2026-08-13 10:52:58 -04:00
Greyson Parrelli 6c7c3bfa63 Add emoji prefix. 2026-08-13 09:56:34 -04:00
Greyson Parrelli 0836cbc772 Add ability use script as cwd. 2026-08-13 08:51:03 -04:00
Greyson Parrelli e16b147e16 Improve styling. 2026-08-12 21:15:07 -04:00
Greyson Parrelli 4e0e400372 Fix hooks. 2026-08-12 18:50:16 -04:00
Greyson Parrelli dca5ec0b7d Add focus button. 2026-08-12 08:05:23 -04:00
Greyson Parrelli dd60e52005 Add hook system. 2026-08-11 16:24:53 -04:00
Greyson Parrelli 73a0187db5 Rebrand as Playpen. 2026-08-11 14:26:12 -04:00
Greyson Parrelli 3026bdcd4c Add custom layout creation. 2026-08-11 13:57:54 -04:00
Greyson Parrelli a7a9429d09 Add a web browser tab. 2026-08-11 12:39:14 -04:00
Greyson Parrelli 918ccec6e1 Split tree layouts, resizable dividers, and live drag preview
Replaces the flat pane list with a binary split tree, so a view can hold
layouts a single shared orientation could not express. Three panes in a row
with the rightmost dragged to the bottom now gives two on top and one
spanning the full width beneath them.

Each split node owns a GtkPaned, which brings draggable dividers. Positions
are stored as ratios and re-applied whenever the available space changes, so
proportions survive window resizes while user drags still update them.

Drop placement depends on proximity to the view's own border: near an edge
the pane is placed against the whole layout and spans it, anywhere else it
splits only the pane under the pointer.

Drags now rearrange live rather than on release, so the layout under the
cursor is always the result. Cancelling restores the original arrangement,
which works because only the dragged pane moves: the rest of the tree keeps
its shape, so re-inserting beside the original sibling is enough.

Fixes a latent ownership bug the tree exposed: panes did not hold a
reference to their own widget, so detaching one during a rebuild dropped the
last reference and finalized it, producing GTK_IS_WIDGET assertion failures.
Panes and split nodes now each own a reference to their widget.
2026-08-11 11:25:44 -04:00
Greyson Parrelli 5b00c98e03 Multiple terminals per tab, rearrangeable by drag or keyboard
A tab is now a view holding an ordered list of panes rather than a single
terminal. New panes open side by side; moving one against a top or bottom
edge restacks the view, and against a side edge returns it to a row.

Layout is a flat list with one orientation per view rather than a split
tree. That covers a shell beside an agent without the structure a tree
needs, and it can be replaced once mixed layouts actually matter.

Panes live in a GtkBox and are reordered in place, so rearranging never
unparents a terminal and running processes and scrollback survive the move.

Dragging a pane uses its header as the handle so it never competes with the
terminal's own mouse handling, and drops go through the same moveRelative
path as the Ctrl+Shift+arrow shortcuts.

Also fixes an ordering bug this surfaced: View.create used to add its first
pane immediately, firing the title callback into a Tab that had not been
initialized yet. The view is now created empty and the caller adds the pane
once it has finished wiring itself up.
2026-08-11 10:59:21 -04:00
Greyson Parrelli 74bc9e8fd3 Add mise tasks, desktop entry, and app icon
mise run install builds a release binary and installs it into ~/.local with
a desktop entry and a hicolor icon.

Two wrinkles specific to a Nix-built GTK app installed outside the dev shell:
the launcher is a generated script rather than a symlink, because a desktop
launcher provides a minimal environment and GTK still needs to be pointed at
its GSettings schemas and icon themes; and install registers Nix GC roots for
every store path in the binary's RPATH, so nix-collect-garbage cannot delete
GTK out from under the installed app.

The runtime paths are exported from the flake's shellHook and read back at
install time, so they cannot drift from what the binary was built against.
2026-08-11 10:03:41 -04:00
Greyson Parrelli 7af5cf72e6 Use the user's login shell, and fix login-shell argv
Two separate problems made the terminal run the wrong shell:

Pty.create took a single argv slice and used argv[0] as both the exec path
and the argument vector's first entry. Session passed {shell, "-shell"},
so the shell received "-zsh" as an ordinary argument rather than as its
argv[0]. Bash quietly tolerated it; zsh rejects it and exits immediately,
which closed the tab and took the window down with it. The exec path and
argv are now separate parameters.

Shell resolution preferred $SHELL, which describes whichever shell launched
us rather than the one the user configured. Inside 'nix develop' that is
Nix's own minimal bash, so the terminal never opened the user's zsh. We now
read the login shell from the passwd database and keep $SHELL only as a
fallback for systems without a usable passwd entry.

shot.sh no longer forces a shell, so screenshots reflect real behavior.
2026-08-11 09:11:53 -04:00
Greyson Parrelli 738cead680 vtabs: terminal with vertical tabs on libghostty-vt + GTK4
Uses libghostty-vt (the API Ghostty documents for external embedders) for
the terminal core. Ghostty's other C API, ghostty.h, exposes a full terminal
surface but only supports macOS and iOS platform tags, so it cannot be
embedded on Linux.

We supply the layers libghostty-vt deliberately leaves out: PTY and process
management, a Cairo/Pango cell renderer, and a GTK4/libadwaita UI with a
Zen-style vertical tab sidebar.

Nix pins the whole toolchain (Zig 0.16 via zig-overlay, GTK 4.22, libadwaita)
so no host setup is needed.
2026-08-11 08:36:10 -04:00