mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 15:56:13 +03:00
Merge pull request #2088 from rockorager/main
fix(surface): account for padding in mouse pixel reports
This commit is contained in:
@ -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);
|
||||
},
|
||||
};
|
||||
|
@ -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)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user