aboutsummaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-03-12 13:48:25 -0500
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-03-12 13:48:25 -0500
commit84a43a2e6afbdfab92c610d47aa75e3876ffacd6 (patch)
treeea624ec287181905441fbf1247c645976bdb8fc9 /docker
parent3ba283d9350783c038cc2844450f4938ad125f08 (diff)
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 <noreply@anthropic.com>
Diffstat (limited to 'docker')
-rw-r--r--docker/Dockerfile2
-rwxr-xr-xdocker/build-inner.sh36
2 files changed, 26 insertions, 12 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
index d197569..5ab99dc 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -35,7 +35,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
# Python
python3 python3-pip python3-pyqt6 \
# Misc
- icoutils zip unzip \
+ zip unzip \
&& rm -rf /var/lib/apt/lists/*
# ── Qt 6.10 via aqtinstall ──
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" <<DESKTOP_EOF
[Desktop Entry]
@@ -458,9 +472,9 @@ build_appimage() {
cp -a "${APPDIR}/usr/bin/qt6plugins"/. "${APPDIR}/usr/plugins/"
fi
- cp -f "${OUT_DIR}/com.fluorine.manager.desktop" "${APPDIR}/usr/share/applications/"
- cp -f "${OUT_DIR}/com.fluorine.manager.png" "${APPDIR}/usr/share/icons/hicolor/256x256/apps/"
- cp -f "${OUT_DIR}/com.fluorine.manager.metainfo.xml" "${APPDIR}/usr/share/metainfo/"
+ cp -f "${OUT_DIR}/icons/com.fluorine.manager.desktop" "${APPDIR}/usr/share/applications/"
+ cp -f "${OUT_DIR}/icons/com.fluorine.manager.png" "${APPDIR}/usr/share/icons/hicolor/256x256/apps/"
+ cp -f "${OUT_DIR}/icons/com.fluorine.manager.metainfo.xml" "${APPDIR}/usr/share/metainfo/"
mkdir -p "${APPDIR}/usr/share/icons"
for theme_dir in /usr/share/icons/*; do