From fad5c5edbac16b4dd610cb670d2fa1fe611eaeff Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Fri, 22 Aug 2025 18:57:05 -0600 Subject: [PATCH 1/5] Fix an issue with top-level submenus where there was extra padding for icons, even when there wasn't any icon --- src/platform_impl/gtk/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/platform_impl/gtk/mod.rs b/src/platform_impl/gtk/mod.rs index 18bce50c..e8897bf0 100644 --- a/src/platform_impl/gtk/mod.rs +++ b/src/platform_impl/gtk/mod.rs @@ -130,8 +130,12 @@ impl Menu { return_if_item_not_supported!(item); for (menu_id, menu_bar) in self.gtk_menubars.iter().filter(|m| *m.0 == id) { + let has_icon = matches!( + item.kind(), + MenuItemKind::Submenu(submenu) if submenu.inner.borrow().icon.is_some() + ); let gtk_item = - item.make_gtk_menu_item(*menu_id, self.accel_group.as_ref(), true, true)?; + item.make_gtk_menu_item(*menu_id, self.accel_group.as_ref(), true, has_icon)?; menu_bar.append(>k_item); gtk_item.show(); } From 87dffbc87f9c46aa07d3840e2bd34bb72cb176b9 Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:01:10 -0600 Subject: [PATCH 2/5] Fix clippy errors --- src/platform_impl/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform_impl/mod.rs b/src/platform_impl/mod.rs index 17018a33..d3908f28 100644 --- a/src/platform_impl/mod.rs +++ b/src/platform_impl/mod.rs @@ -88,7 +88,7 @@ impl MenuItemKind { } } - pub(crate) fn child(&self) -> Ref { + pub(crate) fn child(&self) -> Ref<'_, MenuChild> { match self { MenuItemKind::MenuItem(i) => i.inner.borrow(), MenuItemKind::Submenu(i) => i.inner.borrow(), @@ -98,7 +98,7 @@ impl MenuItemKind { } } - pub(crate) fn child_mut(&self) -> RefMut { + pub(crate) fn child_mut(&self) -> RefMut<'_, MenuChild> { match self { MenuItemKind::MenuItem(i) => i.inner.borrow_mut(), MenuItemKind::Submenu(i) => i.inner.borrow_mut(), From d8cfcf04214abfc9a09a19443e7e141bccbd0024 Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:21:13 -0600 Subject: [PATCH 3/5] Add change file --- .changes/fix-top-level-submenu-padding-issue.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changes/fix-top-level-submenu-padding-issue.md diff --git a/.changes/fix-top-level-submenu-padding-issue.md b/.changes/fix-top-level-submenu-padding-issue.md new file mode 100644 index 00000000..b043d0b3 --- /dev/null +++ b/.changes/fix-top-level-submenu-padding-issue.md @@ -0,0 +1,5 @@ +--- +"muda": patch +--- + +Fix padding unconditionally added to top-level submenus for icons even when there's no icon on Linux From 37cf4b2c4b2129e40e01edb42927095145f60e48 Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Tue, 21 Oct 2025 12:18:46 -0600 Subject: [PATCH 4/5] Address @amrbashir's review --- src/platform_impl/gtk/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/platform_impl/gtk/mod.rs b/src/platform_impl/gtk/mod.rs index e8897bf0..fab5c875 100644 --- a/src/platform_impl/gtk/mod.rs +++ b/src/platform_impl/gtk/mod.rs @@ -130,12 +130,8 @@ impl Menu { return_if_item_not_supported!(item); for (menu_id, menu_bar) in self.gtk_menubars.iter().filter(|m| *m.0 == id) { - let has_icon = matches!( - item.kind(), - MenuItemKind::Submenu(submenu) if submenu.inner.borrow().icon.is_some() - ); let gtk_item = - item.make_gtk_menu_item(*menu_id, self.accel_group.as_ref(), true, has_icon)?; + item.make_gtk_menu_item(*menu_id, self.accel_group.as_ref(), true, true)?; menu_bar.append(>k_item); gtk_item.show(); } @@ -1031,7 +1027,9 @@ impl MenuChild { let _ = css_provider.load_from_data(theme.as_bytes()); style_context.add_provider(&css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION); } - box_container.pack_start(&image, false, false, 0); + if !for_menu_bar || self.icon.is_some() { + box_container.pack_start(&image, false, false, 0); + } box_container.pack_start(&label, true, true, 0); box_container.show_all(); @@ -1313,7 +1311,9 @@ impl MenuChild { let _ = css_provider.load_from_data(theme.as_bytes()); style_context.add_provider(&css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION); } - box_container.pack_start(&image, false, false, 0); + if !for_menu_bar || self.icon.is_some() { + box_container.pack_start(&image, false, false, 0); + } box_container.pack_start(&label, true, true, 0); box_container.show_all(); From 09d4c5a1bf0cd85a6100a2cb5ce616ad3c3aac1a Mon Sep 17 00:00:00 2001 From: signadou <39036502+signadou@users.noreply.github.com> Date: Wed, 22 Oct 2025 09:36:43 -0600 Subject: [PATCH 5/5] Make `set_icon` add/remove the icon widget from container as needed --- src/platform_impl/gtk/mod.rs | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/platform_impl/gtk/mod.rs b/src/platform_impl/gtk/mod.rs index fab5c875..1ea730e4 100644 --- a/src/platform_impl/gtk/mod.rs +++ b/src/platform_impl/gtk/mod.rs @@ -761,14 +761,32 @@ impl MenuChild { pub fn set_icon(&mut self, icon: Option) { self.icon.clone_from(&icon); - let pixbuf = icon.map(|i| i.inner.to_pixbuf_scale(16, 16)); + let pixbuf = icon.as_ref().map(|i| i.inner.to_pixbuf_scale(16, 16)); for items in self.gtk_menu_items.borrow().values() { for i in items { let box_container = i.child().unwrap().downcast::().unwrap(); - box_container.children()[0] - .downcast_ref::() - .unwrap() - .set_pixbuf(pixbuf.as_ref()) + let children = box_container.children(); + + // Check if the first child is an image (it might not be if the item + // was created for menu bar without an icon) + if let Some(image) = children + .first() + .and_then(|c| c.downcast_ref::()) + { + if icon.is_some() { + // Image exists and we're setting an icon, update it + image.set_pixbuf(pixbuf.as_ref()); + } else { + // Image exists but we're removing the icon, remove the widget to avoid padding + box_container.remove(image); + } + } else if icon.is_some() { + // No image widget exists yet, but we're setting an icon, so create one + let image = gtk::Image::from_pixbuf(pixbuf.as_ref()); + box_container.pack_start(&image, false, false, 0); + box_container.reorder_child(&image, 0); + image.show(); + } } } }