git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit96162f6aced67ba6fe5dc316c0b15f8ed626e49d
parent75fd3bd147
authorLeon Henrik Plickat <[email protected]>
date2020-10-07 18:04
introduce Output.getEffectiveResolution()

 river/Cursor.zig       | 18 ++++++------------
 river/Output.zig       | 34 +++++++++++++++++++---------------
 river/command/move.zig | 23 ++++-------------------
 3 files changed, 29 insertions(+), 46 deletions(-)

diff --git a/river/Cursor.zig b/river/Cursor.zig
index 7920751..02c462a 100644
--- a/river/Cursor.zig
+++ b/river/Cursor.zig
@@ -128,20 +128,17 @@ const Mode = union(enum) {
             .move => |view| {
                 const border_width = if (view.draw_borders) config.border_width else 0;
 
-                var output_width: c_int = undefined;
-                var output_height: c_int = undefined;
-                c.wlr_output_effective_resolution(view.output.wlr_output, &output_width, &output_height);
-
                 // Set x/y of cursor and view, clamp to output dimensions
+                const output_resolution = view.output.getEffectiveResolution();
                 view.pending.box.x = std.math.clamp(
                     view.pending.box.x + @floatToInt(i32, delta_x),
                     @intCast(i32, border_width),
-                    output_width - @intCast(i32, view.pending.box.width + border_width),
+                    @intCast(i32, output_resolution.width - view.pending.box.width - border_width),
                 );
                 view.pending.box.y = std.math.clamp(
                     view.pending.box.y + @floatToInt(i32, delta_y),
                     @intCast(i32, border_width),
-                    output_height - @intCast(i32, view.pending.box.height + border_width),
+                    @intCast(i32, output_resolution.height - view.pending.box.height - border_width),
                 );
 
                 c.wlr_cursor_move(
@@ -156,10 +153,6 @@ const Mode = union(enum) {
             .resize => |data| {
                 const border_width = if (data.view.draw_borders) config.border_width else 0;
 
-                var output_width: c_int = undefined;
-                var output_height: c_int = undefined;
-                c.wlr_output_effective_resolution(data.view.output.wlr_output, &output_width, &output_height);
-
                 // Set width/height of view, clamp to view size constraints and output dimensions
                 const box = &data.view.pending.box;
                 box.width = @intCast(u32, std.math.max(0, @intCast(i32, box.width) + @floatToInt(i32, delta_x)));
@@ -167,8 +160,9 @@ const Mode = union(enum) {
 
                 data.view.applyConstraints();
 
-                box.width = std.math.min(box.width, @intCast(u32, output_width - box.x - @intCast(i32, border_width)));
-                box.height = std.math.min(box.height, @intCast(u32, output_height - box.y - @intCast(i32, border_width)));
+                const output_resolution = data.view.output.getEffectiveResolution();
+                box.width = std.math.min(box.width, output_resolution.width - border_width - @intCast(u32, box.x));
+                box.height = std.math.min(box.height, output_resolution.height - border_width - @intCast(u32, box.y));
 
                 data.view.applyPending();
 
diff --git a/river/Output.zig b/river/Output.zig
index 3ce8da8..21ecfb2 100644
--- a/river/Output.zig
+++ b/river/Output.zig
@@ -135,14 +135,12 @@ pub fn init(self: *Self, root: *Root, wlr_output: *c.wlr_output) !void {
                 log.err(.cursor, "failed to load xcursor theme at scale {}", .{wlr_output.scale});
         }
 
-        var width: c_int = undefined;
-        var height: c_int = undefined;
-        c.wlr_output_effective_resolution(wlr_output, &width, &height);
+        const effective_resolution = self.getEffectiveResolution();
         self.usable_box = .{
             .x = 0,
             .y = 0,
-            .width = @intCast(u32, width),
-            .height = @intCast(u32, height),
+            .width = effective_resolution.width,
+            .height = effective_resolution.height,
         };
     }
 }
@@ -311,16 +309,12 @@ pub fn arrangeViews(self: *Self) void {
 
 /// Arrange all layer surfaces of this output and adjust the usable area
 pub fn arrangeLayers(self: *Self) void {
-    const full_box = blk: {
-        var width: c_int = undefined;
-        var height: c_int = undefined;
-        c.wlr_output_effective_resolution(self.wlr_output, &width, &height);
-        break :blk Box{
-            .x = 0,
-            .y = 0,
-            .width = @intCast(u32, width),
-            .height = @intCast(u32, height),
-        };
+    const effective_resolution = self.getEffectiveResolution();
+    const full_box: Box = .{
+        .x = 0,
+        .y = 0,
+        .width = effective_resolution.width,
+        .height = effective_resolution.height,
     };
 
     // This box is modified as exclusive zones are applied
@@ -615,3 +609,13 @@ fn handleMode(listener: ?*c.wl_listener, data: ?*c_void) callconv(.C) void {
     self.arrangeViews();
     self.root.startTransaction();
 }
+
+pub fn getEffectiveResolution(self: *Self) struct { width: u32, height: u32 } {
+    var width: c_int = undefined;
+    var height: c_int = undefined;
+    c.wlr_output_effective_resolution(self.wlr_output, &width, &height);
+    return .{
+        .width = @intCast(u32, width),
+        .height = @intCast(u32, height),
+    };
+}
diff --git a/river/command/move.zig b/river/command/move.zig
index 14ef5b1..49266f1 100644
--- a/river/command/move.zig
+++ b/river/command/move.zig
@@ -62,10 +62,9 @@ pub fn snap(
     const direction = std.meta.stringToEnum(PhysicalDirection, args[1]) orelse
         return Error.InvalidPhysicalDirection;
 
-    const view = get_view(seat) orelse return;
-    const output_box = get_output_dimensions(view);
     const view = getView(seat) orelse return;
     const border_width = @intCast(i32, view.output.root.server.config.border_width);
+    const output_box = view.output.getEffectiveResolution();
     switch (direction) {
         .up => view.pending.box.y = border_width,
         .down => view.pending.box.y =
@@ -91,10 +90,9 @@ pub fn resize(
     const orientation = std.meta.stringToEnum(Orientation, args[1]) orelse
         return Error.InvalidOrientation;
 
-    const view = get_view(seat) orelse return;
-    const output_box = get_output_dimensions(view);
     const view = getView(seat) orelse return;
     const border_width = @intCast(i32, view.output.root.server.config.border_width);
+    const output_box = view.output.getEffectiveResolution();
     switch (orientation) {
         .horizontal => {
             var real_delta: i32 = @intCast(i32, view.pending.box.width);
@@ -158,21 +156,8 @@ fn getView(seat: *Seat) ?*View {
     return view;
 }
 
-fn get_output_dimensions(view: *View) Box {
-    var output_width: c_int = undefined;
-    var output_height: c_int = undefined;
-    c.wlr_output_effective_resolution(view.output.wlr_output, &output_width, &output_height);
-    const box: Box = .{
-        .x = 0,
-        .y = 0,
-        .width = @intCast(u32, output_width),
-        .height = @intCast(u32, output_height),
-    };
-    return box;
-}
-
 fn moveVertical(view: *View, delta: i32) void {
-    const output_box = view.output.get_output_dimensions(view);
+    const output_box = view.output.getEffectiveResolution();
     const border_width = @intCast(i32, view.output.root.server.config.border_width);
     view.pending.box.y = std.math.clamp(
         view.pending.box.y + delta,
@@ -182,7 +167,7 @@ fn moveVertical(view: *View, delta: i32) void {
 }
 
 fn moveHorizontal(view: *View, delta: i32) void {
-    const output_box = view.output.get_output_dimensions(view);
+    const output_box = view.output.getEffectiveResolution();
     const border_width = @intCast(i32, view.output.root.server.config.border_width);
     view.pending.box.x = std.math.clamp(
         view.pending.box.x + delta,