resizing and movement prototype done

This commit is contained in:
Harrison DiAmbrosio 2025-10-24 21:47:15 -04:00
parent 36b89b04d0
commit 23ef0049f7
2 changed files with 281 additions and 57 deletions

View file

@ -28,8 +28,15 @@ hold_begin: wl.Listener(*wlr.Pointer.event.HoldBegin) = .init(handleHoldBegin),
hold_end: wl.Listener(*wlr.Pointer.event.HoldEnd) = .init(handleHoldEnd),
mode: enum { passthrough, move, resize } = .passthrough,
// Drag information
selected_view: ?*View = null,
grab_box: wlr.Box = undefined,
drag_start_x: c_int = 0,
drag_start_y: c_int = 0,
drag_view_offset_x: c_int = 0,
drag_view_offset_y: c_int = 0,
drag_view_width: c_int = 0,
drag_view_height: c_int = 0,
pub fn init(self: *Cursor) void {
errdefer Utils.oomPanic();
@ -63,16 +70,6 @@ pub fn deinit(self: *Cursor) void {
self.frame.link.remove();
}
pub fn moveView(self: *Cursor, view: *View, _: *wlr.Pointer.event.Button) void {
self.mode = .move;
self.selected_view = view;
}
pub fn resizeView(self: *Cursor, view: *View, _: *wlr.Pointer.event.Button) void {
self.mode = .resize;
self.selected_view = view;
}
pub fn processCursorMotion(self: *Cursor, time_msec: u32) void {
switch (self.mode) {
.passthrough => {
@ -86,55 +83,22 @@ pub fn processCursorMotion(self: *Cursor, time_msec: u32) void {
},
.move => {
const view = self.selected_view.?;
view.scene_tree.node.setPosition(
@as(i32, @intFromFloat(self.wlr_cursor.x)),
@as(i32, @intFromFloat(self.wlr_cursor.y))
std.math.clamp(@as(c_int, @intFromFloat(self.wlr_cursor.x)) - self.drag_view_offset_x, 0, std.math.maxInt(u32)),
std.math.clamp(@as(c_int, @intFromFloat(self.wlr_cursor.y)) - self.drag_view_offset_y, 0, std.math.maxInt(u32))
);
},
.resize => {
// Fix this resize
//
// REDOING RESIZING AND MOVING TOPLEVELS
// REDOING RESIZING AND MOVING TOPLEVELS
// REDOING RESIZING AND MOVING TOPLEVELS
// REDOING RESIZING AND MOVING TOPLEVELS
//
// const view = self.grabbed_view.?;
// const border_x = @as(i32, @intFromFloat(self.wlr_cursor.x - self.grab_x));
// const border_y = @as(i32, @intFromFloat(self.wlr_cursor.y - self.grab_y));
//
// var new_left = self.grab_box.x;
// var new_right = self.grab_box.x + self.grab_box.width;
// var new_top = self.grab_box.y;
// var new_bottom = self.grab_box.y + self.grab_box.height;
//
// if (self.resize_edges.top) {
// new_top = border_y;
// if (new_top >= new_bottom)
// new_top = new_bottom - 1;
// } else if (self.resize_edges.bottom) {
// new_bottom = border_y;
// if (new_bottom <= new_top)
// new_bottom = new_top + 1;
// }
//
// if (self.resize_edges.left) {
// new_left = border_x;
// if (new_left >= new_right)
// new_left = new_right - 1;
// } else if (self.resize_edges.right) {
// new_right = border_x;
// if (new_right <= new_left)
// new_right = new_left + 1;
// }
//
// // view.x = new_left - view.xdg_toplevel.base.geometry.x;
// // view.y = new_top - view.xdg_toplevel.base.geometry.y;
// view.scene_tree.node.setPosition(view.geometry.x, view.geometry.y);
//
// const new_width = new_right - new_left;
// const new_height = new_bottom - new_top;
// _ = view.xdg_toplevel.setSize(new_width, new_height);
const view = self.selected_view.?;
_ = view.xdg_toplevel.setSize(
@intCast(@as(c_int, @intFromFloat(self.wlr_cursor.x)) - view.scene_tree.node.x),
@intCast(@as(c_int, @intFromFloat(self.wlr_cursor.y)) - view.scene_tree.node.y)
);
},
}
}
@ -176,16 +140,32 @@ fn handleButton(
if(server.keyboard.wlr_keyboard.getModifiers().alt) {
// Can be BTN_RIGHT, BTN_LEFT, or BTN_MIDDLE
if(view_at_result) |res| {
// Keep track of where the drag started
cursor.selected_view = res.view;
cursor.drag_start_x = @as(c_int, @intFromFloat(cursor.wlr_cursor.x));
cursor.drag_start_y = @as(c_int, @intFromFloat(cursor.wlr_cursor.y));
cursor.drag_view_offset_x = cursor.drag_start_x - res.view.scene_tree.node.x;
cursor.drag_view_offset_y = cursor.drag_start_y - res.view.scene_tree.node.y;
cursor.drag_view_width = res.view.xdg_surface.geometry.width;
cursor.drag_view_height = res.view.xdg_surface.geometry.height;
// Maybe comptime this for later reference
if(event.button == c.libevdev_event_code_from_name(c.EV_KEY, "BTN_LEFT")) {
cursor.moveView(res.view, event);
cursor.mode = .move;
} else if(event.button == c.libevdev_event_code_from_name(c.EV_KEY, "BTN_RIGHT")) {
cursor.resizeView(res.view, event);
cursor.mode = .resize;
_ = res.view.xdg_toplevel.setResizing(true);
}
}
}
},
.released => {
cursor.mode = .passthrough;
if(cursor.selected_view) |view| {
_ = view.xdg_toplevel.setResizing(false);
}
cursor.selected_view = null;
},
else => {
std.log.err("Invalid/Unimplemented pointer button event type", .{});