diff options
| author | Isaac Freund <ifreund@ifreund.xyz> | 2020-03-22 22:42:55 +0100 |
|---|---|---|
| committer | Isaac Freund <ifreund@ifreund.xyz> | 2020-03-22 22:42:55 +0100 |
| commit | 0584fde12625832d16a600a0900641cbb9a8b1c8 (patch) | |
| tree | 593f1f8504214b4ab0b3aad65f5fec8958e04b4f /src/xdg_shell.zig | |
| parent | 76ed2a72a8b83333e39b0ce7a04e0a519e4378e6 (diff) | |
| download | river-0584fde12625832d16a600a0900641cbb9a8b1c8.tar.gz river-0584fde12625832d16a600a0900641cbb9a8b1c8.tar.xz | |
WIP massive refactor
Diffstat (limited to 'src/xdg_shell.zig')
| -rw-r--r-- | src/xdg_shell.zig | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/xdg_shell.zig b/src/xdg_shell.zig new file mode 100644 index 0000000..3bcc736 --- /dev/null +++ b/src/xdg_shell.zig @@ -0,0 +1,68 @@ +const std = @import("std"); +const c = @import("c.zig").c; + +fn xdg_surface_map(listener: [*c]c.wl_listener, data: ?*c_void) callconv(.C) void { + // Called when the surface is mapped, or ready to display on-screen. + var view = @fieldParentPtr(View, "map", listener); + view.*.mapped = true; + focus_view(view, view.*.xdg_surface.*.surface); +} + +fn xdg_surface_unmap(listener: [*c]c.wl_listener, data: ?*c_void) callconv(.C) void { + var view = @fieldParentPtr(View, "unmap", listener); + view.*.mapped = false; +} + +fn xdg_surface_destroy(listener: [*c]c.wl_listener, data: ?*c_void) callconv(.C) void { + var view = @fieldParentPtr(View, "destroy", listener); + var server = view.*.server; + const idx = for (server.*.views.span()) |*v, i| { + if (v == view) { + break i; + } + } else return; + _ = server.*.views.orderedRemove(idx); +} + +fn xdg_toplevel_request_move(listener: [*c]c.wl_listener, data: ?*c_void) callconv(.C) void { + // ignore for now +} + +fn xdg_toplevel_request_resize(listener: [*c]c.wl_listener, data: ?*c_void) callconv(.C) void { + // ignore for now +} + +fn server_new_xdg_surface(listener: [*c]c.wl_listener, data: ?*c_void) callconv(.C) void { + // This event is raised when wlr_xdg_shell receives a new xdg surface from a + // client, either a toplevel (application window) or popup. + var server = @fieldParentPtr(Server, "new_xdg_surface", listener); + var xdg_surface = @ptrCast(*c.wlr_xdg_surface, @alignCast(@alignOf(*c.wlr_xdg_surface), data)); + + if (xdg_surface.*.role != c.enum_wlr_xdg_surface_role.WLR_XDG_SURFACE_ROLE_TOPLEVEL) { + return; + } + + // Allocate a View for this surface + server.*.views.append(undefined) catch unreachable; + var view = &server.*.views.span()[server.*.views.span().len - 1]; + + view.*.server = server; + view.*.xdg_surface = xdg_surface; + + // Listen to the various events it can emit + view.*.map.notify = xdg_surface_map; + c.wl_signal_add(&xdg_surface.*.events.map, &view.*.map); + + view.*.unmap.notify = xdg_surface_unmap; + c.wl_signal_add(&xdg_surface.*.events.unmap, &view.*.unmap); + + view.*.destroy.notify = xdg_surface_destroy; + c.wl_signal_add(&xdg_surface.*.events.destroy, &view.*.destroy); + + var toplevel = xdg_surface.*.unnamed_160.toplevel; + view.*.request_move.notify = xdg_toplevel_request_move; + c.wl_signal_add(&toplevel.*.events.request_move, &view.*.request_move); + + view.*.request_resize.notify = xdg_toplevel_request_resize; + c.wl_signal_add(&toplevel.*.events.request_resize, &view.*.request_resize); +} |
