core: surface compiles

This commit is contained in:
Mitchell Hashimoto
2024-03-08 21:00:15 -08:00
parent 4c4d5f5a89
commit d966e74f45
2 changed files with 70 additions and 71 deletions

View File

@ -1359,41 +1359,39 @@ pub fn keyCallback(
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
var screen = self.io.terminal.screen;
const sel = sel: {
const old_sel = screen.selection orelse break :adjust_selection;
break :sel old_sel.adjust(&screen, switch (event.key) {
.left => .left,
.right => .right,
.up => .up,
.down => .down,
.page_up => .page_up,
.page_down => .page_down,
.home => .home,
.end => .end,
else => break :adjust_selection,
});
};
const sel = if (screen.selection) |*sel| sel else break :adjust_selection;
sel.adjust(&screen, switch (event.key) {
.left => .left,
.right => .right,
.up => .up,
.down => .down,
.page_up => .page_up,
.page_down => .page_down,
.home => .home,
.end => .end,
else => break :adjust_selection,
});
// Silently consume key releases.
if (event.action != .press and event.action != .repeat) return .consumed;
// If the selection endpoint is outside of the current viewpoint,
// scroll it in to view.
scroll: {
const viewport_max = terminal.Screen.RowIndexTag.viewport.maxLen(&screen) - 1;
const viewport_end = screen.viewport + viewport_max;
const delta: isize = if (sel.end.y < screen.viewport)
@intCast(screen.viewport)
else if (sel.end.y > viewport_end)
@intCast(viewport_end)
else
break :scroll;
const start_y: isize = @intCast(sel.end.y);
try self.io.terminal.scrollViewport(.{ .delta = start_y - delta });
}
// TODO(paged-terminal)
// scroll: {
// const viewport_max = terminal.Screen.RowIndexTag.viewport.maxLen(&screen) - 1;
// const viewport_end = screen.viewport + viewport_max;
// const delta: isize = if (sel.end.y < screen.viewport)
// @intCast(screen.viewport)
// else if (sel.end.y > viewport_end)
// @intCast(viewport_end)
// else
// break :scroll;
// 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.
self.setSelection(sel);
// Queue a render so its shown
try self.queueRender();
return .consumed;
}
@ -2139,17 +2137,20 @@ pub fn mouseButtonCallback(
{
const pos = try self.rt_surface.getCursorPos();
const point = self.posToViewport(pos.x, pos.y);
const cell = self.renderer_state.terminal.screen.getCell(
.viewport,
point.y,
point.x,
);
// TODO(paged-terminal)
// const cell = self.renderer_state.terminal.screen.getCell(
// .viewport,
// point.y,
// point.x,
// );
insp.cell = .{ .selected = .{
.row = point.y,
.col = point.x,
.cell = cell,
} };
insp.cell = .{
.selected = .{
.row = point.y,
.col = point.x,
//.cell = cell,
},
};
return;
}
}
@ -2250,15 +2251,19 @@ pub fn mouseButtonCallback(
// Moving always resets the click count so that we don't highlight.
self.mouse.left_click_count = 0;
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
try self.clickMoveCursor(self.mouse.left_click_point);
// TODO(paged-terminal)
// self.renderer_state.mutex.lock();
// defer self.renderer_state.mutex.unlock();
// try self.clickMoveCursor(self.mouse.left_click_point);
return;
}
// For left button clicks we always record some information for
// 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();
defer self.renderer_state.mutex.unlock();
@ -2429,6 +2434,9 @@ fn linkAtPos(
DerivedConfig.Link,
terminal.Selection,
} {
// TODO(paged-terminal)
if (true) return null;
// If we have no configured links we can save a lot of work
if (self.config.links.len == 0) return null;
@ -2536,7 +2544,8 @@ pub fn cursorPosCallback(
if (self.inspector) |insp| {
insp.mouse.last_xpos = pos.x;
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();
}
@ -2590,16 +2599,17 @@ pub fn cursorPosCallback(
}
// Convert to points
const screen_point = pos_vp.toScreen(&self.io.terminal.screen);
// Handle dragging depending on click count
switch (self.mouse.left_click_count) {
1 => self.dragLeftClickSingle(screen_point, pos.x),
2 => self.dragLeftClickDouble(screen_point),
3 => self.dragLeftClickTriple(screen_point),
0 => unreachable, // handled above
else => unreachable,
}
// 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) {
// 1 => self.dragLeftClickSingle(screen_point, pos.x),
// 2 => self.dragLeftClickDouble(screen_point),
// 3 => self.dragLeftClickTriple(screen_point),
// 0 => unreachable, // handled above
// else => unreachable,
// }
return;
}
@ -3035,7 +3045,7 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool
.reset => {
self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock();
self.renderer_state.terminal.fullReset(self.alloc);
self.renderer_state.terminal.fullReset();
},
.copy_to_clipboard => {
@ -3185,20 +3195,14 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool
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
// the file and write the empty file to the pty so that this
// command always works on the primary screen.
if (history_max > 0) {
try self.io.terminal.screen.dumpString(file.writer(), .{
.start = .{ .history = 0 },
.end = .{ .history = history_max -| 1 },
.unwrap = true,
});
}
// TODO(paged-terminal): unwrap
try self.io.terminal.screen.dumpString(
file.writer(),
.{ .history = .{} },
);
}
// Get the final path

View File

@ -70,6 +70,7 @@ pub const Point = union(Tag) {
};
/// A point in the terminal that is always in the viewport area.
/// TODO(paged-terminal): remove
pub const Viewport = struct {
x: usize = 0,
y: usize = 0,
@ -78,9 +79,3 @@ pub const Viewport = struct {
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,
};