fix(wayland): only emit toplevel_sized_changed when it changes

This commit is contained in:
Nova
2024-07-04 20:31:54 -04:00
parent a9ff97e39c
commit a7df6d8a08
2 changed files with 48 additions and 65 deletions

66
Cargo.lock generated
View File

@@ -469,9 +469,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.0.101"
version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d"
checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490"
[[package]]
name = "cesu8"
@@ -485,12 +485,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
@@ -509,9 +503,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.7"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f"
checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d"
dependencies = [
"clap_builder",
"clap_derive",
@@ -519,9 +513,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.7"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f"
checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708"
dependencies = [
"anstream",
"anstyle",
@@ -531,9 +525,9 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.5"
version = "4.5.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6"
checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085"
dependencies = [
"heck",
"proc-macro2",
@@ -1382,9 +1376,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.21"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "loom"
@@ -1572,19 +1566,6 @@ dependencies = [
"memoffset",
]
[[package]]
name = "nix"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4"
dependencies = [
"bitflags 2.6.0",
"cfg-if",
"cfg_aliases 0.1.1",
"libc",
"memoffset",
]
[[package]]
name = "nix"
version = "0.29.0"
@@ -1593,8 +1574,9 @@ checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46"
dependencies = [
"bitflags 2.6.0",
"cfg-if",
"cfg_aliases 0.2.1",
"cfg_aliases",
"libc",
"memoffset",
]
[[package]]
@@ -2205,9 +2187,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.118"
version = "1.0.120"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4"
checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5"
dependencies = [
"itoa",
"ryu",
@@ -2303,7 +2285,7 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "smithay"
version = "0.3.0"
source = "git+https://github.com/smithay/smithay.git#9ff96ea35fe5a524819e091c0d0e98f075159233"
source = "git+https://github.com/smithay/smithay.git#3731734d5a0409186a0475238ffe46e2835cee6d"
dependencies = [
"appendlist",
"bitflags 2.6.0",
@@ -3304,9 +3286,9 @@ checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193"
[[package]]
name = "zbus"
version = "4.3.0"
version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23915fcb26e7a9a9dc05fd93a9870d336d6d032cd7e8cebf1c5c37666489fdd5"
checksum = "851238c133804e0aa888edf4a0229481c753544ca12a60fd1c3230c8a500fe40"
dependencies = [
"async-broadcast",
"async-executor",
@@ -3324,7 +3306,7 @@ dependencies = [
"futures-sink",
"futures-util",
"hex",
"nix 0.28.0",
"nix 0.29.0",
"ordered-stream",
"rand",
"serde",
@@ -3343,9 +3325,9 @@ dependencies = [
[[package]]
name = "zbus_macros"
version = "4.3.0"
version = "4.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02bcca0b586d2f8589da32347b4784ba424c4891ed86aa5b50d5e88f6b2c4f5d"
checksum = "8d5a3f12c20bd473be3194af6b49d50d7bb804ef3192dc70eddedb26b85d9da7"
dependencies = [
"proc-macro-crate 3.1.0",
"proc-macro2",
@@ -3367,9 +3349,9 @@ dependencies = [
[[package]]
name = "zvariant"
version = "4.1.1"
version = "4.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aa6d31a02fbfb602bfde791de7fedeb9c2c18115b3d00f3a36e489f46ffbbc7"
checksum = "1724a2b330760dc7d2a8402d841119dc869ef120b139d29862d6980e9c75bfc9"
dependencies = [
"endi",
"enumflags2",
@@ -3380,9 +3362,9 @@ dependencies = [
[[package]]
name = "zvariant_derive"
version = "4.1.1"
version = "4.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "642bf1b6b6d527988b3e8193d20969d53700a36eac734d21ae6639db168701c8"
checksum = "55025a7a518ad14518fb243559c058a2e5b848b015e31f1d90414f36e3317859"
dependencies = [
"proc-macro-crate 3.1.0",
"proc-macro2",

View File

@@ -31,8 +31,8 @@ use smithay::{
wayland::{
compositor,
shell::xdg::{
Configure, PopupSurface, PositionerState, ShellClient, SurfaceCachedState,
ToplevelSurface, XdgShellHandler, XdgShellState, XdgToplevelSurfaceData,
PopupSurface, PositionerState, ShellClient, SurfaceCachedState, ToplevelSurface,
XdgShellHandler, XdgShellState, XdgToplevelSurfaceData,
},
},
};
@@ -87,6 +87,7 @@ impl XdgShellHandler for WaylandState {
});
toplevel.send_configure();
utils::insert_data(toplevel.wl_surface(), SurfaceId::Toplevel);
utils::insert_data(toplevel.wl_surface(), Mutex::new(Vector2::from([0_u32; 2])));
CoreSurface::add_to(
toplevel.wl_surface(),
{
@@ -118,10 +119,19 @@ impl XdgShellHandler for WaylandState {
else {
return;
};
let Some(old_size) =
utils::get_data::<Mutex<Vector2<u32>>>(toplevel.wl_surface())
else {
return;
};
let mut old_size = old_size.lock();
let Some(size) = core_surface.size() else {
return;
};
panel_item.toplevel_size_changed(size);
if *old_size != size {
panel_item.toplevel_size_changed(size);
*old_size = size;
}
}
},
);
@@ -191,9 +201,7 @@ impl XdgShellHandler for WaylandState {
let Some(panel_item) = surface_panel_item(&parent) else {
return;
};
if popup.send_configure().is_err() {
return;
}
let _ = popup.send_configure();
utils::insert_data(popup.wl_surface(), SurfaceId::Child(uid));
utils::insert_data(popup.wl_surface(), Arc::downgrade(&panel_item));
CoreSurface::add_to(
@@ -307,20 +315,6 @@ impl XdgShellHandler for WaylandState {
};
panel_item.toplevel_fullscreen_active(true);
}
fn ack_configure(&mut self, surface: WlSurface, configure: Configure) {
let Some(panel_item) = surface_panel_item(&surface) else {
return;
};
match configure {
Configure::Toplevel(t) => {
if let Some(size) = t.state.size {
panel_item.toplevel_size_changed([size.w as u32, size.h as u32].into())
}
}
Configure::Popup(_p) => (),
}
}
}
delegate_xdg_shell!(WaylandState);
@@ -357,7 +351,8 @@ impl XdgBackend {
self.popups.lock().insert(id, (popup, positioner));
panel_item.create_child(id, &self.child_data(id).unwrap());
let child_data = self.child_data(id).unwrap();
panel_item.create_child(id, &child_data);
}
pub fn reposition_popup(&self, id: u64, _popup: PopupSurface, positioner: PositionerState) {
let mut popups = self.popups.lock();
@@ -381,9 +376,13 @@ impl XdgBackend {
fn child_data(&self, id: u64) -> Option<ChildInfo> {
let (popup, positioner) = self.popups.lock().get(&id)?.clone();
let parent_surface = popup.get_parent_surface()?;
let parent = utils::get_data::<SurfaceId>(&parent_surface)?
.as_ref()
.clone();
Some(ChildInfo {
id,
parent: (*utils::get_data::<SurfaceId>(&popup.get_parent_surface()?)?).clone(),
parent,
geometry: positioner.get_geometry().into(),
})
}
@@ -546,7 +545,9 @@ impl Backend for XdgBackend {
let Some(toplevel) = self.toplevel.lock().clone() else {
return;
};
toplevel.with_pending_state(|s| s.size = Some((size.x as i32, size.y as i32).into()));
toplevel.with_pending_state(|s| {
s.size = Some((size.x.max(16) as i32, size.y.max(16) as i32).into())
});
toplevel.send_configure();
}
fn set_toplevel_focused_visuals(&self, focused: bool) {