75c113909d
- Adds fyne.io/systray with a programmatic monkey face icon and Quit menu item - Logs to discord-lobby-mute.log next to the exe so startup errors are visible without a console window - Windows now uses raw Win32 RegisterHotKey in a locked goroutine instead of golang.design/x/hotkey, avoiding a deadlock where systray and the hotkey library both try to own the main thread message loop - Build with: GOOS=windows GOARCH=amd64 go build -ldflags "-H windowsgui" -o discord-lobby-mute.exe . Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/color"
|
|
"image/png"
|
|
)
|
|
|
|
func monkeyIcon() []byte {
|
|
const size = 32
|
|
img := image.NewRGBA(image.Rect(0, 0, size, size))
|
|
|
|
brown := color.RGBA{110, 72, 38, 255}
|
|
tan := color.RGBA{210, 175, 130, 255}
|
|
pink := color.RGBA{190, 130, 110, 255}
|
|
dark := color.RGBA{15, 8, 3, 255}
|
|
white := color.RGBA{255, 255, 255, 255}
|
|
|
|
// Ears drawn first so the head circle overlaps the inner edge naturally.
|
|
fillCircle(img, 4, 13, 5, brown)
|
|
fillCircle(img, 28, 13, 5, brown)
|
|
fillCircle(img, 4, 13, 3, pink)
|
|
fillCircle(img, 28, 13, 3, pink)
|
|
|
|
fillCircle(img, 16, 15, 13, brown) // head
|
|
|
|
fillEllipse(img, 16, 21, 7, 4, tan) // muzzle
|
|
|
|
// Eyes: light surround, dark iris, white highlight.
|
|
fillCircle(img, 11, 12, 3, tan)
|
|
fillCircle(img, 21, 12, 3, tan)
|
|
fillCircle(img, 11, 12, 2, dark)
|
|
fillCircle(img, 21, 12, 2, dark)
|
|
fillCircle(img, 12, 11, 1, white)
|
|
fillCircle(img, 22, 11, 1, white)
|
|
|
|
// Nostrils.
|
|
fillCircle(img, 14, 21, 1, dark)
|
|
fillCircle(img, 18, 21, 1, dark)
|
|
|
|
var buf bytes.Buffer
|
|
_ = png.Encode(&buf, img)
|
|
return buf.Bytes()
|
|
}
|
|
|
|
func fillCircle(img *image.RGBA, cx, cy, r int, c color.RGBA) {
|
|
for y := cy - r; y <= cy+r; y++ {
|
|
for x := cx - r; x <= cx+r; x++ {
|
|
dx, dy := x-cx, y-cy
|
|
if dx*dx+dy*dy <= r*r {
|
|
img.SetRGBA(x, y, c)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func fillEllipse(img *image.RGBA, cx, cy, rx, ry int, c color.RGBA) {
|
|
for y := cy - ry; y <= cy+ry; y++ {
|
|
for x := cx - rx; x <= cx+rx; x++ {
|
|
dx := float64(x-cx) / float64(rx)
|
|
dy := float64(y-cy) / float64(ry)
|
|
if dx*dx+dy*dy <= 1.0 {
|
|
img.SetRGBA(x, y, c)
|
|
}
|
|
}
|
|
}
|
|
}
|