fix(surface): account for padding in mouse pixel reports

Padding was accounted for in cell reports, but not pixel reports. Update
inspector to report the pixel coordinates the terminal reports.
This commit is contained in:
Tim Culverhouse
2024-08-11 17:47:21 -05:00
parent 1cbeb264c9
commit 97db055b54
2 changed files with 22 additions and 14 deletions

View File

@ -2086,14 +2086,15 @@ fn mouseReport(
.sgr_pixels => {
// Final character to send in the CSI
const final: u8 = if (action == .release) 'm' else 'M';
const adjusted = self.posAdjusted(pos.x, pos.y);
// Response always is at least 4 chars, so this leaves the
// remainder for numbers which are very large...
var data: termio.Message.WriteReq.Small.Array = undefined;
const resp = try std.fmt.bufPrint(&data, "\x1B[<{d};{d};{d}{c}", .{
button_code,
@as(i32, @intFromFloat(@round(pos.x))),
@as(i32, @intFromFloat(@round(pos.y))),
@as(i32, @intFromFloat(@round(adjusted.x))),
@as(i32, @intFromFloat(@round(adjusted.y))),
final,
});
@ -3104,34 +3105,40 @@ pub fn colorSchemeCallback(self: *Surface, scheme: apprt.ColorScheme) !void {
if (report) try self.reportColorScheme();
}
pub fn posToViewport(self: Surface, xpos: f64, ypos: f64) terminal.point.Coordinate {
// xpos/ypos need to be adjusted for window padding
// (i.e. "window-padding-*" settings.
pub fn posAdjusted(self: Surface, xpos: f64, ypos: f64) struct { x: f64, y: f64 } {
const pad = if (self.config.window_padding_balance)
renderer.Padding.balanced(self.screen_size, self.grid_size, self.cell_size)
else
self.padding;
const xpos_adjusted: f64 = xpos - @as(f64, @floatFromInt(pad.left));
const ypos_adjusted: f64 = ypos - @as(f64, @floatFromInt(pad.top));
return .{
.x = xpos - @as(f64, @floatFromInt(pad.left)),
.y = ypos - @as(f64, @floatFromInt(pad.top)),
};
}
// xpos and ypos can be negative if while dragging, the user moves the
pub fn posToViewport(self: Surface, xpos: f64, ypos: f64) terminal.point.Coordinate {
// xpos/ypos need to be adjusted for window padding
// (i.e. "window-padding-*" settings.
const adjusted = self.posAdjusted(xpos, ypos);
// adjusted.x and adjusted.y can be negative if while dragging, the user moves the
// mouse off the surface. Likewise, they can be larger than our surface
// width if the user drags out of the surface positively.
return .{
.x = if (xpos_adjusted < 0) 0 else x: {
.x = if (adjusted.x < 0) 0 else x: {
// Our cell is the mouse divided by cell width
const cell_width: f64 = @floatFromInt(self.cell_size.width);
const x: usize = @intFromFloat(xpos_adjusted / cell_width);
const x: usize = @intFromFloat(adjusted.x / cell_width);
// Can be off the screen if the user drags it out, so max
// it out on our available columns
break :x @min(x, self.grid_size.columns - 1);
},
.y = if (ypos_adjusted < 0) 0 else y: {
.y = if (adjusted.y < 0) 0 else y: {
const cell_height: f64 = @floatFromInt(self.cell_size.height);
const y: usize = @intFromFloat(ypos_adjusted / cell_height);
const y: usize = @intFromFloat(adjusted.y / cell_height);
break :y @min(y, self.grid_size.rows - 1);
},
};

View File

@ -784,6 +784,7 @@ fn renderSizeWindow(self: *Inspector) void {
}
{
const adjusted = self.surface.posAdjusted(self.mouse.last_xpos, self.mouse.last_ypos);
cimgui.c.igTableNextRow(cimgui.c.ImGuiTableRowFlags_None, 0);
{
_ = cimgui.c.igTableSetColumnIndex(0);
@ -793,8 +794,8 @@ fn renderSizeWindow(self: *Inspector) void {
_ = cimgui.c.igTableSetColumnIndex(1);
cimgui.c.igText(
"(%dpx, %dpx)",
@as(u32, @intFromFloat(self.mouse.last_xpos)),
@as(u32, @intFromFloat(self.mouse.last_ypos)),
@as(i64, @intFromFloat(adjusted.x)),
@as(i64, @intFromFloat(adjusted.y)),
);
}
}