selection math
This commit is contained in:
		
							parent
							
								
									2be2dc6ac7
								
							
						
					
					
						commit
						9d234eab11
					
				
							
								
								
									
										99
									
								
								main.zig
									
									
									
									
									
								
							
							
						
						
									
										99
									
								
								main.zig
									
									
									
									
									
								
							|  | @ -30,6 +30,24 @@ const Size = struct { | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | const Selection = struct { | ||||||
|  |     const Self = @This(); | ||||||
|  | 
 | ||||||
|  |     start: Point, | ||||||
|  |     end: Point, | ||||||
|  | 
 | ||||||
|  |     fn fromPoint(point: Point) Self { | ||||||
|  |         return .{ | ||||||
|  |             .start = point, | ||||||
|  |             .end = point, | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fn asBox(self: Self) Box { | ||||||
|  |         return Box.fromCorners(self.start, self.end); | ||||||
|  |     } | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| const Box = struct { | const Box = struct { | ||||||
|     const Self = @This(); |     const Self = @This(); | ||||||
| 
 | 
 | ||||||
|  | @ -74,8 +92,8 @@ const Box = struct { | ||||||
| 
 | 
 | ||||||
|         const pos = Point{.x = left, .y = top,}; |         const pos = Point{.x = left, .y = top,}; | ||||||
|         const extents = Size{ |         const extents = Size{ | ||||||
|             .width = right - left, |             .width = @intCast(u32, right - left), | ||||||
|             .height = bot - top, |             .height = @intCast(u32, bot - top), | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         return Self { |         return Self { | ||||||
|  | @ -370,8 +388,29 @@ const Seat = struct { | ||||||
|     pointer: ?struct { |     pointer: ?struct { | ||||||
|         pointer: *wl.Pointer, |         pointer: *wl.Pointer, | ||||||
|         button_state: ?wl.Pointer.ButtonState = null, |         button_state: ?wl.Pointer.ButtonState = null, | ||||||
|  |         selection: SelectionState = SelectionState.None(), | ||||||
|     } = null, |     } = null, | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |     const SelectionTag = enum { | ||||||
|  |         none, | ||||||
|  |         pre, | ||||||
|  |         updating, | ||||||
|  |         post, | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     const SelectionState = union(SelectionTag) { | ||||||
|  | 
 | ||||||
|  |         none: void, | ||||||
|  |         pre: Point, | ||||||
|  |         updating: Selection, | ||||||
|  |         post: Box, | ||||||
|  | 
 | ||||||
|  |         fn None() SelectionState { | ||||||
|  |             return SelectionState.none; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     fn init(self: *Self, state: *State.Init) void { |     fn init(self: *Self, state: *State.Init) void { | ||||||
|         self.state = state; |         self.state = state; | ||||||
| 
 | 
 | ||||||
|  | @ -381,8 +420,47 @@ const Seat = struct { | ||||||
| 
 | 
 | ||||||
|     fn pointerListener(pointer: *wl.Pointer, event: wl.Pointer.Event, self: *Self) void { |     fn pointerListener(pointer: *wl.Pointer, event: wl.Pointer.Event, self: *Self) void { | ||||||
|         _ = pointer; |         _ = pointer; | ||||||
|         _ = self; | 
 | ||||||
|         _ = event; |         std.debug.print("selection: {}\n", .{self.pointer.?.selection}); | ||||||
|  | 
 | ||||||
|  |         switch (event) { | ||||||
|  |             .enter => {}, | ||||||
|  |             .leave => {}, | ||||||
|  |             .motion => |motion| { | ||||||
|  |                 const x = motion.surface_x.toInt(); | ||||||
|  |                 const y = motion.surface_y.toInt(); | ||||||
|  | 
 | ||||||
|  |                 const end = Point{.x = x, .y = y,}; | ||||||
|  | 
 | ||||||
|  |                 switch (self.pointer.?.selection) { | ||||||
|  |                     .pre => { | ||||||
|  |                         self.pointer.?.selection = .{.updating = .{.start = end, .end = end}}; | ||||||
|  |                     }, | ||||||
|  |                     .updating => |*selection| { | ||||||
|  |                         selection.end = end; | ||||||
|  |                     }, | ||||||
|  |                     else => {}, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             .button => |button| { | ||||||
|  |                 switch (button.state) { | ||||||
|  |                     .pressed => { | ||||||
|  |                         self.pointer.?.selection = SelectionState{.pre = .{}}; | ||||||
|  |                     }, | ||||||
|  |                     .released => { | ||||||
|  |                         switch (self.pointer.?.selection) { | ||||||
|  |                             .updating => |selection| { | ||||||
|  |                                 const box = selection.asBox(); | ||||||
|  |                                 self.pointer.?.selection = .{.post = box}; | ||||||
|  |                             }, | ||||||
|  |                             else => {}, | ||||||
|  |                         } | ||||||
|  |                     }, | ||||||
|  |                     else => {}, | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             else => {}, | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -440,12 +518,13 @@ const Seat = struct { | ||||||
|                 if (self.keyboard.?.xkb) |xkb_| { |                 if (self.keyboard.?.xkb) |xkb_| { | ||||||
|                     const keysym = xkb.xkb_state_key_get_one_sym(xkb_.state, key.key + 8); |                     const keysym = xkb.xkb_state_key_get_one_sym(xkb_.state, key.key + 8); | ||||||
| 
 | 
 | ||||||
|                     const buf_len = 32; |                     // const buf_len = 32; | ||||||
|                     const buf = self.state.ally.alloc(u8, buf_len) catch null; |                     // const buf = self.state.ally.alloc(u8, buf_len) catch null; | ||||||
|                     if (buf) |buffer| { |                     // if (buf) |buffer| { | ||||||
|                         _ = xkb.xkb_keysym_get_name(keysym, @ptrCast([*c]u8, buffer), buf_len); |                     //     _ = xkb.xkb_keysym_get_name(keysym, @ptrCast([*c]u8, buffer), buf_len); | ||||||
|                         std.debug.print("key: {s} {s}\n", .{buffer, if (key.state == .pressed) "pressed" else "released"}); |                     //     std.debug.print("key: {s} {s}\n", .{buffer, if (key.state == .pressed) "pressed" else "released"}); | ||||||
|                     } |                     // } | ||||||
|  | 
 | ||||||
|                     switch (key.state) { |                     switch (key.state) { | ||||||
|                         .pressed => { |                         .pressed => { | ||||||
|                             switch (keysym) { |                             switch (keysym) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue