From 8c0b65220aa86f02b06bb3fa58df7e7a40cf244a Mon Sep 17 00:00:00 2001 From: Ixniy Evonniy Date: Wed, 1 Jul 2026 00:28:03 +0300 Subject: [PATCH] feat: sensible icons --- cache.db | Bin 32768 -> 32768 bytes main.jai | 25 ++++++++++++++++++++++--- win32.jai | 22 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/cache.db b/cache.db index 7167119e4ec31f6ba9905a6d9520731430cdcf9d..8e64342324fae99c1c9d5fa2c317ae0a1c5f1a9d 100644 GIT binary patch delta 58 zcmZo@U}|V!n&2Ry!~g-_jFZ+oPygewSx{jE|0Dqi0cEJfo9bQD?(^@s0hU;#kN^P7 C9uZ^! delta 58 zcmZo@U}|V!n&2RyzyJZ9xtnJia LRESUL } } +load_stock_icon :: (siid: s32) -> HICON { + sii: SHSTOCKICONINFO; + sii.cbSize = size_of(SHSTOCKICONINFO); + hr := SHGetStockIconInfo(siid, SHGSI_ICON | SHGSI_SMALLICON, *sii); + if hr == 0 { // S_OK + return sii.hIcon; + } + // Fallback to default application icon + return LoadIconW(null, IDI_APPLICATION); +} + main :: () { hInstance := GetModuleHandleW(null); class_name := utf8_to_wide("SingboxTrayControllerClass"); @@ -488,6 +502,8 @@ main :: () { defer UnregisterClassW(class_name, hInstance); app_state: App_State; + app_state.icon_running = load_stock_icon(SIID_WORLD); + app_state.icon_stopped = load_stock_icon(SIID_ERROR); hwnd := CreateWindowExW( 0, @@ -534,7 +550,7 @@ main :: () { nid.uID = 1; nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; nid.uCallbackMessage = WM_TRAY_CALLBACK; - nid.hIcon = LoadIconW(null, IDI_APPLICATION); + nid.hIcon = app_state.icon_stopped; set_tray_tip(*nid, "Sing-box: Stopped"); if !Shell_NotifyIconW(NIM_ADD, *nid) { @@ -574,4 +590,7 @@ main :: () { } stop_singbox(*app_state); + + if app_state.icon_running DestroyIcon(app_state.icon_running); + if app_state.icon_stopped DestroyIcon(app_state.icon_stopped); } diff --git a/win32.jai b/win32.jai index 4c62375..9d88e67 100644 --- a/win32.jai +++ b/win32.jai @@ -199,6 +199,28 @@ HttpQueryInfoW :: ( lpdwIndex: *DWORD ) -> BOOL #foreign wininet; +SHSTOCKICONINFO :: struct { + cbSize: DWORD; + hIcon: HICON; + iSysImageIndex: s32; + iIcon: s32; + szPath: [260] u16; +} + +SIID_WORLD :: 13; +SIID_ERROR :: 80; + +SHGSI_ICON :: 0x00000100; +SHGSI_SMALLICON :: 0x00000001; + +SHGetStockIconInfo :: ( + siid: s32, + uFlags: u32, + psii: *SHSTOCKICONINFO +) -> s32 #foreign shell32; + +DestroyIcon :: (hIcon: HICON) -> BOOL #foreign user32; + wcslen :: (str: *u16) -> int { len := 0; while str[len] != 0 {