aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeon Henrik Plickat <leonhenrik.plickat@stud.uni-goettingen.de>2020-10-07 18:04:27 +0200
committerIsaac Freund <ifreund@ifreund.xyz>2020-10-07 21:03:59 +0200
commitd4ca5d7a88d10116aeada94819d2ea8030f923c7 (patch)
treea8b52de7e7688c0d78f49bcc671ead683b0c1e00
parentb2f13f5bcc072cd907c85de4d82315ffb386e6a1 (diff)
downloadriver-d4ca5d7a88d10116aeada94819d2ea8030f923c7.tar.gz
river-d4ca5d7a88d10116aeada94819d2ea8030f923c7.tar.xz
introduce Output.getEffectiveResolution()
-rw-r--r--river/Cursor.zig18
-rw-r--r--river/Output.zig34
-rw-r--r--river/command/move.zig23
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,