diff --git a/src/Window.zig b/src/Window.zig index 457051ace..728c398c5 100644 --- a/src/Window.zig +++ b/src/Window.zig @@ -669,48 +669,54 @@ fn keyCallback( } // Handle non-printables - const char: u8 = switch (@bitCast(u8, mods)) { - // No modifiers pressed at all - 0 => @as(u8, switch (key) { + const char: u8 = char: { + const mods_int = @bitCast(u8, mods); + const ctrl_only = @bitCast(u8, glfw.Mods{ .control = true }); + + // If we're only pressing control, check if this is a character + // we convert to a non-printable. + if (mods_int == ctrl_only) { + const val: u8 = switch (key) { + .a => 0x01, + .b => 0x02, + .c => 0x03, + .d => 0x04, + .e => 0x05, + .f => 0x06, + .g => 0x07, + .h => 0x08, + .i => 0x09, + .j => 0x0A, + .k => 0x0B, + .l => 0x0C, + .m => 0x0D, + .n => 0x0E, + .o => 0x0F, + .p => 0x10, + .q => 0x11, + .r => 0x12, + .s => 0x13, + .t => 0x14, + .u => 0x15, + .v => 0x16, + .w => 0x17, + .x => 0x18, + .y => 0x19, + .z => 0x1A, + else => 0, + }; + + if (val > 0) break :char val; + } + + // Otherwise, we don't care what modifiers we press we do this. + break :char @as(u8, switch (key) { .backspace => 0x7F, .enter => '\r', .tab => '\t', .escape => 0x1B, else => 0, - }), - - // Control only - @bitCast(u8, glfw.Mods{ .control = true }) => @as(u8, switch (key) { - .a => 0x01, - .b => 0x02, - .c => 0x03, - .d => 0x04, - .e => 0x05, - .f => 0x06, - .g => 0x07, - .h => 0x08, - .i => 0x09, - .j => 0x0A, - .k => 0x0B, - .l => 0x0C, - .m => 0x0D, - .n => 0x0E, - .o => 0x0F, - .p => 0x10, - .q => 0x11, - .r => 0x12, - .s => 0x13, - .t => 0x14, - .u => 0x15, - .v => 0x16, - .w => 0x17, - .x => 0x18, - .y => 0x19, - .z => 0x1A, - else => 0, - }), - - else => 0, + }); }; if (char > 0) { win.queueWrite(&[1]u8{char}) catch |err|