From 14d717d7f491ffc4d11087581bb7831802e02269 Mon Sep 17 00:00:00 2001 From: reugenio Date: Wed, 10 Dec 2025 00:50:44 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Font=20completo=20+=20key=20repe?= =?UTF-8?q?at=20para=20navegaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Font bitmap 8x8 completo (ASCII 32-126) - navKeyPressed() ahora detecta key repeat de SDL2 - Exportar default_font desde render module 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/core/input.zig | 22 ++--- src/render/font.zig | 233 +++++++++++++++++++++++++++++++++++--------- src/zcatgui.zig | 4 +- 3 files changed, 202 insertions(+), 57 deletions(-) diff --git a/src/core/input.zig b/src/core/input.zig index 156579e..9c372c7 100644 --- a/src/core/input.zig +++ b/src/core/input.zig @@ -354,19 +354,17 @@ pub const InputState = struct { return self.key_events[0..self.key_event_count]; } - /// Check if any navigation key was pressed + /// Check if any navigation key was pressed (includes key repeat) pub fn navKeyPressed(self: Self) ?Key { - if (self.keyPressed(.up)) return .up; - if (self.keyPressed(.down)) return .down; - if (self.keyPressed(.left)) return .left; - if (self.keyPressed(.right)) return .right; - if (self.keyPressed(.home)) return .home; - if (self.keyPressed(.end)) return .end; - if (self.keyPressed(.page_up)) return .page_up; - if (self.keyPressed(.page_down)) return .page_down; - if (self.keyPressed(.tab)) return .tab; - if (self.keyPressed(.enter)) return .enter; - if (self.keyPressed(.escape)) return .escape; + // Check key events (includes repeats from SDL2) + for (self.key_events[0..self.key_event_count]) |event| { + if (event.pressed) { + switch (event.key) { + .up, .down, .left, .right, .home, .end, .page_up, .page_down, .tab, .enter, .escape => return event.key, + else => {}, + } + } + } return null; } }; diff --git a/src/render/font.zig b/src/render/font.zig index 7a21ba9..f295647 100644 --- a/src/render/font.zig +++ b/src/render/font.zig @@ -131,55 +131,200 @@ pub const default_font = Font{ .num_chars = 95, }; -// 8x8 font data for ASCII 32-126 +// 8x8 font data for ASCII 32-126 (complete font) // Each character is 8 bytes (8 rows, 1 byte per row) -const default_font_data = blk: { - // This is a minimal font - in production, use a proper font - var data: [95 * 8]u8 = undefined; - - // Initialize all to zero - for (&data) |*b| { - b.* = 0; - } - +// Based on classic PC BIOS font +const default_font_data = [95 * 8]u8{ // Space (32) - // Already zero - + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ! (33) - const exclaim = [8]u8{ 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00 }; - @memcpy(data[1 * 8 ..][0..8], &exclaim); - - // A (65) - const a_upper = [8]u8{ 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00 }; - @memcpy(data[33 * 8 ..][0..8], &a_upper); - - // B (66) - const b_upper = [8]u8{ 0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00 }; - @memcpy(data[34 * 8 ..][0..8], &b_upper); - - // C (67) - const c_upper = [8]u8{ 0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00 }; - @memcpy(data[35 * 8 ..][0..8], &c_upper); - - // ... Add more characters as needed - - // a (97) - const a_lower = [8]u8{ 0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00 }; - @memcpy(data[65 * 8 ..][0..8], &a_lower); - - // b (98) - const b_lower = [8]u8{ 0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x7C, 0x00 }; - @memcpy(data[66 * 8 ..][0..8], &b_lower); - + 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00, + // " (34) + 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, + // # (35) + 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, + // $ (36) + 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00, + // % (37) + 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, + // & (38) + 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, + // ' (39) + 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + // ( (40) + 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, + // ) (41) + 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, + // * (42) + 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, + // + (43) + 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, + // , (44) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, + // - (45) + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + // . (46) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, + // / (47) + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00, // 0 (48) - const zero = [8]u8{ 0x3C, 0x66, 0x6E, 0x76, 0x66, 0x66, 0x3C, 0x00 }; - @memcpy(data[16 * 8 ..][0..8], &zero); - + 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00, // 1 (49) - const one = [8]u8{ 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00 }; - @memcpy(data[17 * 8 ..][0..8], &one); - - break :blk data; + 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, + // 2 (50) + 0x7C, 0xC6, 0x06, 0x7C, 0xC0, 0xC0, 0xFE, 0x00, + // 3 (51) + 0x7C, 0xC6, 0x06, 0x3C, 0x06, 0xC6, 0x7C, 0x00, + // 4 (52) + 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x0C, 0x00, + // 5 (53) + 0xFE, 0xC0, 0xFC, 0x06, 0x06, 0xC6, 0x7C, 0x00, + // 6 (54) + 0x7C, 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0x7C, 0x00, + // 7 (55) + 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, + // 8 (56) + 0x7C, 0xC6, 0xC6, 0x7C, 0xC6, 0xC6, 0x7C, 0x00, + // 9 (57) + 0x7C, 0xC6, 0xC6, 0x7E, 0x06, 0x06, 0x7C, 0x00, + // : (58) + 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00, + // ; (59) + 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30, + // < (60) + 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, + // = (61) + 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, + // > (62) + 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, + // ? (63) + 0x7C, 0xC6, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00, + // @ (64) + 0x7C, 0xC6, 0xDE, 0xDE, 0xDE, 0xC0, 0x7C, 0x00, + // A (65) + 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + // B (66) + 0xFC, 0xC6, 0xC6, 0xFC, 0xC6, 0xC6, 0xFC, 0x00, + // C (67) + 0x7C, 0xC6, 0xC0, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, + // D (68) + 0xF8, 0xCC, 0xC6, 0xC6, 0xC6, 0xCC, 0xF8, 0x00, + // E (69) + 0xFE, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xFE, 0x00, + // F (70) + 0xFE, 0xC0, 0xC0, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, + // G (71) + 0x7C, 0xC6, 0xC0, 0xCE, 0xC6, 0xC6, 0x7E, 0x00, + // H (72) + 0xC6, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0xC6, 0x00, + // I (73) + 0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, + // J (74) + 0x06, 0x06, 0x06, 0x06, 0x06, 0xC6, 0x7C, 0x00, + // K (75) + 0xC6, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0xC6, 0x00, + // L (76) + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, + // M (77) + 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, + // N (78) + 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, + // O (79) + 0x7C, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // P (80) + 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, 0xC0, 0x00, + // Q (81) + 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0xDE, 0x7C, 0x06, + // R (82) + 0xFC, 0xC6, 0xC6, 0xFC, 0xD8, 0xCC, 0xC6, 0x00, + // S (83) + 0x7C, 0xC6, 0xC0, 0x7C, 0x06, 0xC6, 0x7C, 0x00, + // T (84) + 0xFE, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + // U (85) + 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // V (86) + 0xC6, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x10, 0x00, + // W (87) + 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, + // X (88) + 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00, + // Y (89) + 0xC6, 0xC6, 0x6C, 0x38, 0x18, 0x18, 0x18, 0x00, + // Z (90) + 0xFE, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xFE, 0x00, + // [ (91) + 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, + // \ (92) + 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, + // ] (93) + 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, + // ^ (94) + 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00, + // _ (95) + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, + // ` (96) + 0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, + // a (97) + 0x00, 0x00, 0x7C, 0x06, 0x7E, 0xC6, 0x7E, 0x00, + // b (98) + 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xFC, 0x00, + // c (99) + 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x00, + // d (100) + 0x06, 0x06, 0x7E, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // e (101) + 0x00, 0x00, 0x7C, 0xC6, 0xFE, 0xC0, 0x7C, 0x00, + // f (102) + 0x1C, 0x36, 0x30, 0x78, 0x30, 0x30, 0x30, 0x00, + // g (103) + 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, + // h (104) + 0xC0, 0xC0, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, + // i (105) + 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, + // j (106) + 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, + // k (107) + 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, + // l (108) + 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, + // m (109) + 0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, + // n (110) + 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, + // o (111) + 0x00, 0x00, 0x7C, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, + // p (112) + 0x00, 0x00, 0xFC, 0xC6, 0xC6, 0xFC, 0xC0, 0xC0, + // q (113) + 0x00, 0x00, 0x7E, 0xC6, 0xC6, 0x7E, 0x06, 0x06, + // r (114) + 0x00, 0x00, 0xDC, 0xE6, 0xC0, 0xC0, 0xC0, 0x00, + // s (115) + 0x00, 0x00, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x00, + // t (116) + 0x30, 0x30, 0x7C, 0x30, 0x30, 0x36, 0x1C, 0x00, + // u (117) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0xC6, 0x7E, 0x00, + // v (118) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00, + // w (119) + 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00, + // x (120) + 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, + // y (121) + 0x00, 0x00, 0xC6, 0xC6, 0xC6, 0x7E, 0x06, 0x7C, + // z (122) + 0x00, 0x00, 0xFE, 0x0C, 0x38, 0x60, 0xFE, 0x00, + // { (123) + 0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0x00, + // | (124) + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + // } (125) + 0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0x00, + // ~ (126) + 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; // ============================================================================= diff --git a/src/zcatgui.zig b/src/zcatgui.zig index d8f1a4e..1cdad6a 100644 --- a/src/zcatgui.zig +++ b/src/zcatgui.zig @@ -77,7 +77,9 @@ pub const KeyEvent = macro.KeyEvent; pub const render = struct { pub const Framebuffer = @import("render/framebuffer.zig").Framebuffer; pub const SoftwareRenderer = @import("render/software.zig").SoftwareRenderer; - pub const Font = @import("render/font.zig").Font; + const font_module = @import("render/font.zig"); + pub const Font = font_module.Font; + pub const default_font = font_module.default_font; pub const ttf = @import("render/ttf.zig"); pub const TtfFont = ttf.TtfFont; pub const FontRef = ttf.FontRef;