joeylib2/scripts/verify-win32-icon.sh
2026-10-19 15:46:47 -05:00

48 lines
1.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
# See LICENSE.md for license information.
# SPDX-License-Identifier: MIT
#
# verify-win32-icon.sh - a Win32 program's icon on its window.
#
# make links every Win32 program's icon into it (make/win32.mk:
# tools/iconBake ico, 16, 32 and 48 pixels in 256 colors and in 32-bit,
# resource HOSTED_ICON_ID), and the backend gives its window class that
# icon. DRAW (examples/draw) runs under Wine (scripts/lib/wineGate.sh), which
# hands a window's class icon to X as its _NET_WM_ICON; that must be the
# baked 32x32 32-bit picture (tests/gate/netWmIcon.c).
#
# Usage: scripts/verify-win32-icon.sh
# Exit: 0 PASS, 1 FAIL, 2 SKIP (Wine not installed, or DRAW not built)
# Requires: Wine, Xvfb, xdotool, xprop; DRAW.EXE and its icon
# (make win32).
set -uo pipefail
repo=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
source "$repo/scripts/lib/joeyEnv.sh"
source "$repo/scripts/lib/wineGate.sh"
label=verify-win32-icon
wineNeed
program=$(joeyExampleProgram draw win32)
icon=$repo/build/win32/icon/DRAW/icon.ico
# The size Wine gives X: the class's icon, Windows' standard icon size.
ICON_SIZE=32
[ -f "$program" ] && [ -f "$icon" ] || { echo "$label: build DRAW.EXE first (make win32)" >&2; exit 2; }
work=$(mktemp -d -t joeylib-win32-icon.XXXXXX)
cleanup() {
wineStop
rm -rf "$work"
}
trap cleanup EXIT
mkdir -p "$work/program"
cp "$program" "$work/program/DRAW.EXE"
wineStart "$work"
wineRun "$work/program/DRAW.EXE"
win=$(wineWindow DRAW) || { echo "$label: FAIL - DRAW's window never appeared" >&2; exit 1; }
# Wine sets the property as the window is mapped; a moment for it.
sleep 2
xprop -id "$win" -f _NET_WM_ICON 32c ' = $0+' _NET_WM_ICON > "$work/icon.txt" 2>&1
"$(joeyTool netWmIcon)" "$work/icon.txt" "$icon" "$ICON_SIZE" "$label"