feat: add seat, wl_pointer, wl_keyboard
parent
10475dd036
commit
847051ebc3
|
@ -36,6 +36,7 @@ pub fn main() !void {
|
||||||
var compositor_id_opt: ?u32 = null;
|
var compositor_id_opt: ?u32 = null;
|
||||||
var xdg_wm_base_id_opt: ?u32 = null;
|
var xdg_wm_base_id_opt: ?u32 = null;
|
||||||
var zxdg_decoration_manager_id_opt: ?u32 = null;
|
var zxdg_decoration_manager_id_opt: ?u32 = null;
|
||||||
|
var wl_seat_id_opt: ?u32 = null;
|
||||||
|
|
||||||
var message_buffer = std.ArrayList(u32).init(gpa);
|
var message_buffer = std.ArrayList(u32).init(gpa);
|
||||||
defer message_buffer.deinit();
|
defer message_buffer.deinit();
|
||||||
|
@ -111,6 +112,20 @@ pub fn main() !void {
|
||||||
} },
|
} },
|
||||||
);
|
);
|
||||||
try socket.writeAll(std.mem.sliceAsBytes(message));
|
try socket.writeAll(std.mem.sliceAsBytes(message));
|
||||||
|
} else if (std.mem.eql(u8, global.interface, "wl_seat")) {
|
||||||
|
wl_seat_id_opt = id_pool.create();
|
||||||
|
const message = try wayland.serialize(
|
||||||
|
wayland.core.Registry.Request,
|
||||||
|
&buffer,
|
||||||
|
registry_id,
|
||||||
|
.{ .bind = .{
|
||||||
|
.name = global.name,
|
||||||
|
.interface = global.interface,
|
||||||
|
.version = 8,
|
||||||
|
.new_id = wl_seat_id_opt.?,
|
||||||
|
} },
|
||||||
|
);
|
||||||
|
try socket.writeAll(std.mem.sliceAsBytes(message));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.global_remove => {},
|
.global_remove => {},
|
||||||
|
@ -125,6 +140,7 @@ pub fn main() !void {
|
||||||
const shm_id = shm_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
const shm_id = shm_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
||||||
const compositor_id = compositor_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
const compositor_id = compositor_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
||||||
const xdg_wm_base_id = xdg_wm_base_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
const xdg_wm_base_id = xdg_wm_base_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
||||||
|
const wl_seat_id = wl_seat_id_opt orelse return error.NeccessaryWaylandExtensionMissing;
|
||||||
|
|
||||||
const surface_id = id_pool.create();
|
const surface_id = id_pool.create();
|
||||||
{
|
{
|
||||||
|
@ -206,6 +222,7 @@ pub fn main() !void {
|
||||||
|
|
||||||
var done = false;
|
var done = false;
|
||||||
var surface_configured = false;
|
var surface_configured = false;
|
||||||
|
var seat_capabilties: ?wayland.core.Seat.Capability = null;
|
||||||
while (!done or !surface_configured) {
|
while (!done or !surface_configured) {
|
||||||
var header: wayland.Header = undefined;
|
var header: wayland.Header = undefined;
|
||||||
const header_bytes_read = try socket.readAll(std.mem.asBytes(&header));
|
const header_bytes_read = try socket.readAll(std.mem.asBytes(&header));
|
||||||
|
@ -237,20 +254,6 @@ pub fn main() !void {
|
||||||
} else if (zxdg_toplevel_decoration_id_opt != null and header.object_id == zxdg_toplevel_decoration_id_opt.?) {
|
} else if (zxdg_toplevel_decoration_id_opt != null and header.object_id == zxdg_toplevel_decoration_id_opt.?) {
|
||||||
const event = try wayland.deserialize(wayland.zxdg.ToplevelDecorationV1.Event, header, message_buffer.items);
|
const event = try wayland.deserialize(wayland.zxdg.ToplevelDecorationV1.Event, header, message_buffer.items);
|
||||||
std.debug.print("<- zxdg_toplevel_decoration@{}\n", .{event});
|
std.debug.print("<- zxdg_toplevel_decoration@{}\n", .{event});
|
||||||
// switch (event) {
|
|
||||||
// .configure => |_| {
|
|
||||||
// var buffer: [10]u32 = undefined;
|
|
||||||
// const message = try wayland.serialize(
|
|
||||||
// wayland.zxdg.ToplevelDecorationV1.Request,
|
|
||||||
// &buffer,
|
|
||||||
// zxdg_toplevel_decoration_id_opt.?,
|
|
||||||
// .{ .set_mode = .{
|
|
||||||
// .mode = .server_side,
|
|
||||||
// } },
|
|
||||||
// );
|
|
||||||
// try socket.writeAll(std.mem.sliceAsBytes(message));
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
} else if (header.object_id == xdg_toplevel_id) {
|
} else if (header.object_id == xdg_toplevel_id) {
|
||||||
const event = try wayland.deserialize(wayland.xdg.Toplevel.Event, header, message_buffer.items);
|
const event = try wayland.deserialize(wayland.xdg.Toplevel.Event, header, message_buffer.items);
|
||||||
std.debug.print("<- {}\n", .{event});
|
std.debug.print("<- {}\n", .{event});
|
||||||
|
@ -261,6 +264,33 @@ pub fn main() !void {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
.format => |format| std.debug.print("<- format {} {}\n", .{ format.format, std.zig.fmtEscapes(std.mem.asBytes(&format.format)) }),
|
.format => |format| std.debug.print("<- format {} {}\n", .{ format.format, std.zig.fmtEscapes(std.mem.asBytes(&format.format)) }),
|
||||||
}
|
}
|
||||||
|
} else if (header.object_id == wl_seat_id) {
|
||||||
|
const event = try wayland.deserialize(wayland.core.Seat.Event, header, message_buffer.items);
|
||||||
|
switch (event) {
|
||||||
|
.capabilities => |capabilities| {
|
||||||
|
const cap: wayland.core.Seat.Capability = @bitCast(capabilities.capability);
|
||||||
|
std.debug.print("<- wl_seat.capabilties = {}\n", .{cap});
|
||||||
|
seat_capabilties = cap;
|
||||||
|
|
||||||
|
// if (cap.keyboard) {
|
||||||
|
// var buffer: [10]u32 = undefined;
|
||||||
|
// wl_keyboard_id_opt = id_pool.create();
|
||||||
|
// std.debug.print("wl keyboard id: {}\n", .{wl_keyboard_id_opt.?});
|
||||||
|
// const message = try wayland.serialize(
|
||||||
|
// wayland.core.Seat.Request,
|
||||||
|
// &buffer,
|
||||||
|
// wl_seat_id,
|
||||||
|
// .{ .get_keyboard = .{
|
||||||
|
// .new_id = wl_keyboard_id_opt.?,
|
||||||
|
// } },
|
||||||
|
// );
|
||||||
|
// try socket.writeAll(std.mem.sliceAsBytes(message));
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
.name => |name| {
|
||||||
|
std.debug.print("<- wl_seat.name = {s}\n", .{name.name});
|
||||||
|
},
|
||||||
|
}
|
||||||
} else if (header.object_id == 1) {
|
} else if (header.object_id == 1) {
|
||||||
const event = try wayland.deserialize(wayland.core.Display.Event, header, message_buffer.items);
|
const event = try wayland.deserialize(wayland.core.Display.Event, header, message_buffer.items);
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
@ -275,6 +305,41 @@ pub fn main() !void {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var wl_pointer_id_opt: ?u32 = null;
|
||||||
|
var wl_keyboard_id_opt: ?u32 = null;
|
||||||
|
if (seat_capabilties) |caps| {
|
||||||
|
if (caps.pointer) {
|
||||||
|
var buffer: [10]u32 = undefined;
|
||||||
|
wl_pointer_id_opt = id_pool.create();
|
||||||
|
std.debug.print("wl pointer id: {}\n", .{wl_pointer_id_opt.?});
|
||||||
|
const message = try wayland.serialize(
|
||||||
|
wayland.core.Seat.Request,
|
||||||
|
&buffer,
|
||||||
|
wl_seat_id,
|
||||||
|
.{ .get_pointer = .{
|
||||||
|
.new_id = wl_pointer_id_opt.?,
|
||||||
|
} },
|
||||||
|
);
|
||||||
|
try socket.writeAll(std.mem.sliceAsBytes(message));
|
||||||
|
}
|
||||||
|
if (caps.keyboard) {
|
||||||
|
var buffer: [10]u32 = undefined;
|
||||||
|
wl_keyboard_id_opt = id_pool.create();
|
||||||
|
std.debug.print("wl keyboard id: {}\n", .{wl_keyboard_id_opt.?});
|
||||||
|
const message = try wayland.serialize(
|
||||||
|
wayland.core.Seat.Request,
|
||||||
|
&buffer,
|
||||||
|
wl_seat_id,
|
||||||
|
.{ .get_keyboard = .{
|
||||||
|
.new_id = wl_keyboard_id_opt.?,
|
||||||
|
} },
|
||||||
|
);
|
||||||
|
try socket.writeAll(std.mem.sliceAsBytes(message));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const wl_pointer_id = wl_pointer_id_opt orelse return error.MissingPointer;
|
||||||
|
const wl_keyboard_id = wl_keyboard_id_opt orelse return error.MissingKeyboard;
|
||||||
|
|
||||||
// allocate a shared memory file for display purposes
|
// allocate a shared memory file for display purposes
|
||||||
const Pixel = [4]u8;
|
const Pixel = [4]u8;
|
||||||
const framebuffer_size = [2]usize{ 128, 128 };
|
const framebuffer_size = [2]usize{ 128, 128 };
|
||||||
|
@ -465,6 +530,17 @@ pub fn main() !void {
|
||||||
try socket.writeAll(std.mem.sliceAsBytes(message));
|
try socket.writeAll(std.mem.sliceAsBytes(message));
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
} else if (header.object_id == wl_pointer_id) {
|
||||||
|
const event = try wayland.deserialize(wayland.core.Pointer.Event, header, message_buffer.items);
|
||||||
|
std.debug.print("<- wl_pointer@{}\n", .{event});
|
||||||
|
} else if (header.object_id == wl_keyboard_id) {
|
||||||
|
const event = try wayland.deserialize(wayland.core.Keyboard.Event, header, message_buffer.items);
|
||||||
|
switch (event) {
|
||||||
|
// .keymap => |keymap| {},
|
||||||
|
else => {
|
||||||
|
std.debug.print("<- wl_keyboard@{}\n", .{event});
|
||||||
|
},
|
||||||
|
}
|
||||||
} else if (header.object_id == 1) {
|
} else if (header.object_id == 1) {
|
||||||
const event = try wayland.deserialize(wayland.core.Display.Event, header, message_buffer.items);
|
const event = try wayland.deserialize(wayland.core.Display.Event, header, message_buffer.items);
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
|
170
src/core.zig
170
src/core.zig
|
@ -170,3 +170,173 @@ pub const Buffer = struct {
|
||||||
release: void,
|
release: void,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const Seat = struct {
|
||||||
|
pub const Request = union(enum) {
|
||||||
|
get_pointer: struct {
|
||||||
|
new_id: u32,
|
||||||
|
},
|
||||||
|
get_keyboard: struct {
|
||||||
|
new_id: u32,
|
||||||
|
},
|
||||||
|
get_touch: struct {
|
||||||
|
new_id: u32,
|
||||||
|
},
|
||||||
|
release: void,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Event = union(enum) {
|
||||||
|
capabilities: struct {
|
||||||
|
capability: u32,
|
||||||
|
},
|
||||||
|
name: struct {
|
||||||
|
name: []const u8,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Capability = packed struct(u32) {
|
||||||
|
pointer: bool,
|
||||||
|
keyboard: bool,
|
||||||
|
touch: bool,
|
||||||
|
_unused: u29,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Error = enum(u32) {};
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Pointer = struct {
|
||||||
|
pub const Request = union(enum) {
|
||||||
|
set_cursor: struct {
|
||||||
|
serial: u32,
|
||||||
|
surface: u32,
|
||||||
|
hotspot_x: i32,
|
||||||
|
hotspot_y: i32,
|
||||||
|
},
|
||||||
|
release: void,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Event = union(enum) {
|
||||||
|
enter: struct {
|
||||||
|
serial: u32,
|
||||||
|
surface: u32,
|
||||||
|
surface_x: u32,
|
||||||
|
surface_y: u32,
|
||||||
|
},
|
||||||
|
leave: struct {
|
||||||
|
serial: u32,
|
||||||
|
surface: u32,
|
||||||
|
},
|
||||||
|
motion: struct {
|
||||||
|
time: u32,
|
||||||
|
surface_x: i32, //i24.8
|
||||||
|
surface_y: i32, //i24.8
|
||||||
|
},
|
||||||
|
button: struct {
|
||||||
|
serial: u32,
|
||||||
|
time: u32,
|
||||||
|
button: u32,
|
||||||
|
state: ButtonState,
|
||||||
|
},
|
||||||
|
axis: struct {
|
||||||
|
time: u32,
|
||||||
|
axis: Axis,
|
||||||
|
value: i32, //i24.8
|
||||||
|
},
|
||||||
|
frame: void,
|
||||||
|
axis_source: struct {
|
||||||
|
axis_source: u32,
|
||||||
|
},
|
||||||
|
axis_stop: struct {
|
||||||
|
time: u32,
|
||||||
|
axis: Axis,
|
||||||
|
},
|
||||||
|
axis_discrete: struct {
|
||||||
|
axis: Axis,
|
||||||
|
discrete: i32,
|
||||||
|
},
|
||||||
|
axis_value120: struct {
|
||||||
|
axis: Axis,
|
||||||
|
value120: i32,
|
||||||
|
},
|
||||||
|
axis_relative_direction: struct {
|
||||||
|
axis: Axis,
|
||||||
|
direction: AxisRelativeDirection,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Error = enum(u32) {
|
||||||
|
role,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const ButtonState = enum(u32) {
|
||||||
|
released,
|
||||||
|
pressed,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Axis = enum(u32) {
|
||||||
|
vertical_scroll,
|
||||||
|
horizontal_scroll,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const AxisSource = enum(u32) {
|
||||||
|
wheel,
|
||||||
|
finger,
|
||||||
|
continuous,
|
||||||
|
wheel_tilt,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const AxisRelativeDirection = enum(u32) {
|
||||||
|
identical,
|
||||||
|
inverted,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Keyboard = struct {
|
||||||
|
pub const Request = union(enum) {
|
||||||
|
release: void,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Event = union(enum) {
|
||||||
|
keymap: struct {
|
||||||
|
format: KeymapFormat,
|
||||||
|
// fd: u32,
|
||||||
|
size: u32,
|
||||||
|
},
|
||||||
|
enter: struct {
|
||||||
|
serial: u32,
|
||||||
|
surface: u32,
|
||||||
|
keys: []const u32,
|
||||||
|
},
|
||||||
|
leave: struct {
|
||||||
|
serial: u32,
|
||||||
|
surface: u32,
|
||||||
|
},
|
||||||
|
key: struct {
|
||||||
|
serial: u32,
|
||||||
|
time: u32,
|
||||||
|
key: u32,
|
||||||
|
state: KeyState,
|
||||||
|
},
|
||||||
|
modifiers: struct {
|
||||||
|
serial: u32,
|
||||||
|
mods_depressed: u32,
|
||||||
|
mods_latched: u32,
|
||||||
|
mods_locked: u32,
|
||||||
|
group: u32,
|
||||||
|
},
|
||||||
|
repeat_info: struct {
|
||||||
|
rate: i32,
|
||||||
|
delay: i32,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const KeymapFormat = enum(u32) {
|
||||||
|
no_keymap,
|
||||||
|
xkb_v1,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const KeyState = enum(u32) {
|
||||||
|
released,
|
||||||
|
pressed,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue