mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 16:56:09 +03:00
UTF-8 mouse reporting
This commit is contained in:
@ -822,15 +822,9 @@ fn mouseReport(
|
|||||||
.any => {},
|
.any => {},
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (self.terminal.modes.mouse_format) {
|
|
||||||
.x10 => {
|
|
||||||
// This format reports X/Y
|
// This format reports X/Y
|
||||||
const pos = self.cursorPosToPixels(unscaled_pos);
|
const pos = self.cursorPosToPixels(unscaled_pos);
|
||||||
const viewport_point = self.posToViewport(pos.xpos, pos.ypos);
|
const viewport_point = self.posToViewport(pos.xpos, pos.ypos);
|
||||||
if (viewport_point.x > 222 or viewport_point.y > 222) {
|
|
||||||
log.info("X10 mouse format can only encode X/Y up to 223", .{});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For button events, we only report if we moved cells
|
// For button events, we only report if we moved cells
|
||||||
if (self.terminal.modes.mouse_event == .button or
|
if (self.terminal.modes.mouse_event == .button or
|
||||||
@ -843,6 +837,7 @@ fn mouseReport(
|
|||||||
self.mouse.event_point = viewport_point;
|
self.mouse.event_point = viewport_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the code we'll actually write
|
||||||
const button_code: u8 = code: {
|
const button_code: u8 = code: {
|
||||||
var acc: u8 = if (action == .release or button == null)
|
var acc: u8 = if (action == .release or button == null)
|
||||||
3
|
3
|
||||||
@ -869,6 +864,13 @@ fn mouseReport(
|
|||||||
break :code acc;
|
break :code acc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
switch (self.terminal.modes.mouse_format) {
|
||||||
|
.x10 => {
|
||||||
|
if (viewport_point.x > 222 or viewport_point.y > 222) {
|
||||||
|
log.info("X10 mouse format can only encode X/Y up to 223", .{});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// + 1 below is because our x/y is 0-indexed and proto wants 1
|
// + 1 below is because our x/y is 0-indexed and proto wants 1
|
||||||
var buf = [_]u8{ '\x1b', '[', 'M', 0, 0, 0 };
|
var buf = [_]u8{ '\x1b', '[', 'M', 0, 0, 0 };
|
||||||
buf[3] = 32 + button_code;
|
buf[3] = 32 + button_code;
|
||||||
@ -877,6 +879,24 @@ fn mouseReport(
|
|||||||
try self.queueWrite(&buf);
|
try self.queueWrite(&buf);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.utf8 => {
|
||||||
|
// Maximum of 12 because at most we have 2 fully UTF-8 encoded chars
|
||||||
|
var buf: [12]u8 = undefined;
|
||||||
|
buf[0] = '\x1b';
|
||||||
|
buf[1] = '[';
|
||||||
|
buf[2] = 'M';
|
||||||
|
|
||||||
|
// The button code will always fit in a single u8
|
||||||
|
buf[3] = 32 + button_code;
|
||||||
|
|
||||||
|
// UTF-8 encode the x/y
|
||||||
|
var i: usize = 4;
|
||||||
|
i += try std.unicode.utf8Encode(@intCast(u21, 32 + viewport_point.x + 1), buf[i..]);
|
||||||
|
i += try std.unicode.utf8Encode(@intCast(u21, 32 + viewport_point.y + 1), buf[i..]);
|
||||||
|
|
||||||
|
try self.queueWrite(buf[0..i]);
|
||||||
|
},
|
||||||
|
|
||||||
else => @panic("TODO"),
|
else => @panic("TODO"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1454,6 +1474,8 @@ pub fn setMode(self: *Window, mode: terminal.Mode, enabled: bool) !void {
|
|||||||
.mouse_event_button => self.terminal.modes.mouse_event = if (enabled) .button else .none,
|
.mouse_event_button => self.terminal.modes.mouse_event = if (enabled) .button else .none,
|
||||||
.mouse_event_any => self.terminal.modes.mouse_event = if (enabled) .any else .none,
|
.mouse_event_any => self.terminal.modes.mouse_event = if (enabled) .any else .none,
|
||||||
|
|
||||||
|
.mouse_format_utf8 => self.terminal.modes.mouse_format = if (enabled) .utf8 else .x10,
|
||||||
|
|
||||||
else => if (enabled) log.warn("unimplemented mode: {}", .{mode}),
|
else => if (enabled) log.warn("unimplemented mode: {}", .{mode}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,9 +93,9 @@ pub const MouseEvents = enum(u3) {
|
|||||||
/// These are all mutually exclusive (hence in a single enum).
|
/// These are all mutually exclusive (hence in a single enum).
|
||||||
pub const MouseFormat = enum(u3) {
|
pub const MouseFormat = enum(u3) {
|
||||||
x10 = 0,
|
x10 = 0,
|
||||||
|
utf8 = 1, // 1005
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
utf8 = 1, // 1005
|
|
||||||
sgr = 2, // 1006
|
sgr = 2, // 1006
|
||||||
urxvt = 3, // 1015
|
urxvt = 3, // 1015
|
||||||
sgr_pixels = 4, // 1016
|
sgr_pixels = 4, // 1016
|
||||||
|
@ -80,6 +80,9 @@ pub const Mode = enum(u16) {
|
|||||||
/// to track mouse movement.
|
/// to track mouse movement.
|
||||||
mouse_event_any = 1003,
|
mouse_event_any = 1003,
|
||||||
|
|
||||||
|
/// Report mouse position in the utf8 format to support larger screens.
|
||||||
|
mouse_format_utf8 = 1005,
|
||||||
|
|
||||||
/// Alternate screen mode with save cursor and clear on enter.
|
/// Alternate screen mode with save cursor and clear on enter.
|
||||||
alt_screen_save_cursor_clear_enter = 1049,
|
alt_screen_save_cursor_clear_enter = 1049,
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user