fix(linux): set the Wayland window app_id so the dock shows the icon

The AppImage ships both the .desktop file and the hicolor icon, yet the dock
button came up blank on Wayland. A Wayland compositor has no StartupWMClass to
key on — it matches a window's app_id against the basename of an installed
.desktop file to find its icon — and iced defaults window app_id to an empty
string, which OCS never overrode, so nothing matched.

Set application_id to the reverse-DNS id the .desktop is installed under,
reusing the existing file_association::APP_ID const rather than a second copy.

iced enables both the x11 and wayland winit backends by default and feeds the
same application_id to each: on Wayland it is the app_id, on X11 it becomes
WM_CLASS. So this also changes the X11 WM_CLASS, and the old
StartupWMClass=OpenCADStudio would no longer match — realign it to the same id
so X11 keeps working too.

Confirmed on COSMIC/Wayland: the dock icon now appears. This is the Linux half
of the same class of bug as the Windows taskbar report (#392, still open): the
window not carrying the identity the OS needs to find its packaged icon.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-07-16 10:47:11 +03:00
commit 49cd0809a2
3 changed files with 17 additions and 5 deletions

View file

@ -8,4 +8,4 @@ Type=Application
Categories=Graphics;Engineering; Categories=Graphics;Engineering;
MimeType=image/vnd.dwg;image/vnd.dxf; MimeType=image/vnd.dwg;image/vnd.dxf;
Keywords=CAD;DWG;DXF;drawing;design;engineering;2D;3D; Keywords=CAD;DWG;DXF;drawing;design;engineering;2D;3D;
StartupWMClass=OpenCADStudio StartupWMClass=io.github.HakanSeven12.OpenCadStudio

View file

@ -2501,6 +2501,17 @@ impl OpenCADStudio {
maximized: true, maximized: true,
icon: window::icon::from_rgba(build_window_icon(), 32, 32).ok(), icon: window::icon::from_rgba(build_window_icon(), 32, 32).ok(),
exit_on_close_request: false, exit_on_close_request: false,
// A Wayland compositor has no StartupWMClass to go on: it resolves a
// window's dock icon by matching the window's app_id against the
// basename of an installed .desktop file. iced defaults the id to an
// empty string, so nothing matched and the dock button came up blank
// even though the AppImage ships both the .desktop and the icon.
// (X11 uses the .desktop's StartupWMClass and was unaffected.)
#[cfg(target_os = "linux")]
platform_specific: window::settings::PlatformSpecific {
application_id: crate::io::file_association::APP_ID.to_string(),
..Default::default()
},
..Default::default() ..Default::default()
}); });
let mut s = state; let mut s = state;

View file

@ -22,11 +22,12 @@
//! would otherwise block the iced executor; the result is delivered back //! would otherwise block the iced executor; the result is delivered back
//! through a oneshot channel that the async wrapper awaits. //! through a oneshot channel that the async wrapper awaits.
/// Reverse-DNS bundle / app id, shared by the macOS handler binding and the /// Reverse-DNS bundle / app id, shared by the macOS handler binding, the
/// Linux desktop-file name. Matches `CFBundleIdentifier` in packaging/Info.plist /// Linux desktop-file name and the Wayland window app_id. Matches
/// and the installed `*.desktop` basename. /// `CFBundleIdentifier` in packaging/Info.plist and the installed `*.desktop`
/// basename.
#[cfg(any(target_os = "macos", target_os = "linux"))] #[cfg(any(target_os = "macos", target_os = "linux"))]
const APP_ID: &str = "io.github.HakanSeven12.OpenCadStudio"; pub(crate) const APP_ID: &str = "io.github.HakanSeven12.OpenCadStudio";
/// Silently register this app as *a* handler (not necessarily the default) for /// Silently register this app as *a* handler (not necessarily the default) for
/// .dwg / .dxf, so it appears in the OS "Open with" list. Unlike /// .dwg / .dxf, so it appears in the OS "Open with" list. Unlike