mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-17 17:26:09 +03:00
window detects double and triple clicks
This commit is contained in:
@ -75,6 +75,7 @@ renderer_thr: std.Thread,
|
|||||||
|
|
||||||
/// Mouse state.
|
/// Mouse state.
|
||||||
mouse: Mouse,
|
mouse: Mouse,
|
||||||
|
mouse_interval: u64,
|
||||||
|
|
||||||
/// The terminal IO handler.
|
/// The terminal IO handler.
|
||||||
io: termio.Impl,
|
io: termio.Impl,
|
||||||
@ -117,6 +118,12 @@ const Mouse = struct {
|
|||||||
left_click_xpos: f64 = 0,
|
left_click_xpos: f64 = 0,
|
||||||
left_click_ypos: f64 = 0,
|
left_click_ypos: f64 = 0,
|
||||||
|
|
||||||
|
/// The count of clicks to count double and triple clicks and so on.
|
||||||
|
/// The left click time was the last time the left click was done. This
|
||||||
|
/// is always set on the first left click.
|
||||||
|
left_click_count: u8 = 0,
|
||||||
|
left_click_time: std.time.Instant = undefined,
|
||||||
|
|
||||||
/// The last x/y sent for mouse reports.
|
/// The last x/y sent for mouse reports.
|
||||||
event_point: terminal.point.Viewport = .{},
|
event_point: terminal.point.Viewport = .{},
|
||||||
};
|
};
|
||||||
@ -388,6 +395,7 @@ pub fn create(alloc: Allocator, app: *App, config: *const Config) !*Window {
|
|||||||
},
|
},
|
||||||
.renderer_thr = undefined,
|
.renderer_thr = undefined,
|
||||||
.mouse = .{},
|
.mouse = .{},
|
||||||
|
.mouse_interval = 500 * 1_000_000, // 500ms
|
||||||
.io = io,
|
.io = io,
|
||||||
.io_thread = io_thread,
|
.io_thread = io_thread,
|
||||||
.io_thr = undefined,
|
.io_thr = undefined,
|
||||||
@ -1525,11 +1533,40 @@ fn mouseButtonCallback(
|
|||||||
win.mouse.left_click_xpos = pos.xpos;
|
win.mouse.left_click_xpos = pos.xpos;
|
||||||
win.mouse.left_click_ypos = pos.ypos;
|
win.mouse.left_click_ypos = pos.ypos;
|
||||||
|
|
||||||
// Selection is always cleared
|
// Setup our click counter and timer
|
||||||
if (win.io.terminal.selection != null) {
|
if (std.time.Instant.now()) |now| {
|
||||||
win.io.terminal.selection = null;
|
// If we have mouse clicks, then we check if the time elapsed
|
||||||
win.queueRender() catch |err|
|
// is less than and our interval and if so, increase the count.
|
||||||
log.err("error scheduling render in mouseButtinCallback err={}", .{err});
|
if (win.mouse.left_click_count > 0) {
|
||||||
|
const since = now.since(win.mouse.left_click_time);
|
||||||
|
if (since > win.mouse_interval) {
|
||||||
|
win.mouse.left_click_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
win.mouse.left_click_time = now;
|
||||||
|
win.mouse.left_click_count += 1;
|
||||||
|
|
||||||
|
// We only support up to triple-clicks.
|
||||||
|
if (win.mouse.left_click_count > 3) win.mouse.left_click_count = 1;
|
||||||
|
} else |err| {
|
||||||
|
win.mouse.left_click_count = 1;
|
||||||
|
log.err("error reading time, mouse multi-click won't work err={}", .{err});
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (win.mouse.left_click_count) {
|
||||||
|
// First mouse click, clear selection
|
||||||
|
1 => if (win.io.terminal.selection != null) {
|
||||||
|
win.io.terminal.selection = null;
|
||||||
|
win.queueRender() catch |err|
|
||||||
|
log.err("error scheduling render in mouseButtinCallback err={}", .{err});
|
||||||
|
},
|
||||||
|
|
||||||
|
2 => log.info("DoublE CLICk", .{}),
|
||||||
|
3 => log.info("TRIPLE CLICK", .{}),
|
||||||
|
|
||||||
|
// We should be bounded by 1 to 3
|
||||||
|
else => unreachable,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user