修复图标显示

This commit is contained in:
2026-07-07 17:58:04 +08:00
parent 9a1aca5d1b
commit 019df7bc23
4 changed files with 64 additions and 3 deletions
+2
View File
@@ -8,6 +8,8 @@
*.app
*.dmg
*.exe
*.syso
resources/icon.ico
# Go
/vendor/
+10 -3
View File
@@ -10,10 +10,10 @@ APP_BUNDLE = $(APP_NAME).app
GO = go
CGO_ENABLED = 1
GIT_HASH = $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
VERSION = 0.3.5-$(GIT_HASH)
VERSION = 0.3.6-$(GIT_HASH)
LDFLAGS = -s -w -X lmvpn/internal/version.Version=$(VERSION)
.PHONY: all build app run daemon clean vet tidy fmt icon build-windows
.PHONY: all build app run daemon clean vet tidy fmt icon icon-windows build-windows
## all: build the .app bundle (default)
all: app
@@ -81,8 +81,15 @@ fmt:
clean:
rm -rf $(BUILD_DIR) $(APP_BUNDLE)
## icon-windows: generate icon.ico and compile Windows resource (.syso)
icon-windows:
go run resources/genico/main.go
x86_64-w64-mingw32-windres -i resources/lmvpn.rc -O coff -o cmd/lmvpn/resource_windows_amd64.syso
x86_64-w64-mingw32-windres -i resources/lmvpn.rc -O coff -o cmd/lmvpnd/resource_windows_amd64.syso
@echo "Generated Windows icon resources"
## build-windows: cross-compile Windows x86_64 exes (requires mingw-w64)
build-windows:
build-windows: icon-windows
mkdir -p $(BUILD_DIR)
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc \
$(GO) build -ldflags "$(LDFLAGS) -H windowsgui" -o $(BUILD_DIR)/$(GUI_BIN).exe ./cmd/lmvpn
+51
View File
@@ -0,0 +1,51 @@
// genico converts resources/icon.png into a Windows .ico file using the
// PNG-in-ICO format (the PNG bytes are wrapped in a minimal ICO container
// without decoding/re-encoding). Works on Windows Vista and later.
//
// Run: go run resources/genico/main.go
package main
import (
"encoding/binary"
"fmt"
"os"
)
func main() {
pngData, err := os.ReadFile("resources/icon.png")
if err != nil {
fmt.Fprintf(os.Stderr, "genico: %v\n", err)
os.Exit(1)
}
// ICO header (6 bytes) + one directory entry (16 bytes) = 22 bytes overhead.
const headerSize = 6
const entrySize = 16
dataOffset := uint32(headerSize + entrySize)
ico := make([]byte, 0, headerSize+entrySize+len(pngData))
// ICONDIR
ico = binary.LittleEndian.AppendUint16(ico, 0) // reserved
ico = binary.LittleEndian.AppendUint16(ico, 1) // type = icon
ico = binary.LittleEndian.AppendUint16(ico, 1) // count = 1 image
// ICONDIRENTRY
ico = append(ico, 0) // width (0 = 256+, actual size in PNG header)
ico = append(ico, 0) // height (0 = 256+, actual size in PNG header)
ico = append(ico, 0) // color count (0 = ≥256 colors)
ico = append(ico, 0) // reserved
ico = binary.LittleEndian.AppendUint16(ico, 1) // planes
ico = binary.LittleEndian.AppendUint16(ico, 32) // bit count
ico = binary.LittleEndian.AppendUint32(ico, uint32(len(pngData)))
ico = binary.LittleEndian.AppendUint32(ico, dataOffset)
// PNG image data
ico = append(ico, pngData...)
if err := os.WriteFile("resources/icon.ico", ico, 0644); err != nil {
fmt.Fprintf(os.Stderr, "genico: %v\n", err)
os.Exit(1)
}
fmt.Println("Generated resources/icon.ico")
}
+1
View File
@@ -0,0 +1 @@
LMVPN ICON "resources/icon.ico"