From 84a43a2e6afbdfab92c610d47aa75e3876ffacd6 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Thu, 12 Mar 2026 13:48:25 -0500 Subject: Replace wrestool with native Rust PE icon extraction (pelite) - Add icons.rs to nak crate: parses PE resource sections, extracts RT_GROUP_ICON/RT_ICON and builds ICO files in memory - Expose nak_extract_exe_icon() FFI for C++ consumption - Update iconForExecutable() to use Rust FFI instead of shelling out to wrestool; reads all ICO entries for correct color depth - Fix BasicGamePlugin::gameIcon() to call iconForExecutable() (was returning empty QIcon, causing placeholder icons for BG3/Cyberpunk) - Move app icon setup: setDesktopFileName + setWindowIcon to MOApplication constructor (fixes Wayland taskbar/decoration icon) - Move data/com.fluorine.* to data/icons/, install to XDG paths at launch for Wayland compositor icon resolution - Remove icoutils dependency from Docker image and build output Co-Authored-By: Claude Opus 4.6 --- docker/build-inner.sh | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'docker/build-inner.sh') diff --git a/docker/build-inner.sh b/docker/build-inner.sh index 0f6fcdb..0c0fbc7 100755 --- a/docker/build-inner.sh +++ b/docker/build-inner.sh @@ -50,9 +50,7 @@ cp -f "${RUNDIR}/ModOrganizer" "${OUT_DIR}/ModOrganizer-core" LOOTCLI="build/libs/lootcli/src/lootcli" [ -f "${LOOTCLI}" ] && cp -f "${LOOTCLI}" "${OUT_DIR}/" -for tool in wrestool icotool; do - command -v "${tool}" >/dev/null 2>&1 && cp -f "$(command -v "${tool}")" "${OUT_DIR}/" -done +# wrestool/icotool no longer needed — icon extraction is built into libnak_ffi.so (pelite) # ── MO2 plugins (.so) ── find build/libs -type f \( \ @@ -216,7 +214,7 @@ strip --strip-unneeded "${OUT_DIR}/ModOrganizer-core" 2>/dev/null || true find "${OUT_DIR}/plugins" -name "*.so" -exec strip --strip-unneeded {} \; 2>/dev/null || true find "${OUT_DIR}/dlls" -name "*.so" -o -name "*.dll" | xargs -r strip --strip-unneeded 2>/dev/null || true find "${OUT_DIR}/lib" -name "*.so" -exec strip --strip-unneeded {} \; 2>/dev/null || true -for tool in wrestool icotool lootcli; do +for tool in lootcli; do [ -f "${OUT_DIR}/${tool}" ] && strip --strip-unneeded "${OUT_DIR}/${tool}" 2>/dev/null || true done @@ -269,6 +267,21 @@ if [ "${HERE_REAL}" != "${DST_REAL}" ]; then fi fi +# ── Install icon + desktop file for Wayland taskbar/decoration ── +ICON_SRC="${BIN_DST}/icons/com.fluorine.manager.png" +ICON_DST="${HOME}/.local/share/icons/hicolor/256x256/apps/com.fluorine.manager.png" +DESKTOP_SRC="${BIN_DST}/icons/com.fluorine.manager.desktop" +DESKTOP_DST="${HOME}/.local/share/applications/com.fluorine.manager.desktop" +if [ -f "${ICON_SRC}" ] && [ ! -f "${ICON_DST}" ]; then + mkdir -p "$(dirname "${ICON_DST}")" + cp -f "${ICON_SRC}" "${ICON_DST}" +fi +if [ -f "${DESKTOP_SRC}" ] && [ ! -f "${DESKTOP_DST}" ]; then + mkdir -p "$(dirname "${DESKTOP_DST}")" + sed "s|^Exec=fluorine-manager|Exec=${BIN_DST}/fluorine-manager|" "${DESKTOP_SRC}" > "${DESKTOP_DST}" + chmod +x "${DESKTOP_DST}" +fi + # Run from the synced location. RUN="${BIN_DST}" @@ -295,9 +308,10 @@ Plugins = qt6plugins QTCONF # ── Desktop integration files ── -cp -f /src/data/com.fluorine.manager.desktop "${OUT_DIR}/" -cp -f /src/data/com.fluorine.manager.png "${OUT_DIR}/" -cp -f /src/data/com.fluorine.manager.metainfo.xml "${OUT_DIR}/" +mkdir -p "${OUT_DIR}/icons" +cp -f /src/data/icons/com.fluorine.manager.desktop "${OUT_DIR}/icons/" +cp -f /src/data/icons/com.fluorine.manager.png "${OUT_DIR}/icons/" +cp -f /src/data/icons/com.fluorine.manager.metainfo.xml "${OUT_DIR}/icons/" # ── Determine build mode ── # BUILD_MODE is passed from build.sh: tarball (default), installer, appimage, all @@ -366,7 +380,7 @@ case "${CHOICE}" in # Create desktop shortcut mkdir -p "${DESKTOP_DIR}" "${ICON_DIR}" - cp -f "${INSTALL_DIR}/com.fluorine.manager.png" "${ICON_DIR}/" + cp -f "${INSTALL_DIR}/icons/com.fluorine.manager.png" "${ICON_DIR}/" cat > "${DESKTOP_DIR}/com.fluorine.manager.desktop" <