rust-windowing / winit

Window handling library in pure Rust
https://docs.rs/winit/
Apache License 2.0
4.88k stars 911 forks source link

Add a windows specific method for setting the window icons based on the embedded exe icon. #3932

Open dtzxporter opened 2 months ago

dtzxporter commented 2 months ago

Description

Using the following code you can get the icon for the running process, then call WM_SETICON to apply it to any window. This prevents storing duplicate copies of the icon just to also reuse it for the window icon.

        let Ok(path) = std::env::current_exe() else {
            return 0;
        };

        let Ok(path) = U16CString::from_os_str(path.as_os_str()) else {
            return 0;
        };

        // SAFETY:
        // Path is checked to be a valid u16cstring above. The result is checked for errors where
        // 1 = not an icon or exe.
        // 0 = any other error.
        // While this obviously leaks the icon, the icon won't change for the lifetime of the program and can be used in more
        // than one window during the lifetime of the program.
        let icon = unsafe { ExtractIconW(GetModuleHandleW(std::ptr::null()), path.as_ptr(), 0) };

        if icon as usize <= 1 {
            return 0;
        }

Relevant platforms

Windows