fix: normalized vaxis windows console input
This commit is contained in:
		
							parent
							
								
									0c7f19b5dd
								
							
						
					
					
						commit
						b73975328b
					
				
					 2 changed files with 17 additions and 13 deletions
				
			
		| 
						 | 
					@ -584,12 +584,6 @@ const BindingSet = struct {
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        const text = key_event.text;
 | 
					        const text = key_event.text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //normalize to lowercase if modifier is set
 | 
					 | 
				
			||||||
        const key = if (mods > 0 and key_event.key >= 'A' and key_event.key <= 'Z')
 | 
					 | 
				
			||||||
            key_event.key - 'A' + 'a'
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
            key_event.key;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (event == input.event.release)
 | 
					        if (event == input.event.release)
 | 
				
			||||||
            return self.process_key_release_event(key_event);
 | 
					            return self.process_key_release_event(key_event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -600,14 +594,14 @@ const BindingSet = struct {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        globals.last_key_event_timestamp_ms = timestamp;
 | 
					        globals.last_key_event_timestamp_ms = timestamp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (globals.current_sequence.items.len > 0 and input.is_modifier(key))
 | 
					        if (globals.current_sequence.items.len > 0 and input.is_modifier(key_event.key))
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try globals.current_sequence.append(globals_allocator, key_event);
 | 
					        try globals.current_sequence.append(globals_allocator, key_event);
 | 
				
			||||||
        if ((mods & ~(input.mod.shift | input.mod.caps_lock) == 0) and !input.is_non_input_key(key)) {
 | 
					        if ((mods & ~(input.mod.shift | input.mod.caps_lock) == 0) and !input.is_non_input_key(key_event.key)) {
 | 
				
			||||||
            var buf: [6]u8 = undefined;
 | 
					            var buf: [6]u8 = undefined;
 | 
				
			||||||
            const bytes = if (text.len > 0) text else text: {
 | 
					            const bytes = if (text.len > 0) text else text: {
 | 
				
			||||||
                const bytes = try input.ucs32_to_utf8(&[_]u32{key}, &buf);
 | 
					                const bytes = try input.ucs32_to_utf8(&[_]u32{key_event.key}, &buf);
 | 
				
			||||||
                break :text buf[0..bytes];
 | 
					                break :text buf[0..bytes];
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            try globals.current_sequence_egc.appendSlice(globals_allocator, bytes);
 | 
					            try globals.current_sequence_egc.appendSlice(globals_allocator, bytes);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,12 +151,12 @@ pub fn process_renderer_event(self: *Self, msg: []const u8) !void {
 | 
				
			||||||
    const event = std.mem.bytesAsValue(vaxis.Event, input_);
 | 
					    const event = std.mem.bytesAsValue(vaxis.Event, input_);
 | 
				
			||||||
    switch (event.*) {
 | 
					    switch (event.*) {
 | 
				
			||||||
        .key_press => |key__| {
 | 
					        .key_press => |key__| {
 | 
				
			||||||
            const key_ = filter_mods(key__);
 | 
					            const key_ = filter_mods(normalize_shifted_alphas(key__));
 | 
				
			||||||
            try self.sync_mod_state(key_.codepoint, key_.mods);
 | 
					            try self.sync_mod_state(key_.codepoint, key_.mods);
 | 
				
			||||||
            const cbor_msg = try self.fmtmsg(.{
 | 
					            const cbor_msg = try self.fmtmsg(.{
 | 
				
			||||||
                "I",
 | 
					                "I",
 | 
				
			||||||
                input.event.press,
 | 
					                input.event.press,
 | 
				
			||||||
                key_.codepoint,
 | 
					                key_.base_layout_codepoint orelse key_.codepoint,
 | 
				
			||||||
                key_.shifted_codepoint orelse key_.codepoint,
 | 
					                key_.shifted_codepoint orelse key_.codepoint,
 | 
				
			||||||
                text orelse "",
 | 
					                text orelse "",
 | 
				
			||||||
                @as(u8, @bitCast(key_.mods)),
 | 
					                @as(u8, @bitCast(key_.mods)),
 | 
				
			||||||
| 
						 | 
					@ -166,11 +166,11 @@ pub fn process_renderer_event(self: *Self, msg: []const u8) !void {
 | 
				
			||||||
            } else if (self.dispatch_input) |f| f(self.handler_ctx, cbor_msg);
 | 
					            } else if (self.dispatch_input) |f| f(self.handler_ctx, cbor_msg);
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        .key_release => |key__| {
 | 
					        .key_release => |key__| {
 | 
				
			||||||
            const key_ = filter_mods(key__);
 | 
					            const key_ = filter_mods(normalize_shifted_alphas(key__));
 | 
				
			||||||
            const cbor_msg = try self.fmtmsg(.{
 | 
					            const cbor_msg = try self.fmtmsg(.{
 | 
				
			||||||
                "I",
 | 
					                "I",
 | 
				
			||||||
                input.event.release,
 | 
					                input.event.release,
 | 
				
			||||||
                key_.codepoint,
 | 
					                key_.base_layout_codepoint orelse key_.codepoint,
 | 
				
			||||||
                key_.shifted_codepoint orelse key_.codepoint,
 | 
					                key_.shifted_codepoint orelse key_.codepoint,
 | 
				
			||||||
                text orelse "",
 | 
					                text orelse "",
 | 
				
			||||||
                @as(u8, @bitCast(key_.mods)),
 | 
					                @as(u8, @bitCast(key_.mods)),
 | 
				
			||||||
| 
						 | 
					@ -460,6 +460,16 @@ fn filter_mods(key_: vaxis.Key) vaxis.Key {
 | 
				
			||||||
    return key__;
 | 
					    return key__;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn normalize_shifted_alphas(key_: vaxis.Key) vaxis.Key {
 | 
				
			||||||
 | 
					    if (!key_.mods.shift) return key_;
 | 
				
			||||||
 | 
					    var key = key_;
 | 
				
			||||||
 | 
					    const shifted_codepoint = key.shifted_codepoint orelse key.codepoint;
 | 
				
			||||||
 | 
					    const base_layout_codepoint = key.base_layout_codepoint orelse key.codepoint;
 | 
				
			||||||
 | 
					    if (shifted_codepoint == base_layout_codepoint and 'a' <= shifted_codepoint and shifted_codepoint <= 'z')
 | 
				
			||||||
 | 
					        key.shifted_codepoint = shifted_codepoint - 0x20;
 | 
				
			||||||
 | 
					    return key;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Loop = struct {
 | 
					const Loop = struct {
 | 
				
			||||||
    tty: *vaxis.Tty,
 | 
					    tty: *vaxis.Tty,
 | 
				
			||||||
    vaxis: *vaxis.Vaxis,
 | 
					    vaxis: *vaxis.Vaxis,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue