mirror of
https://github.com/MezzalunaWM/Mezzaluna.git
synced 2026-03-08 04:57:32 -04:00
cleaning up code, adding support for workspaces, and handling errors
This commit is contained in:
parent
6bfebb0e37
commit
609ee42d66
10 changed files with 204 additions and 137 deletions
|
|
@ -19,11 +19,12 @@ frame: wl.Listener(*wlr.Cursor) = .init(handleFrame),
|
|||
hold_begin: wl.Listener(*wlr.Pointer.event.HoldBegin) = .init(handleHoldBegin),
|
||||
hold_end: wl.Listener(*wlr.Pointer.event.HoldEnd) = .init(handleHoldEnd),
|
||||
|
||||
cursor_mode: enum { passthrough, move, resize } = .passthrough,
|
||||
mode: enum { passthrough, move, resize } = .passthrough,
|
||||
grabbed_view: ?*View = null,
|
||||
grab_x: f64 = 0,
|
||||
grab_y: f64 = 0,
|
||||
grab_box: wlr.Box = undefined,
|
||||
resize_edges: wlr.Edges = .{},
|
||||
|
||||
pub fn init(self: *Cursor) !void {
|
||||
self.* = .{
|
||||
|
|
@ -56,14 +57,62 @@ pub fn deinit(self: *Cursor) void {
|
|||
}
|
||||
|
||||
pub fn processCursorMotion(self: *Cursor, time_msec: u32) void {
|
||||
if (server.root.viewAt(self.wlr_cursor.x, self.wlr_cursor.y)) |res| {
|
||||
std.log.debug("we found a view", .{});
|
||||
server.seat.wlr_seat.pointerNotifyEnter(res.surface, res.sx, res.sy);
|
||||
server.seat.wlr_seat.pointerNotifyMotion(time_msec, res.sx, res.sy);
|
||||
} else {
|
||||
std.log.debug("no view found", .{});
|
||||
self.wlr_cursor.setXcursor(self.x_cursor_manager, "default");
|
||||
server.seat.wlr_seat.pointerClearFocus();
|
||||
switch (self.mode) {
|
||||
.passthrough => {
|
||||
if (server.root.viewAt(self.wlr_cursor.x, self.wlr_cursor.y)) |res| {
|
||||
server.seat.wlr_seat.pointerNotifyEnter(res.surface, res.sx, res.sy);
|
||||
server.seat.wlr_seat.pointerNotifyMotion(time_msec, res.sx, res.sy);
|
||||
} else {
|
||||
self.wlr_cursor.setXcursor(self.x_cursor_manager, "default");
|
||||
server.seat.wlr_seat.pointerClearFocus();
|
||||
}
|
||||
},
|
||||
.move => {
|
||||
const view = self.grabbed_view.?;
|
||||
// Should we modify the XdgSurface geometry directly???
|
||||
view.geometry.x = @as(i32, @intFromFloat(self.wlr_cursor.x - self.grab_x));
|
||||
view.geometry.y = @as(i32, @intFromFloat(self.wlr_cursor.y - self.grab_y));
|
||||
view.scene_tree.node.setPosition(view.geometry.x, view.geometry.y);
|
||||
},
|
||||
.resize => {
|
||||
// Fix this resize
|
||||
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);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -88,9 +137,20 @@ fn handleButton(
|
|||
_: *wl.Listener(*wlr.Pointer.event.Button),
|
||||
event: *wlr.Pointer.event.Button,
|
||||
) void {
|
||||
_ = server.seat.wlr_seat.pointerNotifyButton(event.time_msec, event.button, event.state);
|
||||
if (server.root.viewAt(server.cursor.wlr_cursor.x, server.cursor.wlr_cursor.y)) |res| {
|
||||
server.root.focusView(res.view);
|
||||
switch (event.state) {
|
||||
.pressed => {
|
||||
_ = server.seat.wlr_seat.pointerNotifyButton(event.time_msec, event.button, event.state);
|
||||
if (server.root.viewAt(server.cursor.wlr_cursor.x, server.cursor.wlr_cursor.y)) |res| {
|
||||
server.root.focusView(res.view);
|
||||
}
|
||||
},
|
||||
.released => {
|
||||
std.log.debug("Button released", .{});
|
||||
server.cursor.mode = .passthrough;
|
||||
},
|
||||
else => {
|
||||
std.log.err("Unexpected button state", .{});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue