diff options
Diffstat (limited to 'src/view.zig')
| -rw-r--r-- | src/view.zig | 273 |
1 files changed, 136 insertions, 137 deletions
diff --git a/src/view.zig b/src/view.zig index 168dba9..ac0245a 100644 --- a/src/view.zig +++ b/src/view.zig @@ -1,4 +1,7 @@ +const Self = @This(); + const std = @import("std"); + const c = @import("c.zig"); const Box = @import("box.zig"); @@ -8,177 +11,173 @@ const Root = @import("root.zig").Root; const ViewStack = @import("view_stack.zig").ViewStack; const XdgToplevel = @import("xdg_toplevel.zig"); -pub const View = struct { - const Self = @This(); +const ViewImpl = union(enum) { + xdg_toplevel: XdgToplevel, +}; - const ViewImpl = union(enum) { - xdg_toplevel: XdgToplevel, - }; +/// The implementation of this view +impl: ViewImpl, - /// The implementation of this view - impl: ViewImpl, +/// The output this view is currently associated with +output: *Output, - /// The output this view is currently associated with - output: *Output, +/// This is non-null exactly when the view is mapped +wlr_surface: ?*c.wlr_surface, - /// This is non-null exactly when the view is mapped - wlr_surface: ?*c.wlr_surface, +/// If the view is floating or not +floating: bool, - /// If the view is floating or not - floating: bool, +/// True if the view is currentlt focused by at lease one seat +focused: bool, - /// True if the view is currentlt focused by at lease one seat - focused: bool, +/// The current output-relative coordinates and dimensions of the view +current_box: Box, +pending_box: ?Box, - /// The current output-relative coordinates and dimensions of the view - current_box: Box, - pending_box: ?Box, +/// The dimensions the view would have taken if we didn't force it to tile +natural_width: u32, +natural_height: u32, - /// The dimensions the view would have taken if we didn't force it to tile - natural_width: u32, - natural_height: u32, +current_tags: u32, +pending_tags: ?u32, - current_tags: u32, - pending_tags: ?u32, +pending_serial: ?u32, - pending_serial: ?u32, +// This is what we render while a transaction is in progress +stashed_buffer: ?*c.wlr_buffer, - // This is what we render while a transaction is in progress - stashed_buffer: ?*c.wlr_buffer, +pub fn init_xdg_toplevel( + self: *Self, + output: *Output, + tags: u32, + wlr_xdg_surface: *c.wlr_xdg_surface, +) void { + self.output = output; - pub fn init_xdg_toplevel( - self: *Self, - output: *Output, - tags: u32, - wlr_xdg_surface: *c.wlr_xdg_surface, - ) void { - self.output = output; + self.wlr_surface = null; - self.wlr_surface = null; + self.focused = false; - self.focused = false; + self.current_box = Box{ + .x = 0, + .y = 0, + .height = 0, + .width = 0, + }; + self.pending_box = null; - self.current_box = Box{ - .x = 0, - .y = 0, - .height = 0, - .width = 0, - }; - self.pending_box = null; + self.current_tags = tags; + self.pending_tags = null; - self.current_tags = tags; - self.pending_tags = null; + self.pending_serial = null; - self.pending_serial = null; + self.stashed_buffer = null; - self.stashed_buffer = null; + self.impl = .{ .xdg_toplevel = undefined }; + self.impl.xdg_toplevel.init(self, wlr_xdg_surface); +} - self.impl = .{ .xdg_toplevel = undefined }; - self.impl.xdg_toplevel.init(self, wlr_xdg_surface); +pub fn deinit(self: *Self) void { + if (self.stashed_buffer) |buffer| { + c.wlr_buffer_unref(buffer); } - - pub fn deinit(self: *Self) void { - if (self.stashed_buffer) |buffer| { - c.wlr_buffer_unref(buffer); - } - } - - pub fn needsConfigure(self: Self) bool { - if (self.pending_box) |pending_box| { - return pending_box.width != self.current_box.width or - pending_box.height != self.current_box.height; - } else { - return false; - } +} + +pub fn needsConfigure(self: Self) bool { + if (self.pending_box) |pending_box| { + return pending_box.width != self.current_box.width or + pending_box.height != self.current_box.height; + } else { + return false; } +} - pub fn configure(self: Self) void { - if (self.pending_box) |pending_box| { - switch (self.impl) { - .xdg_toplevel => |xdg_toplevel| xdg_toplevel.configure(pending_box), - } - } else { - Log.Error.log("Configure called on a View with no pending box", .{}); +pub fn configure(self: Self) void { + if (self.pending_box) |pending_box| { + switch (self.impl) { + .xdg_toplevel => |xdg_toplevel| xdg_toplevel.configure(pending_box), } + } else { + Log.Error.log("Configure called on a View with no pending box", .{}); } - - pub fn sendFrameDone(self: Self) void { - var now: c.timespec = undefined; - _ = c.clock_gettime(c.CLOCK_MONOTONIC, &now); - c.wlr_surface_send_frame_done(self.wlr_surface.?, &now); - } - - pub fn dropStashedBuffer(self: *Self) void { - // TODO: log debug error - if (self.stashed_buffer) |buffer| { - c.wlr_buffer_unref(buffer); - self.stashed_buffer = null; - } +} + +pub fn sendFrameDone(self: Self) void { + var now: c.timespec = undefined; + _ = c.clock_gettime(c.CLOCK_MONOTONIC, &now); + c.wlr_surface_send_frame_done(self.wlr_surface.?, &now); +} + +pub fn dropStashedBuffer(self: *Self) void { + // TODO: log debug error + if (self.stashed_buffer) |buffer| { + c.wlr_buffer_unref(buffer); + self.stashed_buffer = null; } - - pub fn stashBuffer(self: *Self) void { - // TODO: log debug error if there is already a saved buffer - if (self.wlr_surface) |wlr_surface| { - if (c.wlr_surface_has_buffer(wlr_surface)) { - _ = c.wlr_buffer_ref(wlr_surface.buffer); - self.stashed_buffer = wlr_surface.buffer; - } +} + +pub fn stashBuffer(self: *Self) void { + // TODO: log debug error if there is already a saved buffer + if (self.wlr_surface) |wlr_surface| { + if (c.wlr_surface_has_buffer(wlr_surface)) { + _ = c.wlr_buffer_ref(wlr_surface.buffer); + self.stashed_buffer = wlr_surface.buffer; } } +} - /// Set the focued bool and the active state of the view if it is a toplevel - pub fn setFocused(self: *Self, focused: bool) void { - self.focused = focused; - switch (self.impl) { - .xdg_toplevel => |xdg_toplevel| xdg_toplevel.setActivated(focused), - } +/// Set the focued bool and the active state of the view if it is a toplevel +pub fn setFocused(self: *Self, focused: bool) void { + self.focused = focused; + switch (self.impl) { + .xdg_toplevel => |xdg_toplevel| xdg_toplevel.setActivated(focused), } - - /// If true is passsed, make the view float. If false, return it to the tiled - /// layout. - pub fn setFloating(self: *Self, float: bool) void { - if (float and !self.floating) { - self.floating = true; - self.pending_box = Box{ - .x = std.math.max(0, @divTrunc(@intCast(i32, self.output.usable_box.width) - - @intCast(i32, self.natural_width), 2)), - .y = std.math.max(0, @divTrunc(@intCast(i32, self.output.usable_box.height) - - @intCast(i32, self.natural_height), 2)), - .width = self.natural_width, - .height = self.natural_height, - }; - } else if (!float and self.floating) { - self.floating = false; - } +} + +/// If true is passsed, make the view float. If false, return it to the tiled +/// layout. +pub fn setFloating(self: *Self, float: bool) void { + if (float and !self.floating) { + self.floating = true; + self.pending_box = Box{ + .x = std.math.max(0, @divTrunc(@intCast(i32, self.output.usable_box.width) - + @intCast(i32, self.natural_width), 2)), + .y = std.math.max(0, @divTrunc(@intCast(i32, self.output.usable_box.height) - + @intCast(i32, self.natural_height), 2)), + .width = self.natural_width, + .height = self.natural_height, + }; + } else if (!float and self.floating) { + self.floating = false; } +} - /// Move a view from one output to another, sending the required enter/leave - /// events. - pub fn sendToOutput(self: *Self, destination_output: *Output) void { - const node = @fieldParentPtr(ViewStack(View).Node, "view", self); +/// Move a view from one output to another, sending the required enter/leave +/// events. +pub fn sendToOutput(self: *Self, destination_output: *Output) void { + const node = @fieldParentPtr(ViewStack(Self).Node, "view", self); - self.output.views.remove(node); - destination_output.views.push(node); + self.output.views.remove(node); + destination_output.views.push(node); - c.wlr_surface_send_leave(self.wlr_surface, self.output.wlr_output); - c.wlr_surface_send_enter(self.wlr_surface, destination_output.wlr_output); + c.wlr_surface_send_leave(self.wlr_surface, self.output.wlr_output); + c.wlr_surface_send_enter(self.wlr_surface, destination_output.wlr_output); - self.output = destination_output; - } + self.output = destination_output; +} - pub fn close(self: Self) void { - switch (self.impl) { - .xdg_toplevel => |xdg_toplevel| xdg_toplevel.close(), - } +pub fn close(self: Self) void { + switch (self.impl) { + .xdg_toplevel => |xdg_toplevel| xdg_toplevel.close(), } - - pub fn forEachSurface( - self: Self, - iterator: c.wlr_surface_iterator_func_t, - user_data: ?*c_void, - ) void { - switch (self.impl) { - .xdg_toplevel => |xdg_toplevel| xdg_toplevel.forEachSurface(iterator, user_data), - } +} + +pub fn forEachSurface( + self: Self, + iterator: c.wlr_surface_iterator_func_t, + user_data: ?*c_void, +) void { + switch (self.impl) { + .xdg_toplevel => |xdg_toplevel| xdg_toplevel.forEachSurface(iterator, user_data), } -}; +} |
