Releases: ecliptik/flynn
Releases · ecliptik/flynn
Flynn v1.9.7
Added
- Zoom box in window title bar per Apple HIG (zoomDocProc)
- Click to toggle between user-sized window and standard 80x24 grid
- Sets standard state to default terminal dimensions
- Sends NAWS update to server on zoom while connected
Changed
- Scrollbar width from 16 to 15 pixels, matching Geomys UI dimensions
- Build system: renamed macplus preset to lite, full is now default
- README: added direct download links, auto-updated in release.sh
Fixed
- BUILD.md examples updated to reflect full as default preset
- BUILD.md: added apt-get install line for Debian/Ubuntu prerequisites
Downloads
| Edition | Description | Memory |
|---|---|---|
| Flynn | Full build — 4 sessions, 192-line scrollback, all features including 256-color | ~768KB |
| Flynn Lite | Recommended — 1 session, 96-line scrollback, most features | ~384KB |
| Flynn Minimal | Bare-bones — 1 session, no scrollback, stripped features | ~256KB |
See BUILD.md for custom build options.
Flynn v1.9.6
Added
- Finger protocol client (RFC 1288) — File > Finger... (Cmd+F)
- Query user information on remote hosts via TCP port 79
- Host, username, and verbose (/W) fields in Finger dialog
- Finger forwarding: user@host@gateway auto-splits and routes correctly
- Remembers last finger host/username across launches
- Status bar shows "finger | [user@]host"
- Window title includes "(finger)" suffix
- Per-bookmark protocol selection (Telnet or Finger) in bookmark editor
- Favorites submenu dispatches finger bookmarks correctly
- Configurable build system with 16 compile-time feature flags
- 3 build presets: minimal (~256KB), macplus/lite (~384KB), full (~768KB)
- Every major feature can be toggled:
--finger,--color,--glyphs,
--cp437,--clipboard,--savefile,--bookmarks,--darkmode,
--dblwidth,--altscreen,--offscreen,--statusbar,
--cursorstyles,--tabstops - Configurable sessions (1-4) and scrollback lines (0-256)
- SIZE resource (Finder memory partition) dynamically computed from
enabled features - Presets applied first, individual flags override:
--preset minimal --finger --bookmarks - Three-layer guard pattern: CMake source exclusion, header no-op stubs,
inline #ifdef guards (~163 guard sites across 26 files) - FlynnPrefs struct unchanged for cross-build prefs compatibility
- Three release editions: Flynn (full), Flynn Lite (macplus), Flynn Minimal
- Build documentation:
docs/BUILD.mdwith complete flag reference,
memory costs, presets, and examples - Direct offscreen memory writes bypass QuickDraw traps for rendering
(font bitmap cache, direct glyph blit, direct erase/fill) - Shadow buffer skips unchanged rows via memcmp
- Scroll sync uses memmove instead of CopyBits
- Color GWorld offscreen buffer eliminates flicker on System 7
- Optimized scrollbar arrow scrolling: ScrollRect + offscreen memmove
renders only 1 row per arrow click instead of full 24-row redraw
Fixed
- Dark mode rendering bugs: white bar at window bottom, status bar
artifacts, stale offscreen content - Offscreen buffer reuse: clear pixel data when reusing for different
window with same dimensions (prevented stale session content bleed) - Scrollback ring buffer index: corrected formula for partially-filled
buffers (was sb_head+sb_count+sb_row, now sb_head+sb_row) - Drain loop data race: process pending TCP data before checking for
disconnect state transition - System 7 GWorld rendering stability and artifact fixes
- icl8/ics8 icon polarity for System 7 color displays
- 68000 address error in offscreen_fill_rect
Changed
- Default build uses macplus preset: 1 session, 96-line scrollback, ~384KB
partition (was 4 sessions, 192-line scrollback, ~768KB) - Binary size: 91KB minimal, 125KB default, 130KB full
- Release script builds all 3 presets and uploads 6 artifacts per release
- FlynnPrefs v12 (finger_host, finger_user, bookmark_protocol[])
- File menu: Finger... inserted at position 2, items renumbered
- Control menu disabled for finger sessions
- Bookmark edit dialog: protocol popup (Telnet/Finger), dialog enlarged
- Performance and security review: hardening, leak fixes, dead code
removal, optimizations, and refactoring
Downloads
| Edition | Description | Memory |
|---|---|---|
| Flynn | Full build — 4 sessions, 192-line scrollback, all features including 256-color | ~768KB |
| Flynn Lite | Recommended — 1 session, 96-line scrollback, most features | ~384KB |
| Flynn Minimal | Bare-bones — 1 session, no scrollback, stripped features | ~256KB |
See BUILD.md for custom build options.
Flynn v1.9.4
Fixed
- Option+Space (Ctrl-Space) not recognized: vkey_to_base table was 48
entries, Space at vkey 0x31 (49) fell outside it. Extended table to
include Space, enabling Ctrl-Space (0x00) for tmux prefix and similar - Option+/ (Ctrl-/) not recognized: added '/' to vkey_to_base table
with special case since '/' & 0x1F produces wrong value (0x0F instead
of 0x1F) - ANSI-BBS disconnect losing goodbye screen: telnet_init() zeroed the
session's preferred_ttype before the snapshot restore check, so
bookmark-specific ANSI-BBS sessions saw the global pref (e.g. xterm)
and incorrectly restored the pre-clear snapshot. Now saves the
session's terminal type before reset
Flynn v1.9.3
Added
- 13 new Unicode glyph mappings: flower/florette dingbats (U+273E-2741),
snowflake (U+2744), sparkles (U+2728), flower emoji (🌸🌺🌼🌟💫),
plus 2 new QuickDraw primitives (flower, snowflake) - OSC 4 palette color query (rgb:RRRR/GGGG/BBBB replies from 256-color
palette), OSC 10/11 default fg/bg color queries (dark_mode-aware),
OSC 12/112 cursor color set/reset (no-op on monochrome XOR cursor) - Hierarchical submenus: Options menu now uses Font and Terminal Type
submenus (20 items → 5), fixing menu scrolling off-screen on Mac Plus.
File menu uses Favorites submenu for bookmark entries - Backspace mode toggle: DEL (0x7F) default for xterm/VT220, BS (0x08)
for ANSI-BBS. Auto-switches when changing terminal type; manual override
in Options menu ("Backspace Sends BS" checkmark) - Send Ctrl-H and Send Ctrl-X items in Control menu
- Prefs v8→v9 migration for backspace_bs field
Fixed
- Dark mode shutter effect on monochrome: EraseRect (white) → draw →
InvertRect caused visible white flash per row. Now renders directly
with PaintRect (black bg) + srcBic/patBic (white drawing) - BBS goodbye screen not displayed on disconnect: drain remaining TCP
data before closing on TIME_WAIT; skip snapshot restore for ANSI-BBS
terminal type to preserve goodbye screen - DNS lookup failure after prefs migration: backspace_bs field was inserted
before dns_server in the FlynnPrefs struct, shifting all subsequent fields
by 1 byte. DNS server "1.1.1.1" became ".1.1.1" (invalid), and username
lost its first character. Fixed validation to reject leading-dot IPs and
reset dns_server in migration - Backspace mode not auto-enabled when connecting with ANSI-BBS terminal
type via bookmark or new session (only worked from Options menu)
Changed
- Bookmarks renamed to Favorites throughout UI (menus, dialogs, labels)
- Terminal Type menu reordered: xterm, xterm-256color, VT100, VT220,
ANSI-BBS (display order decoupled from internal storage indices) - Connection status window widened from 240→320px, hostname truncation
40→50 chars to accommodate longer hostnames - Performance: hot path optimizations in terminal parser and draw routines
- Security: bounds checking on terminal response buffer flush
- Dead code removal: ~50 lines removed, unused functions and defines cleaned up
- Defensive improvements: conn_send() rejects zero-length writes, removed
unused idle_skip field from Connection struct
Flynn v1.9.2
Added
- CP437/ANSI-BBS terminal emulation for bulletin board systems
- Full 256-entry CP437 lookup table mapping each byte to ASCII, Mac Roman,
or QuickDraw glyph rendering - cp437_mode bypasses UTF-8 decoder for raw byte rendering, essential for
BBS art using 0x80-0x9F range (C1 control code collision in UTF-8 mode) - ANSI-BBS terminal type in TTYPE negotiation, settings, preferences menu,
and connect dialog — follows BBS community convention (ansi-bbs = CP437)
- Full 256-entry CP437 lookup table mapping each byte to ASCII, Mac Roman,
- True SGR attribute rendering
- Italic (SGR 3) via TextFace(italic)
- Strikethrough (SGR 9) via horizontal line at cell mid-height
- Dim (SGR 2) halves foreground RGB on color systems
- Blink (SGR 5/6) promotes background to bright colors (DOS-style)
- Bold-to-bright color promotion: SGR 1;30-37m promotes to bright colors
(indices 8-15), matching standard ANSI/BBS behavior - UTF-8 CP437 fallback for BBSes that send raw CP437 bytes despite
xterm-256color TTYPE negotiation - 57 new QuickDraw glyph primitives: double-line box drawing, mixed
junctions, smileys, Greek/math symbols (160+ total primitives) - 18 fractional block element glyphs (U+2581-U+258F, U+2594-U+2595)
- 60 sextant characters (U+1FB00-U+1FB3B) as 2x3 grid patterns
- DNS-over-TCP fallback for NAT environments
- Rendering diagnostic script (
scripts/render-test.sh)
Fixed
- DNS resolution through NAT: Snow's DaynaPORT rewrites UDP source IPs,
causing Flynn to reject valid DNS responses. Removed redundant source IP
validation (txn_id match already authenticates responses) - Backspace sends BS (0x08) instead of DEL (0x7F) for BBS compatibility
(Linux telnetd accepts both; BBSes universally expect BS) - Bytes 0xF8-0xFF silently dropped by UTF-8 parser — now route to CP437
- Legacy Computing chars (U+1FB00-U+1FBFF) produced double '??' instead
of single '?' (they are single-width, not wide)
Changed
- Glyph count: 103 → 160+ QuickDraw primitives
- Dead code removal: 25 cases from boxdraw_to_dec() superseded by glyph
tables, 3 cases from unicode_symbol_to_macroman(), dead block element
fallback block (~50 lines, ~700 bytes recovered) - Performance: eliminated double cell fetch in draw_row() (~80K cycles/redraw
saved on 68000), replaced dark shade MULU with shift operation - New source files:
cp437.c,cp437.h
Flynn v1.9.0
Added
- 256-color support on System 7 with Color QuickDraw
- Full 256-color palette: 16 ANSI colors + 216 color cube + 24 grayscale
- Truecolor (24-bit) SGR sequences downgraded to nearest 256-color match
- Palette Manager rendering via PmForeColor/PmBackColor for performance
- Color windows with NewCWindow/NewPalette on System 7, standard NewWindow on System 6
- Runtime detection via SysEnvirons() hasColorQD — zero impact on System 6
- Per-cell foreground and background colors stored in CellColor arrays
- ATTR_HAS_COLOR (bit 6) flag for fast skip of default-colored cells
- Color-aware dark mode: swaps default fg/bg, skips InvertRect on color systems
- New source files:
color.c,color.h - Memory: +52KB per session on System 7 color, zero on System 6 monochrome
- 38 new QuickDraw primitive glyphs (103 total, up from 65):
- Outline triangles: △ ▽ ▷ ◁ (U+25B3, U+25BD, U+25B7, U+25C1)
- Small filled triangles: ▸ ◂ (U+25B8, U+25C2)
- Diamonds: ◆ ◇ (U+25C6, U+25C7)
- Half-circle variants: ◐ ◑ ◒ ◓ (U+25D0-U+25D3)
- Fisheye circle: ◉ (U+25C9)
- Six-pointed star: ✶ (U+2736)
- Circled operators: ⊙ ⊕ ⊖ ⊗ (U+2299, U+2295-U+2297)
- Superscript digits: ⁰¹²³⁴⁵⁶⁷⁸⁹ (U+2070, U+00B9, U+00B2, U+00B3, U+2074-U+2079)
- Subscript digits: ₀₁₂₃₄₅₆₇₈₉ (U+2080-U+2089)
- Superscripts/subscripts rendered at 60% font size with scaled positioning
Fixed
- Terminal type not saved between sessions — Connect dialog now persists
the last-used terminal type (xterm, VT220, VT100, xterm-256color) - Cursor XOR artifacts on color systems — arrow key editing on System 7
caused stale inverse highlights because CSI cursor movement didn't mark
rows dirty. Now tracks cursor position changes and marks affected rows - Disconnect screen preservation — screen buffer snapshotted on full
clear (ESC[2J) and restored on disconnect, instead of wiping to blank - Session not cleaned up on bookmark connect failure — now properly
destroys session if TCP connect fails after window was created - Replaced all
sprintfwithsnprintfacross 15 call sites
(defense-in-depth buffer overflow protection) - Added bounds check to TTYPE/TSPEED subnegotiation buffer in telnet.c
Changed
- Glyph emoji base relocated from 0x60 to 0x80 to accommodate expanded
primitive range (0x00-0x66) - Lazy allocation of alt-screen and scrollback color arrays — deferred
until first use, saving up to 38.5KB/session on System 7 - Screen snapshot moved from shared static to per-session Terminal struct
for multi-session correctness; only triggers on full-screen clear
instead of every data receive (~1.5ms/receive saved on 68000) - Color default restore deferred to end of row instead of per-run,
reducing redundant RGBForeColor/RGBBackColor traps by 10-15% - Removed idle polling skip counter — eliminates 8.5ms average added
latency on keystroke echo - Single-session fast path in event loop — skips save/load state cycling
when only one session is open - Idle WaitNextEvent timeout reduced from 500ms to 167ms when disconnected
- SIZE resource increased from 640KB/512KB to 768KB/640KB for 4-session
color headroom - Removed ~450 lines of dead code: deleted dnr.c/dnr.h (superseded by
dns.c), 14 unused functions, 4 unused defines, deduplicated
ATTR_HAS_COLOR definition - Build size: ~103KB (down from ~110KB after dead code removal)
- Memory per session: ~79KB System 6 mono, ~92KB System 7 color (initial),
~130KB fully loaded with alt screen and scrollback color
Flynn v1.8.1
Fixed
- Add icon family resources (icl4, icl8, ics#, ics4, ics8) for System 7
Finder compatibility — custom Flynn icon now displays correctly instead
of generic application icon
Flynn v1.8.0
Added
- System 7 improvements (all conditional, System 6 behavior unchanged):
- MultiFinder suspend/resume: proper app4Evt handling, cursor blink stops
when backgrounded, WaitNextEvent sleep increases to 60 ticks when suspended - Required Apple Events: kAEOpenApplication, kAEQuitApplication handlers
for System 7 compliance (Finder can request clean quit) - StandardPutFile: modern System 7 save dialog for Save Contents, falls back
to SFPutFile on System 6 - Notification Manager: flashes Apple menu diamond when a session disconnects
while Flynn is in the background - Machine type in About dialog: shows "Running on Macintosh Plus" (or SE,
II, IIci, etc.) via Gestalt
- MultiFinder suspend/resume: proper app4Evt handling, cursor blink stops
Changed
- About dialog simplified per Apple HIG: condensed to app name/version,
machine type, copyright, and GitHub link
Flynn v1.7.1
Added
- Save Contents... (Cmd+S): save terminal scrollback and screen buffer to a
plain text file via SFPutFile dialog. Creates TEXT/ttxt files readable by
TeachText. Default filename is the connection hostname. - New savefile.c/savefile.h module for file save functionality
Changed
- File menu reorganized per Apple HIG:
- "Save Contents..." (Cmd+S) in its own section
- "Bookmarks..." (Cmd+B) leads the bookmark section
- Recent bookmarks listed under Bookmarks
- "Add Bookmark..." (renamed from "Save as Bookmark...") moved after recents
- Separators between file operations, save, and bookmark management
- Cmd+S reassigned from "Save as Bookmark" to "Save Contents" (standard HIG
convention for Cmd+S = save to file) - "Add Bookmark..." is now a dynamic menu item, enabling proper bookmark
section grouping with Bookmarks... as the section leader
Flynn v1.7.0
Changed
- Major codebase refactor: main.c reduced from 3,478 to ~494 lines (86% reduction)
- Extracted dialogs.c: all dialog handling (connect, bookmarks, about, disconnect)
- Extracted menus.c: menu management with per-menu dispatch handlers
- Extracted input.c: keyboard/mouse handling with data-driven key mapping tables
- Extracted clipboard.c: copy/paste/select all operations
- Extracted macutil.c: shared utilities (c2pstr, sprintfp, set_wtitlef, clear_window_bg)
- Extended session.c: font presets, ttype/font string helpers, window resize, init from prefs
- Collapsed identical telnet option handlers with fallthrough in telnet.c
- Extracted conn_resolve_host() from conn_connect() in connection.c
- Split handle_menu() into per-menu handlers (handle_file_menu, handle_edit_menu, etc.)
- Data-driven key mapping replaces if/else chain in handle_key_down()
- Total compiled LOC reduced from 12,027 to 10,036 (17% reduction)
Fixed
- Remote disconnect preserves terminal screen content (was wiped by terminal_reset)
- Window repaint after disconnect alert restores terminal content in all modes
Removed
- Dead conn_open_dialog() from connection.c
- 6 unused TCP wrapper functions from tcp.c (~256 lines)