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