From 48d99d76a1ebbb20605cca6e30c44ed481e0c4e5 Mon Sep 17 00:00:00 2001 From: Stanislav N Mikhailov Date: Fri, 27 Feb 2026 22:06:21 +0300 Subject: [PATCH] feat(tray): add Unicode sleep toggle menu and preserve tray tooltip on icon updates --- Puer.exe | Bin 150528 -> 152576 bytes include/template.inc | 62 +++++++++++++++++++++----------- res/rsrc.rc | 2 +- res/rsrc.res | Bin 144932 -> 144932 bytes src/Puer.asm | 83 ++++++++++++++++++++++++++++++++----------- 5 files changed, 106 insertions(+), 41 deletions(-) diff --git a/Puer.exe b/Puer.exe index fffaca5004b134ee223e0edbb5404c095dacae9d..003b6664d5498b6c86b8a0fddf72ff4582a00c38 100644 GIT binary patch delta 2117 zcmZ`)YfKbZ6uz^}r3<*TD>`DAg1ZQn*w#t|ZPOMN!XKe>k&K5b{qzlSW3W!RMGSvnL|C;t33J;#of3s1VfC_N`B zdali_oZ(Px#gmF>tzKo@B)RntjE$qGZSPB2y9*f8Vvc&6j45DPU5r;3=r78}N*a_O z@qHeF*sULu*Vr`@qP$%nlHK+#B*Y!2eo=Ny!}^STJ+<$b5MxX~!9Bs-8yGXy1B&pz zv5|xb30DCi5abs~HYP1$1j76x=!OI9C1+$5u}22kxMQ!_ z=PUtZj+PZfkO5L>LEHjz#DbJ9Lr^UsXz!W?g*_Hx!%7fBET)KUzRe{*#TMdDo*?o! zOs0C@0U^qNBwcuk^<;~b^qSO+pkbND$rR;t2x0KAG0wtKi&eUy92d$f7?Ci{Utu*M zR$pMnk$@KChphm^(4gR-iAinD5gCL4Hr2URFj;wMadjUMraB*l(%?tEj3Eq}#S~Xd zh4}`#Tm=(~0QfnQ!%Jq5bEPLP@PDvYGx%SKLHsmhg1|G=^A(7NPH|_1G+H>|LDN3R z(%`p1Ok^0eQv4pW!N0>uAq;*KD=Wnrtd>(ejU7;qX=sq*H8H7&o=Hkkek8?SAWYRR zGCb>fJi|AIHMo#L)X)>#gVkEB-nD#qOm&xtH32%5OD~Ghhg^`7Gjbgy(VN29Y~MZ8 zWGvd$KY8C(AeNP(a3F*{bzu4e{V6tbC?SV%=^c=O=@ddH&Ulb0RuhMqV+3YwpNc(9 zbu_^XwVi|mS(re7LY651fY4DshWt^DaWScF*-6z{!h3J5* z89`o+IP{x8jv=|(mk1DZtnmVjPd$GQ+>}O_c3i}OrglEB33zA5vw24 zjEa0vhF%=4iu^*-(EWz!10wna325qwgo>i8tFe_HF-#p2jXyC%+&pLGApv572gQC?+{?81g1*)1m3n@sXDE<%Hs zKf%!>I9`Mm98(a6ez*)kkgmj@bgOIM*!9}99kzGudOWSr-AwR!q`@>z@xH}oP4!FY zW~Rry+iX8eC)00x5??XgElft@tGsxejIE~)LM(K`t8#qCa_suLj4R4Pd=a*^Hg`9} zc(7#jRz^UQeEMETfvv-*2OZfE&N+%QeK1$Fz3pr7X!Rd%==8Vv^t+BC7+uQdY%4UBhn^+?pyWs9em^K8> zl%Hj_awS}g(QgmJydv*_y9U>Cxemd~U@L_!3%2dTR{ofcin<|XG_-lY6jm|^luT(% Z$+RuJEWI@Lhi3Ci^7#3O=LvLA`Ued53P%6{ delta 1393 zcmZ`(Z)h837=Q12ZkyU;FEK?^O;fgw-x?N!ui^=$4}a zkBmSs7M&rnOWq7m(t}^c7)zM`FX^zZ0K*1NUXO`qltA_*5qdS1J)pyBR zV2l;9;P;YmU3Q(ba8~Bp7%NS7NWt<$5+QaFqQY&|g2YuiT#37_#aqA*R{fI0bBchb z|DucdyNwm_^d9%=3luD^GNZFaMl}le1XOs902O|{n=y-D!hQyl66Qb%!38H+#|}YA zpNF;1vChKc3ITc2E$|s4n8xRH6sqd^F5(#W!*iQVRMipWY;_;S7NEa~O7Nc`zqD!_ z!F%KQ1fk}}gvIaR38GF|iv(^gt-Otk#E^Kfe3Ig&Ne%Owf@yIEuq(dcsQ(8NEPfZe ztNu1DSN$KbTIy#=Z-uWQ0`)hXL%sbl2|K=lh%XZ{#LppRtEVVNggF#y-H5F! zPN$0mZY&j6egx$)$i#?(})$+)W4uJQn7D!f7H3h(a1{aV}u4=mIINU4SEPFvS}6yu*FO~0mb|7Dz} zr0E}bdGRWN*Z04?Hwj(gdtKf+l(%>d`@aA3>JD$(M@;4iwI-Z%@pPwMnz*Y3TpJnFuZO-pHCe3y&x}m z#rM9g(Q{rZUryS#?cALCjji5Atg$3+M*2PsT+`ORFStskpyGxY7PvZysmO}8n9A{i zxyr?+;Kjf)5KoV$@+l;j`{ut3PD)Z-yc&K?jx$jRcfvUt?u*2c?oYq*%2;MppGao) zk+}FF+=pZ+($h)FK|M9P)5zxZ?3%ZGM9;*--ijQQ;`6^mj!N6~k<`vZsa%dF zjV0DmVrrE&bN5}FSsP|`6 mhtccLr9kwZKvb#+qVkPrrQZ6Tq#To!+H7OC9@{1VB>f9tziQ bmi BITMAPINFO <> rc RECT <> -RestoreString db "&Restore",0 -ExitString db "E&xit Program",0 -note TRAYICONDATAA <> +RestoreString dw "&","R","e","s","t","o","r","e",0 +ExitString dw 0412h,0026h,044bh,0445h,043eh,0434h,0 +EnableSleep dw 0420h,0430h,0437h,0440h,0435h,0448h,0438h,0442h,044ch,0020h,0441h,043eh,043dh,0 +DisableSleep dw 0417h,0430h,043fh,0440h,0435h,0442h,0438h,0442h,044ch,0020h,0441h,043eh,043dh,0 +note NOTIFYICONDATAW <> IDI_TRAY equ 1 IDM_RESTORE equ 1000 +IDM_ENABLESLEEP equ 1100 +IDM_DISABLESLEEP equ 1110 IDM_EXIT equ 1010 diff --git a/res/rsrc.rc b/res/rsrc.rc index 8d0b35d..df9cdba 100644 --- a/res/rsrc.rc +++ b/res/rsrc.rc @@ -27,7 +27,7 @@ BEGIN VALUE "OriginalFilename", "Puer.exe\000" VALUE "LegalCopyright", "\251 2025 Friends of Svetopaper\000" VALUE "ProductName", "Pu'er tea\000" - VALUE "ProductVersion", "1.0\000" + VALUE "ProductVersion", "1.2\000" END END diff --git a/res/rsrc.res b/res/rsrc.res index c95dc6f1fc4d44157d3a0770e1fe8845c4d8e21f..9e9e96ead75d0c4f1ef72a7b30e9aebecc3e9c78 100644 GIT binary patch delta 20 ccmZ4ThGWSaj)oS-ElhVz8I7jjHDz)K0AP#=A^-pY delta 20 ccmZ4ThGWSaj)oS-ElhVz84af2HDz)K0APR!AOHXW diff --git a/src/Puer.asm b/src/Puer.asm index d142fb3..1f681a7 100644 --- a/src/Puer.asm +++ b/src/Puer.asm @@ -19,8 +19,8 @@ WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:QWORD mov wc.hIconSm,rax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,rax - invoke RegisterClassEx, addr wc - invoke CreateWindowEx,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL + invoke RegisterClassExW, addr wc + invoke CreateWindowExW,NULL,ADDR szClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,282,0,1354,1017,NULL,NULL,hInst,NULL mov hwnd,rax invoke ShowWindow,hwnd,SW_HIDE @@ -38,9 +38,11 @@ WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hDC:HDC LOCAL pt:POINT + LOCAL trayMsg:DWORD + LOCAL trayId:DWORD .if uMsg==WM_DESTROY - invoke Shell_NotifyIconA,NIM_DELETE,addr note + invoke Shell_NotifyIconW,NIM_DELETE,addr note invoke DestroyMenu,hPopupMenu invoke SetThreadExecutionState,ES_CONTINUOUS invoke PostQuitMessage,NULL @@ -48,7 +50,10 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .elseif uMsg==WM_CREATE invoke CreatePopupMenu mov hPopupMenu,rax - invoke AppendMenuA,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString + invoke AppendMenuW,hPopupMenu,MF_STRING,IDM_DISABLESLEEP,addr DisableSleep + invoke AppendMenuW,hPopupMenu,MF_STRING,IDM_ENABLESLEEP,addr EnableSleep + invoke AppendMenuW,hPopupMenu,MF_SEPARATOR,0,NULL + invoke AppendMenuW,hPopupMenu,MF_STRING,IDM_EXIT,addr ExitString invoke LoadIcon,hInstance,IDI_ICON mov hIcon,rax @@ -57,16 +62,18 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM mov hIcon,rax .endif mov note.hIcon,rax - mov note.cbSize,SIZEOF TRAYICONDATAA + mov note.cbSize,SIZEOF NOTIFYICONDATAW mov rax,hWnd mov note.hWnd,rax mov note.uID,IDI_TRAY - mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP + mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP or NIF_SHOWTIP mov note.uCallbackMessage,WM_SHELLNOTIFY mov rax,hIcon mov note.hIcon,rax - invoke lstrcpyA,addr note.szTip,addr AppName - invoke Shell_NotifyIconA,NIM_ADD,addr note + invoke lstrcpynW,addr note.szTip,addr AppName,128 + invoke Shell_NotifyIconW,NIM_ADD,addr note + mov note.uTimeoutOrVersion,NOTIFYICON_VERSION_4 + invoke Shell_NotifyIconW,NIM_SETVERSION,addr note invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED .if rax==-1 @@ -79,16 +86,18 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .elseif uMsg==WM_SIZE .if wParam==SIZE_MINIMIZED - mov note.cbSize,SIZEOF TRAYICONDATAA + mov note.cbSize,SIZEOF NOTIFYICONDATAW mov rax,hWnd mov note.hWnd,rax mov note.uID,IDI_TRAY - mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP + mov note.uFlags,NIF_ICON or NIF_MESSAGE or NIF_TIP or NIF_SHOWTIP mov note.uCallbackMessage,WM_SHELLNOTIFY mov rax,hIcon mov note.hIcon,rax - invoke lstrcpyA,addr note.szTip,addr AppName - invoke Shell_NotifyIconA,NIM_ADD,addr note + invoke lstrcpynW,addr note.szTip,addr AppName,128 + invoke Shell_NotifyIconW,NIM_ADD,addr note + mov note.uTimeoutOrVersion,NOTIFYICON_VERSION_4 + invoke Shell_NotifyIconW,NIM_SETVERSION,addr note .if rax==0 .else invoke ShowWindow,hWnd,SW_HIDE @@ -98,8 +107,16 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ret .elseif uMsg==WM_SHELLNOTIFY - .if wParam==IDI_TRAY - .if lParam==WM_LBUTTONDBLCLK + mov rax,lParam + mov edx,eax + and edx,0FFFFh + mov trayMsg,edx + shr eax,16 + and eax,0FFFFh + mov trayId,eax + + .if trayId==IDI_TRAY + .if trayMsg==WM_LBUTTONDBLCLK .if sleepBlockEnabled==1 invoke SetThreadExecutionState,ES_CONTINUOUS invoke LoadIcon,hInstance,IDI_ICON2 @@ -108,8 +125,9 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .endif mov hIcon,rax mov note.hIcon,rax - mov note.uFlags,NIF_ICON - invoke Shell_NotifyIconA,NIM_MODIFY,addr note + invoke lstrcpynW,addr note.szTip,addr AppName,128 + mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP + invoke Shell_NotifyIconW,NIM_MODIFY,addr note mov sleepBlockEnabled,0 .else invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED @@ -119,12 +137,13 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .endif mov hIcon,rax mov note.hIcon,rax - mov note.uFlags,NIF_ICON - invoke Shell_NotifyIconA,NIM_MODIFY,addr note + invoke lstrcpynW,addr note.szTip,addr AppName,128 + mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP + invoke Shell_NotifyIconW,NIM_MODIFY,addr note mov sleepBlockEnabled,1 .endif - .elseif lParam==WM_RBUTTONUP + .elseif trayMsg==WM_CONTEXTMENU invoke SetForegroundWindow,hWnd invoke GetCursorPos,addr pt invoke TrackPopupMenu,hPopupMenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hWnd,NULL @@ -134,7 +153,31 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ret .elseif uMsg==WM_COMMAND - .if wParam==IDM_EXIT + .if wParam==IDM_DISABLESLEEP + invoke SetThreadExecutionState,ES_CONTINUOUS or ES_SYSTEM_REQUIRED or ES_DISPLAY_REQUIRED + invoke LoadIcon,hInstance,IDI_ICON + .if rax==0 + invoke LoadIcon,NULL,IDI_APPLICATION + .endif + mov hIcon,rax + mov note.hIcon,rax + invoke lstrcpynW,addr note.szTip,addr AppName,128 + mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP + invoke Shell_NotifyIconW,NIM_MODIFY,addr note + mov sleepBlockEnabled,1 + .elseif wParam==IDM_ENABLESLEEP + invoke SetThreadExecutionState,ES_CONTINUOUS + invoke LoadIcon,hInstance,IDI_ICON2 + .if rax==0 + invoke LoadIcon,NULL,IDI_APPLICATION + .endif + mov hIcon,rax + mov note.hIcon,rax + invoke lstrcpynW,addr note.szTip,addr AppName,128 + mov note.uFlags,NIF_ICON or NIF_TIP or NIF_SHOWTIP + invoke Shell_NotifyIconW,NIM_MODIFY,addr note + mov sleepBlockEnabled,0 + .elseif wParam==IDM_EXIT invoke DestroyWindow,hWnd .endif mov rax,0