feat: add libvaxis renderer
This commit is contained in:
		
							parent
							
								
									b15fa47f30
								
							
						
					
					
						commit
						1cd3cb17ce
					
				
					 32 changed files with 1559 additions and 516 deletions
				
			
		|  | @ -1,5 +1,6 @@ | |||
| const std = @import("std"); | ||||
| const cbor = @import("cbor"); | ||||
| const Plane = @import("renderer").Plane; | ||||
| const Buffer = @import("Buffer.zig"); | ||||
| const View = @import("View.zig"); | ||||
| const Selection = @import("Selection.zig"); | ||||
|  | @ -26,20 +27,20 @@ pub inline fn right_of(self: Self, other: Self) bool { | |||
|     return if (self.row > other.row) true else if (self.row == other.row and self.col > other.col) true else false; | ||||
| } | ||||
| 
 | ||||
| pub fn clamp_to_buffer(self: *Self, root: Buffer.Root) void { | ||||
| pub fn clamp_to_buffer(self: *Self, root: Buffer.Root, plane: Plane) void { | ||||
|     self.row = @min(self.row, root.lines() - 1); | ||||
|     self.col = @min(self.col, root.line_width(self.row) catch 0); | ||||
|     self.col = @min(self.col, root.line_width(self.row, plane) catch 0); | ||||
| } | ||||
| 
 | ||||
| fn follow_target(self: *Self, root: Buffer.Root) void { | ||||
|     self.col = @min(self.target, root.line_width(self.row) catch 0); | ||||
| fn follow_target(self: *Self, root: Buffer.Root, plane: Plane) void { | ||||
|     self.col = @min(self.target, root.line_width(self.row, plane) catch 0); | ||||
| } | ||||
| 
 | ||||
| fn move_right_no_target(self: *Self, root: Buffer.Root) !void { | ||||
| fn move_right_no_target(self: *Self, root: Buffer.Root, plane: Plane) !void { | ||||
|     const lines = root.lines(); | ||||
|     if (lines <= self.row) return error.Stop; | ||||
|     if (self.col < root.line_width(self.row) catch 0) { | ||||
|         _, const wcwidth, const offset = root.ecg_at(self.row, self.col) catch return error.Stop; | ||||
|     if (self.col < root.line_width(self.row, plane) catch 0) { | ||||
|         _, const wcwidth, const offset = root.ecg_at(self.row, self.col, plane) catch return error.Stop; | ||||
|         self.col += wcwidth - offset; | ||||
|     } else if (self.row < lines - 1) { | ||||
|         self.col = 0; | ||||
|  | @ -47,75 +48,75 @@ fn move_right_no_target(self: *Self, root: Buffer.Root) !void { | |||
|     } else return error.Stop; | ||||
| } | ||||
| 
 | ||||
| pub fn move_right(self: *Self, root: Buffer.Root) !void { | ||||
|     try self.move_right_no_target(root); | ||||
| pub fn move_right(self: *Self, root: Buffer.Root, plane: Plane) !void { | ||||
|     try self.move_right_no_target(root, plane); | ||||
|     self.target = self.col; | ||||
| } | ||||
| 
 | ||||
| fn move_left_no_target(self: *Self, root: Buffer.Root) !void { | ||||
| fn move_left_no_target(self: *Self, root: Buffer.Root, plane: Plane) !void { | ||||
|     if (self.col == 0) { | ||||
|         if (self.row == 0) return error.Stop; | ||||
|         self.row -= 1; | ||||
|         self.col = root.line_width(self.row) catch 0; | ||||
|         self.col = root.line_width(self.row, plane) catch 0; | ||||
|     } else { | ||||
|         _, const wcwidth, _ = root.ecg_at(self.row, self.col - 1) catch return error.Stop; | ||||
|         _, const wcwidth, _ = root.ecg_at(self.row, self.col - 1, plane) catch return error.Stop; | ||||
|         if (self.col > wcwidth) self.col -= wcwidth else self.col = 0; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn move_left(self: *Self, root: Buffer.Root) !void { | ||||
|     try self.move_left_no_target(root); | ||||
| pub fn move_left(self: *Self, root: Buffer.Root, plane: Plane) !void { | ||||
|     try self.move_left_no_target(root, plane); | ||||
|     self.target = self.col; | ||||
| } | ||||
| 
 | ||||
| pub fn move_up(self: *Self, root: Buffer.Root) !void { | ||||
| pub fn move_up(self: *Self, root: Buffer.Root, plane: Plane) !void { | ||||
|     if (self.row > 0) { | ||||
|         self.row -= 1; | ||||
|         self.follow_target(root); | ||||
|         self.move_left_no_target(root) catch return; | ||||
|         try self.move_right_no_target(root); | ||||
|         self.follow_target(root, plane); | ||||
|         self.move_left_no_target(root, plane) catch return; | ||||
|         try self.move_right_no_target(root, plane); | ||||
|     } else return error.Stop; | ||||
| } | ||||
| 
 | ||||
| pub fn move_down(self: *Self, root: Buffer.Root) !void { | ||||
| pub fn move_down(self: *Self, root: Buffer.Root, plane: Plane) !void { | ||||
|     if (self.row < root.lines() - 1) { | ||||
|         self.row += 1; | ||||
|         self.follow_target(root); | ||||
|         self.move_left_no_target(root) catch return; | ||||
|         try self.move_right_no_target(root); | ||||
|         self.follow_target(root, plane); | ||||
|         self.move_left_no_target(root, plane) catch return; | ||||
|         try self.move_right_no_target(root, plane); | ||||
|     } else return error.Stop; | ||||
| } | ||||
| 
 | ||||
| pub fn move_page_up(self: *Self, root: Buffer.Root, view: *const View) void { | ||||
| pub fn move_page_up(self: *Self, root: Buffer.Root, view: *const View, plane: Plane) void { | ||||
|     self.row = if (self.row > view.rows) self.row - view.rows else 0; | ||||
|     self.follow_target(root); | ||||
|     self.move_left_no_target(root) catch return; | ||||
|     self.move_right_no_target(root) catch return; | ||||
|     self.follow_target(root, plane); | ||||
|     self.move_left_no_target(root, plane) catch return; | ||||
|     self.move_right_no_target(root, plane) catch return; | ||||
| } | ||||
| 
 | ||||
| pub fn move_page_down(self: *Self, root: Buffer.Root, view: *const View) void { | ||||
| pub fn move_page_down(self: *Self, root: Buffer.Root, view: *const View, plane: Plane) void { | ||||
|     if (root.lines() < view.rows) { | ||||
|         self.move_buffer_last(root); | ||||
|         self.move_buffer_last(root, plane); | ||||
|     } else if (self.row < root.lines() - view.rows - 1) { | ||||
|         self.row += view.rows; | ||||
|     } else self.row = root.lines() - 1; | ||||
|     self.follow_target(root); | ||||
|     self.move_left_no_target(root) catch return; | ||||
|     self.move_right_no_target(root) catch return; | ||||
|     self.follow_target(root, plane); | ||||
|     self.move_left_no_target(root, plane) catch return; | ||||
|     self.move_right_no_target(root, plane) catch return; | ||||
| } | ||||
| 
 | ||||
| pub fn move_to(self: *Self, root: Buffer.Root, row: usize, col: usize) !void { | ||||
| pub fn move_to(self: *Self, root: Buffer.Root, row: usize, col: usize, plane: Plane) !void { | ||||
|     if (row < root.lines()) { | ||||
|         self.row = row; | ||||
|         self.col = @min(col, root.line_width(self.row) catch return error.Stop); | ||||
|         self.col = @min(col, root.line_width(self.row, plane) catch return error.Stop); | ||||
|         self.target = self.col; | ||||
|     } else return error.Stop; | ||||
| } | ||||
| 
 | ||||
| pub fn move_abs(self: *Self, root: Buffer.Root, v: *View, y: usize, x: usize) !void { | ||||
| pub fn move_abs(self: *Self, root: Buffer.Root, v: *View, y: usize, x: usize, plane: Plane) !void { | ||||
|     self.row = v.row + y; | ||||
|     self.col = v.col + x; | ||||
|     self.clamp_to_buffer(root); | ||||
|     self.clamp_to_buffer(root, plane); | ||||
|     self.target = self.col; | ||||
| } | ||||
| 
 | ||||
|  | @ -124,8 +125,8 @@ pub fn move_begin(self: *Self) void { | |||
|     self.target = self.col; | ||||
| } | ||||
| 
 | ||||
| pub fn move_end(self: *Self, root: Buffer.Root) void { | ||||
|     if (self.row < root.lines()) self.col = root.line_width(self.row) catch 0; | ||||
| pub fn move_end(self: *Self, root: Buffer.Root, plane: Plane) void { | ||||
|     if (self.row < root.lines()) self.col = root.line_width(self.row, plane) catch 0; | ||||
|     self.target = std.math.maxInt(u32); | ||||
| } | ||||
| 
 | ||||
|  | @ -135,32 +136,32 @@ pub fn move_buffer_begin(self: *Self) void { | |||
|     self.target = 0; | ||||
| } | ||||
| 
 | ||||
| pub fn move_buffer_end(self: *Self, root: Buffer.Root) void { | ||||
| pub fn move_buffer_end(self: *Self, root: Buffer.Root, plane: Plane) void { | ||||
|     self.row = root.lines() - 1; | ||||
|     self.move_end(root); | ||||
|     self.move_end(root, plane); | ||||
|     if (self.col == 0) self.target = 0; | ||||
| } | ||||
| 
 | ||||
| fn move_buffer_first(self: *Self, root: Buffer.Root) void { | ||||
| fn move_buffer_first(self: *Self, root: Buffer.Root, plane: Plane) void { | ||||
|     self.row = 0; | ||||
|     self.follow_target(root); | ||||
|     self.follow_target(root, plane); | ||||
| } | ||||
| 
 | ||||
| fn move_buffer_last(self: *Self, root: Buffer.Root) void { | ||||
| fn move_buffer_last(self: *Self, root: Buffer.Root, plane: Plane) void { | ||||
|     self.row = root.lines() - 1; | ||||
|     self.follow_target(root); | ||||
|     self.follow_target(root, plane); | ||||
| } | ||||
| 
 | ||||
| fn is_at_begin(self: *const Self) bool { | ||||
|     return self.col == 0; | ||||
| } | ||||
| 
 | ||||
| fn is_at_end(self: *const Self, root: Buffer.Root) bool { | ||||
|     return if (self.row < root.lines()) self.col == root.line_width(self.row) catch 0 else true; | ||||
| fn is_at_end(self: *const Self, root: Buffer.Root, plane: Plane) bool { | ||||
|     return if (self.row < root.lines()) self.col == root.line_width(self.row, plane) catch 0 else true; | ||||
| } | ||||
| 
 | ||||
| pub fn test_at(self: *const Self, root: Buffer.Root, pred: *const fn (c: []const u8) bool) bool { | ||||
|     return root.test_at(pred, self.row, self.col); | ||||
| pub fn test_at(self: *const Self, root: Buffer.Root, pred: *const fn (c: []const u8) bool, plane: Plane) bool { | ||||
|     return root.test_at(pred, self.row, self.col, plane); | ||||
| } | ||||
| 
 | ||||
| pub fn write(self: *const Self, writer: Buffer.MetaWriter) !void { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue