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:
parent
56e4efe68d
commit
9ce1847d32
@ -36,7 +36,8 @@ view: *View,
|
|||||||
|
|
||||||
xdg_toplevel: *wlr.XdgToplevel,
|
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.
|
/// Set to true when the client acks the configure with serial View.inflight_serial.
|
||||||
acked_inflight_serial: bool = false,
|
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 = .{
|
const view = try View.create(.{ .xdg_toplevel = .{
|
||||||
.view = undefined,
|
.view = undefined,
|
||||||
.xdg_toplevel = xdg_toplevel,
|
.xdg_toplevel = xdg_toplevel,
|
||||||
.geometry = undefined,
|
|
||||||
} });
|
} });
|
||||||
errdefer view.destroy();
|
errdefer view.destroy();
|
||||||
|
|
||||||
view.impl.xdg_toplevel.view = view;
|
view.impl.xdg_toplevel.view = view;
|
||||||
xdg_toplevel.base.getGeometry(&view.impl.xdg_toplevel.geometry);
|
|
||||||
|
|
||||||
_ = try view.surface_tree.createSceneXdgSurface(xdg_toplevel.base);
|
_ = 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_title.add(&self.set_title);
|
||||||
self.xdg_toplevel.events.set_app_id.add(&self.set_app_id);
|
self.xdg_toplevel.events.set_app_id.add(&self.set_app_id);
|
||||||
|
|
||||||
var geometry: wlr.Box = undefined;
|
self.xdg_toplevel.base.getGeometry(&self.geometry);
|
||||||
self.xdg_toplevel.base.getGeometry(&geometry);
|
|
||||||
|
|
||||||
view.pending.box = .{
|
view.pending.box = .{
|
||||||
.x = 0,
|
.x = 0,
|
||||||
.y = 0,
|
.y = 0,
|
||||||
.width = geometry.width,
|
.width = self.geometry.width,
|
||||||
.height = geometry.height,
|
.height = self.geometry.height,
|
||||||
};
|
};
|
||||||
view.inflight.box = view.pending.box;
|
view.inflight.box = view.pending.box;
|
||||||
view.current.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;
|
const old_geometry = self.geometry;
|
||||||
self.xdg_toplevel.base.getGeometry(&new_geometry);
|
self.xdg_toplevel.base.getGeometry(&self.geometry);
|
||||||
|
const size_changed = self.geometry.width != old_geometry.width or
|
||||||
const size_changed = !std.meta.eql(self.geometry, new_geometry);
|
self.geometry.height != old_geometry.height;
|
||||||
self.geometry = new_geometry;
|
|
||||||
|
|
||||||
if (view.inflight_serial != null) {
|
if (view.inflight_serial != null) {
|
||||||
if (self.acked_inflight_serial) {
|
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
|
} else if (size_changed and !view.current.fullscreen and
|
||||||
(view.current.float or view.current.output == null or view.current.output.?.layout == null))
|
(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,
|
// If the client has decided to resize itself and the view is floating,
|
||||||
// then respect that resize.
|
// then respect that resize.
|
||||||
view.current.box.width = new_geometry.width;
|
view.current.box.width = self.geometry.width;
|
||||||
view.current.box.height = new_geometry.height;
|
view.current.box.height = self.geometry.height;
|
||||||
view.pending.box.width = new_geometry.width;
|
view.pending.box.width = self.geometry.width;
|
||||||
view.pending.box.height = new_geometry.height;
|
view.pending.box.height = self.geometry.height;
|
||||||
server.root.applyPending();
|
server.root.applyPending();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user