mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-15 08:16:13 +03:00
core: surface compiles
This commit is contained in:
110
src/Surface.zig
110
src/Surface.zig
@ -1359,9 +1359,8 @@ pub fn keyCallback(
|
|||||||
self.renderer_state.mutex.lock();
|
self.renderer_state.mutex.lock();
|
||||||
defer self.renderer_state.mutex.unlock();
|
defer self.renderer_state.mutex.unlock();
|
||||||
var screen = self.io.terminal.screen;
|
var screen = self.io.terminal.screen;
|
||||||
const sel = sel: {
|
const sel = if (screen.selection) |*sel| sel else break :adjust_selection;
|
||||||
const old_sel = screen.selection orelse break :adjust_selection;
|
sel.adjust(&screen, switch (event.key) {
|
||||||
break :sel old_sel.adjust(&screen, switch (event.key) {
|
|
||||||
.left => .left,
|
.left => .left,
|
||||||
.right => .right,
|
.right => .right,
|
||||||
.up => .up,
|
.up => .up,
|
||||||
@ -1372,28 +1371,27 @@ pub fn keyCallback(
|
|||||||
.end => .end,
|
.end => .end,
|
||||||
else => break :adjust_selection,
|
else => break :adjust_selection,
|
||||||
});
|
});
|
||||||
};
|
|
||||||
|
|
||||||
// Silently consume key releases.
|
// Silently consume key releases.
|
||||||
if (event.action != .press and event.action != .repeat) return .consumed;
|
if (event.action != .press and event.action != .repeat) return .consumed;
|
||||||
|
|
||||||
// If the selection endpoint is outside of the current viewpoint,
|
// If the selection endpoint is outside of the current viewpoint,
|
||||||
// scroll it in to view.
|
// scroll it in to view.
|
||||||
scroll: {
|
// TODO(paged-terminal)
|
||||||
const viewport_max = terminal.Screen.RowIndexTag.viewport.maxLen(&screen) - 1;
|
// scroll: {
|
||||||
const viewport_end = screen.viewport + viewport_max;
|
// const viewport_max = terminal.Screen.RowIndexTag.viewport.maxLen(&screen) - 1;
|
||||||
const delta: isize = if (sel.end.y < screen.viewport)
|
// const viewport_end = screen.viewport + viewport_max;
|
||||||
@intCast(screen.viewport)
|
// const delta: isize = if (sel.end.y < screen.viewport)
|
||||||
else if (sel.end.y > viewport_end)
|
// @intCast(screen.viewport)
|
||||||
@intCast(viewport_end)
|
// else if (sel.end.y > viewport_end)
|
||||||
else
|
// @intCast(viewport_end)
|
||||||
break :scroll;
|
// else
|
||||||
const start_y: isize = @intCast(sel.end.y);
|
// break :scroll;
|
||||||
try self.io.terminal.scrollViewport(.{ .delta = start_y - delta });
|
// const start_y: isize = @intCast(sel.end.y);
|
||||||
}
|
// try self.io.terminal.scrollViewport(.{ .delta = start_y - delta });
|
||||||
|
// }
|
||||||
|
|
||||||
// Change our selection and queue a render so its shown.
|
// Queue a render so its shown
|
||||||
self.setSelection(sel);
|
|
||||||
try self.queueRender();
|
try self.queueRender();
|
||||||
return .consumed;
|
return .consumed;
|
||||||
}
|
}
|
||||||
@ -2139,17 +2137,20 @@ pub fn mouseButtonCallback(
|
|||||||
{
|
{
|
||||||
const pos = try self.rt_surface.getCursorPos();
|
const pos = try self.rt_surface.getCursorPos();
|
||||||
const point = self.posToViewport(pos.x, pos.y);
|
const point = self.posToViewport(pos.x, pos.y);
|
||||||
const cell = self.renderer_state.terminal.screen.getCell(
|
// TODO(paged-terminal)
|
||||||
.viewport,
|
// const cell = self.renderer_state.terminal.screen.getCell(
|
||||||
point.y,
|
// .viewport,
|
||||||
point.x,
|
// point.y,
|
||||||
);
|
// point.x,
|
||||||
|
// );
|
||||||
|
|
||||||
insp.cell = .{ .selected = .{
|
insp.cell = .{
|
||||||
|
.selected = .{
|
||||||
.row = point.y,
|
.row = point.y,
|
||||||
.col = point.x,
|
.col = point.x,
|
||||||
.cell = cell,
|
//.cell = cell,
|
||||||
} };
|
},
|
||||||
|
};
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2250,15 +2251,19 @@ pub fn mouseButtonCallback(
|
|||||||
// Moving always resets the click count so that we don't highlight.
|
// Moving always resets the click count so that we don't highlight.
|
||||||
self.mouse.left_click_count = 0;
|
self.mouse.left_click_count = 0;
|
||||||
|
|
||||||
self.renderer_state.mutex.lock();
|
// TODO(paged-terminal)
|
||||||
defer self.renderer_state.mutex.unlock();
|
// self.renderer_state.mutex.lock();
|
||||||
try self.clickMoveCursor(self.mouse.left_click_point);
|
// defer self.renderer_state.mutex.unlock();
|
||||||
|
// try self.clickMoveCursor(self.mouse.left_click_point);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For left button clicks we always record some information for
|
// For left button clicks we always record some information for
|
||||||
// selection/highlighting purposes.
|
// selection/highlighting purposes.
|
||||||
if (button == .left and action == .press) {
|
if (button == .left and action == .press) click: {
|
||||||
|
// TODO(paged-terminal)
|
||||||
|
if (true) break :click;
|
||||||
|
|
||||||
self.renderer_state.mutex.lock();
|
self.renderer_state.mutex.lock();
|
||||||
defer self.renderer_state.mutex.unlock();
|
defer self.renderer_state.mutex.unlock();
|
||||||
|
|
||||||
@ -2429,6 +2434,9 @@ fn linkAtPos(
|
|||||||
DerivedConfig.Link,
|
DerivedConfig.Link,
|
||||||
terminal.Selection,
|
terminal.Selection,
|
||||||
} {
|
} {
|
||||||
|
// TODO(paged-terminal)
|
||||||
|
if (true) return null;
|
||||||
|
|
||||||
// If we have no configured links we can save a lot of work
|
// If we have no configured links we can save a lot of work
|
||||||
if (self.config.links.len == 0) return null;
|
if (self.config.links.len == 0) return null;
|
||||||
|
|
||||||
@ -2536,7 +2544,8 @@ pub fn cursorPosCallback(
|
|||||||
if (self.inspector) |insp| {
|
if (self.inspector) |insp| {
|
||||||
insp.mouse.last_xpos = pos.x;
|
insp.mouse.last_xpos = pos.x;
|
||||||
insp.mouse.last_ypos = pos.y;
|
insp.mouse.last_ypos = pos.y;
|
||||||
insp.mouse.last_point = pos_vp.toScreen(&self.io.terminal.screen);
|
// TODO(paged-terminal)
|
||||||
|
//insp.mouse.last_point = pos_vp.toScreen(&self.io.terminal.screen);
|
||||||
try self.queueRender();
|
try self.queueRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2590,16 +2599,17 @@ pub fn cursorPosCallback(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert to points
|
// Convert to points
|
||||||
const screen_point = pos_vp.toScreen(&self.io.terminal.screen);
|
// TODO(paged-terminal)
|
||||||
|
// const screen_point = pos_vp.toScreen(&self.io.terminal.screen);
|
||||||
// Handle dragging depending on click count
|
//
|
||||||
switch (self.mouse.left_click_count) {
|
// // Handle dragging depending on click count
|
||||||
1 => self.dragLeftClickSingle(screen_point, pos.x),
|
// switch (self.mouse.left_click_count) {
|
||||||
2 => self.dragLeftClickDouble(screen_point),
|
// 1 => self.dragLeftClickSingle(screen_point, pos.x),
|
||||||
3 => self.dragLeftClickTriple(screen_point),
|
// 2 => self.dragLeftClickDouble(screen_point),
|
||||||
0 => unreachable, // handled above
|
// 3 => self.dragLeftClickTriple(screen_point),
|
||||||
else => unreachable,
|
// 0 => unreachable, // handled above
|
||||||
}
|
// else => unreachable,
|
||||||
|
// }
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3035,7 +3045,7 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool
|
|||||||
.reset => {
|
.reset => {
|
||||||
self.renderer_state.mutex.lock();
|
self.renderer_state.mutex.lock();
|
||||||
defer self.renderer_state.mutex.unlock();
|
defer self.renderer_state.mutex.unlock();
|
||||||
self.renderer_state.terminal.fullReset(self.alloc);
|
self.renderer_state.terminal.fullReset();
|
||||||
},
|
},
|
||||||
|
|
||||||
.copy_to_clipboard => {
|
.copy_to_clipboard => {
|
||||||
@ -3185,20 +3195,14 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool
|
|||||||
break :write_scrollback_file;
|
break :write_scrollback_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
const history_max = terminal.Screen.RowIndexTag.history.maxLen(
|
|
||||||
&self.io.terminal.screen,
|
|
||||||
);
|
|
||||||
|
|
||||||
// We only dump history if we have history. We still keep
|
// We only dump history if we have history. We still keep
|
||||||
// the file and write the empty file to the pty so that this
|
// the file and write the empty file to the pty so that this
|
||||||
// command always works on the primary screen.
|
// command always works on the primary screen.
|
||||||
if (history_max > 0) {
|
// TODO(paged-terminal): unwrap
|
||||||
try self.io.terminal.screen.dumpString(file.writer(), .{
|
try self.io.terminal.screen.dumpString(
|
||||||
.start = .{ .history = 0 },
|
file.writer(),
|
||||||
.end = .{ .history = history_max -| 1 },
|
.{ .history = .{} },
|
||||||
.unwrap = true,
|
);
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the final path
|
// Get the final path
|
||||||
|
@ -70,6 +70,7 @@ pub const Point = union(Tag) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// A point in the terminal that is always in the viewport area.
|
/// A point in the terminal that is always in the viewport area.
|
||||||
|
/// TODO(paged-terminal): remove
|
||||||
pub const Viewport = struct {
|
pub const Viewport = struct {
|
||||||
x: usize = 0,
|
x: usize = 0,
|
||||||
y: usize = 0,
|
y: usize = 0,
|
||||||
@ -78,9 +79,3 @@ pub const Viewport = struct {
|
|||||||
return self.x == other.x and self.y == other.y;
|
return self.x == other.x and self.y == other.y;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A point in the terminal that is in relation to the entire screen.
|
|
||||||
pub const Screen = struct {
|
|
||||||
x: usize = 0,
|
|
||||||
y: usize = 0,
|
|
||||||
};
|
|
||||||
|
Reference in New Issue
Block a user