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

View File

@@ -31,8 +31,8 @@ use smithay::{
wayland::{ wayland::{
compositor, compositor,
shell::xdg::{ shell::xdg::{
Configure, PopupSurface, PositionerState, ShellClient, SurfaceCachedState, PopupSurface, PositionerState, ShellClient, SurfaceCachedState, ToplevelSurface,
ToplevelSurface, XdgShellHandler, XdgShellState, XdgToplevelSurfaceData, XdgShellHandler, XdgShellState, XdgToplevelSurfaceData,
}, },
}, },
}; };
@@ -87,6 +87,7 @@ impl XdgShellHandler for WaylandState {
}); });
toplevel.send_configure(); toplevel.send_configure();
utils::insert_data(toplevel.wl_surface(), SurfaceId::Toplevel); utils::insert_data(toplevel.wl_surface(), SurfaceId::Toplevel);
utils::insert_data(toplevel.wl_surface(), Mutex::new(Vector2::from([0_u32; 2])));
CoreSurface::add_to( CoreSurface::add_to(
toplevel.wl_surface(), toplevel.wl_surface(),
{ {
@@ -118,10 +119,19 @@ impl XdgShellHandler for WaylandState {
else { else {
return; 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 { let Some(size) = core_surface.size() else {
return; 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 { let Some(panel_item) = surface_panel_item(&parent) else {
return; return;
}; };
if popup.send_configure().is_err() { let _ = popup.send_configure();
return;
}
utils::insert_data(popup.wl_surface(), SurfaceId::Child(uid)); utils::insert_data(popup.wl_surface(), SurfaceId::Child(uid));
utils::insert_data(popup.wl_surface(), Arc::downgrade(&panel_item)); utils::insert_data(popup.wl_surface(), Arc::downgrade(&panel_item));
CoreSurface::add_to( CoreSurface::add_to(
@@ -307,20 +315,6 @@ impl XdgShellHandler for WaylandState {
}; };
panel_item.toplevel_fullscreen_active(true); 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); delegate_xdg_shell!(WaylandState);
@@ -357,7 +351,8 @@ impl XdgBackend {
self.popups.lock().insert(id, (popup, positioner)); 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) { pub fn reposition_popup(&self, id: u64, _popup: PopupSurface, positioner: PositionerState) {
let mut popups = self.popups.lock(); let mut popups = self.popups.lock();
@@ -381,9 +376,13 @@ impl XdgBackend {
fn child_data(&self, id: u64) -> Option<ChildInfo> { fn child_data(&self, id: u64) -> Option<ChildInfo> {
let (popup, positioner) = self.popups.lock().get(&id)?.clone(); 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 { Some(ChildInfo {
id, id,
parent: (*utils::get_data::<SurfaceId>(&popup.get_parent_surface()?)?).clone(), parent,
geometry: positioner.get_geometry().into(), geometry: positioner.get_geometry().into(),
}) })
} }
@@ -546,7 +545,9 @@ impl Backend for XdgBackend {
let Some(toplevel) = self.toplevel.lock().clone() else { let Some(toplevel) = self.toplevel.lock().clone() else {
return; 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(); toplevel.send_configure();
} }
fn set_toplevel_focused_visuals(&self, focused: bool) { fn set_toplevel_focused_visuals(&self, focused: bool) {