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(); 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, .down => .down,
.down => .down, .page_up => .page_up,
.page_up => .page_up, .page_down => .page_down,
.page_down => .page_down, .home => .home,
.home => .home, .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 = .{
.row = point.y, .selected = .{
.col = point.x, .row = point.y,
.cell = cell, .col = point.x,
} }; //.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

View File

@ -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,
};