When switching tabs, the newly active tab's pane layout wasn't being
recalculated, causing panes to render at y=0 instead of below the tab
bar. Now layout is recalculated after any tab action.
- Add mouse click detection in tab bar area
- Calculate clicked tab based on x position and tab width
- Trigger tab switch via pending_tab_action (goto tab N)
- Add window_set_tab_bar_info() to update tab bar geometry
- Account for tab bar offset in text selection coordinates
- Add try_font_fallbacks() for cross-distro font discovery
Implements two major features for the terminal:
Tabs:
- Cmd+T to create new tab
- Cmd+W to close tab (context-aware: closes pane first if multiple)
- Cmd+[/] to switch between tabs
- Cmd+1-9 to jump to specific tab
- Dynamic tab bar that hides when only one tab exists
- Each tab maintains independent shell state
Split Panes:
- Cmd+\ to split vertically (side-by-side panes)
- Cmd+Shift+\ to split horizontally (stacked panes)
- Cmd+Arrow keys for directional pane navigation
- Cmd+H/J/K/L for vim-style pane navigation
- Each pane has its own independent PTY/shell
- Inactive panes are visually dimmed (60% brightness)
- Scissor-based viewport clipping for each pane
- Splits default to 50% of current pane's space
Architecture:
- New pane_mod module for pane data structure
- New layout_mod for split calculations and navigation
- Refactored tab_manager to contain panes array per tab
- Added glScissor binding for pane viewport clipping
Implement real-time font size changes via keyboard shortcuts:
- Ctrl/Cmd + = (or +): Increase font size by 2px
- Ctrl/Cmd + -: Decrease font size by 2px
- Ctrl/Cmd + 0: Reset to config default
Font size is clamped to 8-72px range. Terminal dimensions
automatically recalculate and PTY is resized accordingly.
Fallback font path is saved at startup and reloaded on size
change to preserve Unicode glyphs (fish chevron, icons, etc).
Use ascender (not cell_height) for baseline positioning. Text baseline
is now at y + ascender, leaving room below for descenders. Cursor
rendering updated to align properly with text glyphs.
Store fallback font's ascender and adjust bearing_y when rendering
glyphs from fallback font. This compensates for different font metrics
between primary and fallback fonts, keeping all glyphs on the same
baseline.
Add pending_wrap flag for deferred line wrapping - cursor stays at EOL
until next character is written, then wraps. This matches xterm behavior
and fixes the ZSH PROMPT_EOL_MARK (%) appearing incorrectly.
Also update DA1/DA2 responses to identify as VT220 with ANSI color support.
The parser was removing quotes before handling inline comments,
causing "#FFFFFF" to become "#FFFFFF" which was then truncated
at the "#" as if it were a comment. Now calls remove_inline_comment
first, which correctly preserves "#" inside quoted strings.
Window appearance can now be configured via TOML:
- [window] opacity = 0.95 (0.0-1.0, default 1.0)
- [window] blur = true (macOS only, currently stubbed)
Implementation:
- Add toml_get_real() for float parsing in TOML
- Add window_opacity and window_blur to config_t
- Enable GLFW_TRANSPARENT_FRAMEBUFFER when opacity < 1.0
- Use opacity value in glClearColor alpha channel
- Add window_set_blur() function (stub - needs Cocoa integration)
Note: macOS blur requires Cocoa framework which has CMake integration
issues with Fortran compilers. The blur function is stubbed for now.
- Draw selection background for all cells including spaces, not just
text characters, so selections appear continuous
- Add macOS font paths for fallback fonts (Apple Symbols, Library/Fonts)
- Prioritize finding fonts with common Unicode symbols (❯ chevron)
before icon-only fonts
Use face->size->metrics.max_advance (scaled 26.6 pixels) instead of
face->max_advance_width (unscaled font units). This was causing
double-width characters and cursor on macOS.