XdgToplevel: fix size_changed check on commit

We need to initialize the geometry on map to ensure the first commit is
handled correctly.

Also we don't care about the x/y of the geometry, only the width/height.
This commit is contained in:
Isaac Freund 2023-03-02 18:57:47 +01:00
parent 56e4efe68d
commit 9ce1847d32
No known key found for this signature in database
GPG Key ID: 86DED400DDFD7A11

View File

@ -36,7 +36,8 @@ view: *View,
xdg_toplevel: *wlr.XdgToplevel,
geometry: wlr.Box,
/// Initialized on map
geometry: wlr.Box = undefined,
/// Set to true when the client acks the configure with serial View.inflight_serial.
acked_inflight_serial: bool = false,
@ -59,12 +60,10 @@ pub fn create(xdg_toplevel: *wlr.XdgToplevel) error{OutOfMemory}!void {
const view = try View.create(.{ .xdg_toplevel = .{
.view = undefined,
.xdg_toplevel = xdg_toplevel,
.geometry = undefined,
} });
errdefer view.destroy();
view.impl.xdg_toplevel.view = view;
xdg_toplevel.base.getGeometry(&view.impl.xdg_toplevel.geometry);
_ = try view.surface_tree.createSceneXdgSurface(xdg_toplevel.base);
@ -165,14 +164,13 @@ fn handleMap(listener: *wl.Listener(void)) void {
self.xdg_toplevel.events.set_title.add(&self.set_title);
self.xdg_toplevel.events.set_app_id.add(&self.set_app_id);
var geometry: wlr.Box = undefined;
self.xdg_toplevel.base.getGeometry(&geometry);
self.xdg_toplevel.base.getGeometry(&self.geometry);
view.pending.box = .{
.x = 0,
.y = 0,
.width = geometry.width,
.height = geometry.height,
.width = self.geometry.width,
.height = self.geometry.height,
};
view.inflight.box = view.pending.box;
view.current.box = view.pending.box;
@ -255,11 +253,10 @@ fn handleCommit(listener: *wl.Listener(*wlr.Surface), _: *wlr.Surface) void {
};
}
var new_geometry: wlr.Box = undefined;
self.xdg_toplevel.base.getGeometry(&new_geometry);
const size_changed = !std.meta.eql(self.geometry, new_geometry);
self.geometry = new_geometry;
const old_geometry = self.geometry;
self.xdg_toplevel.base.getGeometry(&self.geometry);
const size_changed = self.geometry.width != old_geometry.width or
self.geometry.height != old_geometry.height;
if (view.inflight_serial != null) {
if (self.acked_inflight_serial) {
@ -275,12 +272,17 @@ fn handleCommit(listener: *wl.Listener(*wlr.Surface), _: *wlr.Surface) void {
} else if (size_changed and !view.current.fullscreen and
(view.current.float or view.current.output == null or view.current.output.?.layout == null))
{
log.info(
"client initiated size change: {}x{} -> {}x{}",
.{ old_geometry.width, old_geometry.height, self.geometry.width, self.geometry.height },
);
// If the client has decided to resize itself and the view is floating,
// then respect that resize.
view.current.box.width = new_geometry.width;
view.current.box.height = new_geometry.height;
view.pending.box.width = new_geometry.width;
view.pending.box.height = new_geometry.height;
view.current.box.width = self.geometry.width;
view.current.box.height = self.geometry.height;
view.pending.box.width = self.geometry.width;
view.pending.box.height = self.geometry.height;
server.root.applyPending();
}
}