From cc61905fa1c08dba16d82c3003fcdd8ef4c89e36 Mon Sep 17 00:00:00 2001 From: jdp1024 Date: Wed, 10 Jun 2026 10:43:44 +0800 Subject: [PATCH 1/9] ; - DPI Awareness v2 for both the main window and the Go To dialog ; - UI font and layout improvements ; - enable line number gutter by default ; and Find/Replace fix - 3279 Bytes --- trpad.asm | 376 +++++++++++++++++++++++++++++++++++++++++++++++------- trpad.exe | Bin 2794 -> 3279 bytes 2 files changed, 329 insertions(+), 47 deletions(-) diff --git a/trpad.asm b/trpad.asm index 75653bf..dcb3db0 100644 --- a/trpad.asm +++ b/trpad.asm @@ -34,6 +34,11 @@ ; Added VIEW Status Bar (Ln/Col) - 2476 Bytes ; Added DIALOG based Feature - 2686 Bytes ; Added KEYBOARD accelerators - 2794 Bytes +; Added +; - DPI Awareness v2 for both the main window and the Go To dialog +; - UI font and layout improvements +; - enable line number gutter by default +; and Find/Replace fix - 3279 Bytes (@jdp1024) ; Compiler directives and includes: .386 ; Full 80386 instruction set and mode @@ -46,7 +51,7 @@ option casemap:none ; Preserve the case of system identifiers but not our ; it out entirely. With every switch 0 the output is byte- ; for-byte the original baseline build (2686 bytes); a feature ; only costs space when it is switched on. -FEAT_LINENUMBERS = 0 ; View > Line Numbers gutter (default OFF) +FEAT_LINENUMBERS = 1 ; View > Line Numbers gutter (default ON) FEAT_DARKMODE = 0 ; View > Dark Mode (default OFF) ; ========================================================== @@ -132,6 +137,10 @@ LN_PAD equ 6 ; left padding of the numbers IDM_VIEW_LINENUM equ 0E231h ; View > Line Numbers command id ENDIF +IFNDEF DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 +DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 equ 0FFFFFFFCh +ENDIF + IF FEAT_DARKMODE ; ---- constants used only by the Dark Mode feature ---- IFNDEF CFM_COLOR @@ -151,6 +160,7 @@ ENDIF EXTERN _imp__CreateWindowExA@48 :PTR ; create main window / EDIT control EXTERN _imp__GetModuleHandleA@4 :PTR ; get HINSTANCE EXTERN _imp__LoadLibraryA@4 :PTR ; load modern Rich Edit DLL +EXTERN _imp__GetProcAddress@8 :PTR ; for SetProcessDpiAwarenessContext EXTERN _imp__RegisterClassA@4 :PTR ; rgstr wndw class (was RegisterClassExA@4) EXTERN _imp__GetMessageA@16 :PTR ; message loop get EXTERN _imp__TranslateMessage@4 :PTR ; translate keys @@ -173,6 +183,8 @@ EXTERN _imp__CreateMenu@0 :PTR ; create main menu bar EXTERN _imp__CreatePopupMenu@0 :PTR ; create each drop-down menu EXTERN _imp__SetMenu@8 :PTR ; attach menu bar to main window EXTERN _imp__DestroyWindow@4 :PTR ; close main window +EXTERN _imp__LoadCursorA@8 :PTR ; load standard arrow cursor +EXTERN _imp__SetCursor@4 :PTR ; set active cursor shape EXTERN _imp__GetOpenFileNameA@4 :PTR ; common file open dialog EXTERN _imp__GetSaveFileNameA@4 :PTR ; common file save dialog EXTERN _imp__GetLocalTime@4 :PTR ; current local time @@ -184,9 +196,10 @@ EXTERN _imp__DestroyMenu@4 :PTR ; free a menu handle EXTERN _imp__GetMessagePos@0 :PTR ; screen coords of last msg EXTERN _imp__GetKeyState@4 :PTR ; shortcut modifier state EXTERN _imp__SendMessageA@16 :PTR ; talk to EDIT control +EXTERN _imp__SendMessageW@16 :PTR ; talk to EDIT control EXTERN _imp__ChooseFontW@4 :PTR ; common font picker dialog -EXTERN _imp__FindTextA@4 :PTR ; common Find dialog -EXTERN _imp__ReplaceTextA@4 :PTR ; common Replace dialog +EXTERN _imp__FindTextW@4 :PTR ; common Find dialog +EXTERN _imp__ReplaceTextW@4 :PTR ; common Replace dialog EXTERN _imp__RegisterWindowMessageA@4 :PTR ; FINDMSGSTRING message id EXTERN _imp__IsDialogMessageA@8 :PTR ; route keys to find dialog EXTERN _imp__PrintDlgA@4 :PTR ; common Print dialog (returns DC) @@ -206,12 +219,21 @@ EXTERN _imp__GetDlgItemInt@16 :PTR ; read Go To line number EXTERN _imp__EndDialog@8 :PTR ; close Go To dialog EXTERN _imp__SetFocus@4 :PTR ; focus edit control after commands EXTERN _imp__ExitProcess@4 :PTR ; terminate process cleanly +EXTERN _imp__SetProcessDpiAwarenessContext@4 :PTR ; set process DPI awared +EXTERN _imp__GetDC@4 :PTR ; screen DC for UI DPI +EXTERN _imp__ReleaseDC@8 :PTR ; release screen DC +EXTERN _imp__SystemParametersInfoA@16 :PTR ; query non-client metrics +EXTERN _imp__GetStockObject@4 :PTR ; stock GUI font +EXTERN _imp__CreateFontIndirectA@4 :PTR ; create status bar font from LOGFONTA +EXTERN _imp__CreateFontA@56 :PTR ; create gutter font from RichFont face +EXTERN _imp__SelectObject@8 :PTR ; select gutter font IF FEAT_LINENUMBERS EXTERN _imp__BeginPaint@8 :PTR ; begin gutter paint EXTERN _imp__EndPaint@8 :PTR ; end gutter paint EXTERN _imp__FillRect@12 :PTR ; fill gutter background EXTERN _imp__GetSysColorBrush@4 :PTR ; gutter background brush +EXTERN _imp__GetTextExtentPoint32A@16 :PTR ; measure number width EXTERN _imp__InvalidateRect@12 :PTR ; force gutter repaint EXTERN _imp__SetBkMode@8 :PTR ; transparent number text EXTERN _imp__TextOutA@20 :PTR ; draw the line numbers @@ -222,6 +244,9 @@ EXTERN _imp__GetMenu@4 :PTR ; menu bar for the check mark EXTERN _imp__CheckMenuItem@12 :PTR ; check/uncheck Dark Mode ENDIF +User32Str db "user32.dll",0 ; for LoadLibrary +DPIFunc db "SetProcessDpiAwarenessContext",0 ; enable DPI awareness v2 + ClassName db ".",0 ; save bytes here (seems to work) RichDll db "Msftedit",0 ; Rich Edit DLL (no ext saves those bytes) EditClass db "RICHEDIT50W",0 ; modern Rich Edit control from WinAPI @@ -258,6 +283,7 @@ MCut db "Cu&t",0 MCopy db "&Copy",0 MPaste db "&Paste",0 MDelete db "De&lete",0 + MFind db "&Find...",0 MFindNext db "Find &Next",0 MReplace db "&Replace...",0 @@ -282,9 +308,9 @@ TimeBuf db 32 dup (0) FileFilter db "All Files",0,"*.*",0,0 FindMsgStr db "commdlg_FindReplace",0 -FindWhat db 128 dup (0) ; Find What text buffer -ReplaceWith db 128 dup (0) ; Replace With text buffer -fr FINDREPLACEA <> ; shared find/replace request +FindWhat dw 128 dup (0) ; Find What text buffer +ReplaceWith dw 128 dup (0) ; Replace With text buffer +fr FINDREPLACEW <> ; shared find/replace request hFindDlg dd 0 ; modeless find/replace dialog HWND uFindMsg dd 0 ; registered FINDMSGSTRING message @@ -294,11 +320,21 @@ LnColFmt db " Ln %d, Col %d",0 ; status bar Ln/Col format StatusBuf db 48 dup (0) ; formatted Ln/Col text hStatus dd 0 ; status bar window handle fStatus dd 1 ; status bar visible flag (default ON) +UiDpiY dd 96 ; cached screen DPI for UI scaling +UiWinWidth dd WindowWidth ; scaled startup window width +UiWinHeight dd WindowHeight ; scaled startup window height +UiSbHeight dd SBHEIGHT ; scaled status bar height +hUiFont dd 0 ; status bar UI font handle +hLnFont dd 0 ; gutter font handle (from RichFont) IF FEAT_LINENUMBERS -fLineNum dd 0 ; line-number gutter visible flag (default OFF) +fLineNum dd 1 ; line-number gutter visible flag (default ON) +UiLnMarginW dd LN_MARGIN_W ; scaled gutter width +UiLnPad dd LN_PAD ; scaled gutter padding +UiLnYBias dd 1 ; visual baseline bias for gutter text LnNumFmt db "%d",0 ; gutter number format MLineNum db "Line &Numbers",0 ; View menu label +ConsolasFace db "Consolas",0 ENDIF IF FEAT_DARKMODE @@ -313,13 +349,15 @@ HelpUrl db "https://github.com/davepl",0 ; in-memory Go To dialog template (no font block to stay compact) ALIGN 4 GoToTmpl LABEL DWORD - dd DS_MODALFRAME or WS_POPUP or WS_CAPTION or WS_SYSMENU + dd DS_MODALFRAME or DS_SETFONT or WS_POPUP or WS_CAPTION or WS_SYSMENU dd 0 ; exStyle dw 2 ; control count dw 0,0,150,46 ; x,y,cx,cy dw 0 ; no menu dw 0 ; default class dw 'G','o',' ','T','o',0 ; caption + dw 8 ; point size for dialog units + dw 'S','e','g','o','e',' ','U','I',0 ; UI font for DPI scaling ALIGN 4 dd WS_CHILD or WS_VISIBLE or WS_BORDER or ES_NUMBER or WS_TABSTOP dd 0 @@ -337,16 +375,16 @@ GoToTmpl LABEL DWORD dw 'O','K',0 ; caption dw 0 ; no creation data -; Rich Edit default font face: Courier only +; Rich Edit default font face + size RichFont dd 92 ; CHARFORMATW size - dd CFM_FACE ; only set face name + dd CFM_FACE or CFM_SIZE ; set face and size dd 0 ; no effects - dd 0 ; no font size change + dd 180 ; ~11 px at 96 DPI (twips) dd 0 ; no offset change dd 0 ; no color change db 0 ; default charset db 0 ; default pitch/family - dw 'C','o','u','r','i','e','r',0 + dw 'C','o','n','s','o','l','a','s',0 dw 24 dup (0) dw 0 ; CHARFORMATW padding @@ -355,6 +393,146 @@ RichFont dd 92 ; CHARFORMATW size .CODE ; Here is where the program itself lives ; ;----------------------------------------------; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; cache simple UI metrics derived from screen DPI ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +InitUiMetrics proc NEAR + LOCAL hdc:DWORD + LOCAL ncm:NONCLIENTMETRICSA + + push NULL + call [_imp__GetDC@4] + mov hdc, eax + test eax, eax + je UiMetricFont + + push LOGPIXELSY + push eax + call [_imp__GetDeviceCaps@8] + test eax, eax + je UiMetricRelease + mov UiDpiY, eax + + mov ecx, 96 + mov edx, UiDpiY + mov eax, SBHEIGHT + imul eax, edx + add eax, 48 + xor edx, edx + div ecx + mov UiSbHeight, eax + + mov edx, UiDpiY + mov eax, WindowWidth + imul eax, edx + add eax, 48 + xor edx, edx + div ecx + mov UiWinWidth, eax + + mov edx, UiDpiY + mov eax, WindowHeight + imul eax, edx + add eax, 48 + xor edx, edx + div ecx + mov UiWinHeight, eax + +IF FEAT_LINENUMBERS + mov edx, UiDpiY + mov eax, LN_MARGIN_W + imul eax, edx + add eax, 48 + xor edx, edx + div ecx + mov UiLnMarginW, eax + + mov edx, UiDpiY + mov eax, LN_PAD + imul eax, edx + add eax, 48 + xor edx, edx + div ecx + mov UiLnPad, eax + + mov eax, UiDpiY + add eax, 95 + xor edx, edx + div ecx + mov UiLnYBias, eax +ENDIF + + UiMetricRelease: + push hdc + push NULL + call [_imp__ReleaseDC@8] + + UiMetricFont: + xor eax, eax + mov hUiFont, eax + mov hLnFont, eax + + lea edi, ncm + mov ecx, (SIZEOF NONCLIENTMETRICSA)/4 + rep stosd + mov ncm.cbSize, SIZEOF NONCLIENTMETRICSA + push 0 + lea eax, ncm + push eax + push SIZEOF NONCLIENTMETRICSA + push SPI_GETNONCLIENTMETRICS + call [_imp__SystemParametersInfoA@16] + test eax, eax + je UiMetricStatusFallback + lea eax, ncm.lfStatusFont + push eax + call [_imp__CreateFontIndirectA@4] + mov hUiFont, eax + + UiMetricStatusFallback: + mov eax, hUiFont + test eax, eax + jne UiMetricLineFont + push DEFAULT_GUI_FONT + call [_imp__GetStockObject@4] + mov hUiFont, eax + + UiMetricLineFont: + mov eax, dword ptr [RichFont+12] ; CHARFORMATW.yHeight in twips + imul eax, UiDpiY + mov ecx, 1440 + xor edx, edx + div ecx + test eax, eax + jne UiMetricHavePx + mov eax, 1 + UiMetricHavePx: + neg eax + push OFFSET ConsolasFace + push FIXED_PITCH or FF_MODERN + push CLEARTYPE_QUALITY + push 0 + push OUT_TT_PRECIS + push ANSI_CHARSET + push FALSE + push FALSE + push FALSE + push FW_NORMAL + push 0 + push 0 + push 0 + push eax + call [_imp__CreateFontA@56] + mov hLnFont, eax + test eax, eax + jne UiMetricDone + mov eax, hUiFont + mov hLnFont, eax + + UiMetricDone: + ret +InitUiMetrics endp + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; title bar caption from startup file name ; ; add "*" if the buffer has been modified ; @@ -832,9 +1010,9 @@ ChooseFontDlg endp InitFR proc NEAR xor eax, eax lea edi, fr - mov ecx, (SIZEOF FINDREPLACEA)/4 + mov ecx, (SIZEOF FINDREPLACEW)/4 rep stosd - mov fr.lStructSize, SIZEOF FINDREPLACEA + mov fr.lStructSize, SIZEOF FINDREPLACEW mov eax, hMain mov fr.hwndOwner, eax mov fr.lpstrFindWhat, OFFSET FindWhat @@ -850,7 +1028,7 @@ InitFR endp ; returns eax=1 found / eax=0 not found ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoFindNext proc NEAR - LOCAL ft:FINDTEXTEXA + LOCAL ft:FINDTEXTEXW LOCAL cr:CHARRANGE ; current selection range @@ -860,7 +1038,7 @@ DoFindNext proc NEAR push EM_EXGETSEL mov edx, hEdit push edx - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] ; search from end of selection to end of text mov eax, cr.cpMax @@ -876,10 +1054,10 @@ DoFindNext proc NEAR lea edx, ft push edx push eax - push EM_FINDTEXTEXA + push EM_FINDTEXTEXW mov edx, hEdit push edx - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] cmp eax, -1 je FindMiss @@ -891,20 +1069,25 @@ DoFindNext proc NEAR push EM_EXSETSEL mov edx, hEdit push edx - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] push 0 push 0 push EM_SCROLLCARET mov edx, hEdit push edx - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] + + mov edx, hEdit + push edx + call [_imp__SetFocus@4] push 1 pop eax ret FindMiss: + xor eax, eax ret DoFindNext endp @@ -918,7 +1101,7 @@ DoReplaceOne proc NEAR push EM_REPLACESEL mov eax, hEdit push eax - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] call DoFindNext ret DoReplaceOne endp @@ -938,7 +1121,7 @@ DoReplaceAll proc NEAR push EM_EXSETSEL mov edx, hEdit push edx - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] RepLoop: call DoFindNext @@ -949,7 +1132,7 @@ DoReplaceAll proc NEAR push EM_REPLACESEL mov edx, hEdit push edx - call [_imp__SendMessageA@16] + call [_imp__SendMessageW@16] jmp RepLoop RepDone: @@ -1197,10 +1380,19 @@ LnInvalidate proc NEAR hW:DWORD LOCAL rc:RECT cmp fLineNum, 0 je LnInvDone + lea eax, rc + push eax + push hW + call [_imp__GetClientRect@8] mov rc.left, 0 mov rc.top, 0 - mov rc.right, LN_MARGIN_W - mov rc.bottom, 7FFFh + mov eax, UiLnMarginW + mov rc.right, eax + cmp fStatus, 0 + je LnInvClipDone + mov eax, UiSbHeight + sub rc.bottom, eax + LnInvClipDone: push FALSE lea eax, rc push eax @@ -1797,6 +1989,19 @@ MainEntry proc NEAR LOCAL wc: WNDCLASS LOCAL msg: MSG + push offset User32Str + call [_imp__LoadLibraryA@4] + push offset DPIFunc + push eax + call [_imp__GetProcAddress@8] + test eax, eax + jz NoDPIAwareFunc + push DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 + call eax + +NoDPIAwareFunc: + call InitUiMetrics + ; get program HINSTANCE push NULL call [_imp__GetModuleHandleA@4] @@ -1840,8 +2045,8 @@ MainEntry proc NEAR push hInstance push NULL push NULL - push WindowHeight - push WindowWidth + push UiWinHeight + push UiWinWidth push CW_USEDEFAULT push CW_USEDEFAULT push WS_OVERLAPPEDWINDOW or WS_VISIBLE @@ -1987,6 +2192,8 @@ IF FEAT_LINENUMBERS LOCAL ps:PAINTSTRUCT LOCAL rc:RECT LOCAL pt:POINT + LOCAL txtsz:POINT + LOCAL drawX:DWORD LOCAL nbuf[16]:BYTE ENDIF IF FEAT_DARKMODE @@ -2004,7 +2211,7 @@ ENDIF jne NotWMCreate ; EDIT control (class "RICHEDIT50W") - mov eax, WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT \ + mov eax, WS_CHILD or WS_VISIBLE or ES_LEFT \ or ES_MULTILINE or ES_AUTOVSCROLL or WS_VSCROLL ; create EDIT control @@ -2048,14 +2255,13 @@ ENDIF push eax call [_imp__SendMessageA@16] - ;; we call this elsewhere anyway ;; - ; set default Rich Edit font - ;push OFFSET RichFont - ;push 0 - ;push EM_SETCHARFORMAT - ;mov eax, hEdit - ;push eax - ;call [_imp__SendMessageA@16] + ; set default Rich Edit font for the initial empty document + push OFFSET RichFont + push SCF_ALL + push EM_SETCHARFORMAT + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] push FALSE push hWnd @@ -2079,16 +2285,30 @@ ENDIF push 0 push 0 push 0 - push WS_CHILD or WS_VISIBLE + push WS_CHILD or WS_VISIBLE or SS_CENTERIMAGE push OFFSET StatusBuf push OFFSET StaticClass push WS_EX_STATICEDGE call [_imp__CreateWindowExA@48] mov hStatus, eax + mov eax, hUiFont + test eax, eax + je StatusFontDone + push TRUE + push eax + push WM_SETFONT + mov eax, hStatus + push eax + call [_imp__SendMessageA@16] + StatusFontDone: ; show initial Ln/Col in the status bar call UpdateStatus + mov eax, hEdit + push eax + call [_imp__SetFocus@4] + xor eax, eax ret @@ -2106,7 +2326,12 @@ IF FEAT_LINENUMBERS push eax push hWnd call [_imp__GetClientRect@8] - mov eax, LN_MARGIN_W + cmp fStatus, 0 + je LnPaintSized + mov eax, UiSbHeight + sub rc.bottom, eax + LnPaintSized: + mov eax, UiLnMarginW mov rc.right, eax ; strip = {0,0,MARGIN,clientH} push COLOR_BTNFACE call [_imp__GetSysColorBrush@4] @@ -2118,6 +2343,13 @@ IF FEAT_LINENUMBERS push TRANSPARENT push ebx call [_imp__SetBkMode@8] + mov eax, hLnFont + test eax, eax + je LnFontReady + push eax + push ebx + call [_imp__SelectObject@8] + LnFontReady: push 0 push 0 push EM_GETFIRSTVISIBLELINE @@ -2159,11 +2391,30 @@ IF FEAT_LINENUMBERS push eax call [_imp__wsprintfA] add esp, 12 - push eax ; cch = digits written + mov pt.x, eax ; save cch for measure/draw + lea eax, txtsz + push eax + push pt.x + lea eax, nbuf + push eax + push ebx + call [_imp__GetTextExtentPoint32A@16] + mov eax, UiLnMarginW + sub eax, UiLnPad + sub eax, txtsz.x + cmp eax, UiLnPad + jge LnXReady + mov eax, UiLnPad + LnXReady: + mov drawX, eax + push pt.x ; cch = digits written lea eax, nbuf push eax - push pt.y - push LN_PAD + mov eax, pt.y + add eax, UiLnYBias + push eax + mov eax, drawX + push eax push ebx call [_imp__TextOutA@20] inc esi @@ -2406,7 +2657,7 @@ ENDIF call InitFR lea eax, fr push eax - call [_imp__FindTextA@4] + call [_imp__FindTextW@4] mov hFindDlg, eax xor eax, eax ret @@ -2420,7 +2671,7 @@ ENDIF call InitFR lea eax, fr push eax - call [_imp__ReplaceTextA@4] + call [_imp__ReplaceTextW@4] mov hFindDlg, eax xor eax, eax ret @@ -2591,6 +2842,10 @@ ENDIF NotSelChange: cmp eax, 0700h ; EN_MSGFILTER jne NotifyDone + cmp dword ptr [edx+12], 020Ah ; WM_MOUSEWHEEL + je NotifyLnScroll + cmp dword ptr [edx+12], 0115h ; WM_VSCROLL + je NotifyLnScroll cmp dword ptr [edx+12], 0205h ; WM_RBUTTONUP jne NotifyDone push hWnd @@ -2598,10 +2853,36 @@ ENDIF push 1 pop eax ret + NotifyLnScroll: + push hWnd + call LnInvalidate + jmp NotifyDone NotifyDone: xor eax, eax ret NotWMNotify: + cmp uMsg, WM_SETCURSOR + jne NotWMSetCursor +IF FEAT_LINENUMBERS + cmp fLineNum, 0 + je NotWMSetCursor + mov eax, wParam + cmp eax, hWnd + jne NotWMSetCursor + mov eax, lParam + and eax, 0FFFFh + cmp eax, HTCLIENT + jne NotWMSetCursor + push IDC_ARROW + push 0 + call [_imp__LoadCursorA@8] + push eax + call [_imp__SetCursor@4] + push 1 + pop eax + ret +ENDIF + NotWMSetCursor: cmp uMsg, WM_SIZE jne NotWMSize @@ -2614,9 +2895,10 @@ ENDIF ; if status bar shown, reserve space and place it cmp fStatus, 0 je SizeEdit - sub edi, SBHEIGHT + sub edi, UiSbHeight push SWP_NOZORDER - push SBHEIGHT + mov eax, UiSbHeight + push eax push esi push edi push 0 @@ -2631,8 +2913,8 @@ IF FEAT_LINENUMBERS xor ebx, ebx cmp fLineNum, 0 je LnNoShift - mov ebx, LN_MARGIN_W - sub esi, LN_MARGIN_W + mov ebx, UiLnMarginW + sub esi, ebx LnNoShift: push SWP_NOZORDER push edi diff --git a/trpad.exe b/trpad.exe index a6d05626aa52cdac9cd684a274296365fee8a6d7..ab8e4a08cf20ec4c284b6781d99f4edabd834ff9 100644 GIT binary patch delta 3077 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 delta 2588 zcmV+%3gh+98R``TO$v}S*>;4mh z5C9-xK#(wjfS^)%O2Ejd;+o8_<^TWhk^n$}z~J`;z*NJ>{59DNj)2tT_7dtalK?;& zFUYl^oIsqB)X94Lbh~yHXpSe1iYiyO&bLhxl701lY{PlEhj&c~&d84?mVoO;^dan^ zKK#>AAiKYzx``WoSJ#X<_`HAIQrd|CMfZ$4aKO?{s>#je7U2}BT0J%JVSkVRYKh02 zR5I}yLupTYZdkS^^E!qQY}?m zg^^l~k7P_5Wv!LlAcab$!XU++c{6;tR?a{f!TO?%HPP!Dc{N14nQniasO~&XqA{8G37 zwoncdDtHm*K5pdhL~cqPq7eH{k} z?Yl!>m#$yHP*Ryk2rGZ3Nt8aHM^481SB5W>vE+RJnd(=;7YOG>zLrPs6EMMRk|f}$ zQ51U{468$OYp80tXDpjf19um5LP>gVsP_TN* zf-jk;=G8_u_`<+$Q!QNEx;L95(g$jq+W&1MmEsG4q8SY9)P9Dp;74b~VL~;sqG?1f zus+e^q)BU`c4vP`u9hUki}@&y?qsH`aSz7bx4$jD%3`F>U<6M1;S=wwsXEWL#fZHj zE7J4}om69dL>7QUooS${XSzWmSz-4V7?G|c6`u=YZws)0-adn#n6CMK#-d7l|7342 zbeKOXAE*|20B%o$OG`=UPZ{Sku{*C58}7o}M}Y@HFN%ND+1V`4xTFE3M1PcWkLXvr zS{-A90RA~~wq?G&x=pt-Ce5&4yQYQhkM)cqvJ;Yhio6aL6$;(p#GTED)neW17G`TL z`pELy#M)K5l7&m|0O53@7wiRN!ZO(&r*H+|4`%R*rQJ|QAGEv?tsu;XH^M70!W>TC zQK+Ke)?|Mr{4-=T9pvm?fzmkeiJpRwtH{pigEd3=4_caAh9rY+{vYO>7B`6G?WMx& zS@oe)3S$<6tSWo`6=lL~{v2taa2R1ttYv9Vh&1t~+Q9(Sb%a z?XyU^3dX?q7X(FagXH7&CZ8c?h_B@k5aWiM4w)+ zVuNEUUsM7_6`2QtmC3C?W8tjXe#q^|2DyM0RFH?VNw|3l-{}a{Z?-75ZN}Rr-yZn;(hyVjf@%ax`NBXk)p(=v+ z%b$9|sArT-mMlg+S`hEgALG&O_95+H?eTUZP74+lxDyo1rgDUHIt!xj&;NQ5Zl|pH zndLfypF?gE3@m`r5HC#LrIQSr8gIUnD*R#m2dNe)I=IV={V?j$@uI1EH?T9p5Eg%c zc-EUT%PGF}9O zU$@v^-`ACaCdw~AR^n9YBSOnX&n2a{wnjUoODXe%1_Y|a5ucG9c!{lKiBDcW z+Irf>7b96Bila_oJ}Xqd9$q%Nw2niZ3}Pw%2XO}fU2NDOX)5?uTnP=-pJ*&Sw?m!g zJu{2lN+F8?jkyV(Ilv_fd~JVryOV_cc`!^To7F~Nq_3O^{Qak7e8bb7#@Q7iB)D4x zodd1an2)cPi$!uP0GeSyW0@E=wN@T~AX5!;MJQDRC!b&hE5D!ZcFu_na@2NmGtx#> zZ>~E2Jb4}vU*A#MMR`eSkQ$QGQ?=_Hfm8dq`p(I7 zD){Sc(Fw{Q9Sp=Gfee2=I%;1VKAq2tIrRlx?9F+bD!&cCeEEErB(C(5%mXv`ftm-X z%rPB@%|MrPeaMdt-iA`ZO-7{=LYQxE%c(11Rz+oe#wev#Cs!&`PO{}PVR!VysKg-^ zkGj!4;KernpSkX_wI zrwe5@-MCkgc7>)|VAF6IGx*=zEH20}b;|=8j$NW Date: Wed, 10 Jun 2026 13:04:46 +0800 Subject: [PATCH 2/9] indentation fix removed unused code and redundant checks constant fix --- trpad.asm | 143 +++++++++++++++++++++++------------------------------- trpad.exe | Bin 3279 -> 3255 bytes 2 files changed, 62 insertions(+), 81 deletions(-) diff --git a/trpad.asm b/trpad.asm index dcb3db0..8f70b34 100644 --- a/trpad.asm +++ b/trpad.asm @@ -38,7 +38,7 @@ ; - DPI Awareness v2 for both the main window and the Go To dialog ; - UI font and layout improvements ; - enable line number gutter by default -; and Find/Replace fix - 3279 Bytes (@jdp1024) +; and Find/Replace fix - 3255 Bytes (@jdp1024) ; Compiler directives and includes: .386 ; Full 80386 instruction set and mode @@ -138,7 +138,7 @@ IDM_VIEW_LINENUM equ 0E231h ; View > Line Numbers command id ENDIF IFNDEF DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 -DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 equ 0FFFFFFFCh +DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 equ -4 ENDIF IF FEAT_DARKMODE @@ -223,7 +223,6 @@ EXTERN _imp__SetProcessDpiAwarenessContext@4 :PTR ; set process DPI awared EXTERN _imp__GetDC@4 :PTR ; screen DC for UI DPI EXTERN _imp__ReleaseDC@8 :PTR ; release screen DC EXTERN _imp__SystemParametersInfoA@16 :PTR ; query non-client metrics -EXTERN _imp__GetStockObject@4 :PTR ; stock GUI font EXTERN _imp__CreateFontIndirectA@4 :PTR ; create status bar font from LOGFONTA EXTERN _imp__CreateFontA@56 :PTR ; create gutter font from RichFont face EXTERN _imp__SelectObject@8 :PTR ; select gutter font @@ -331,7 +330,6 @@ IF FEAT_LINENUMBERS fLineNum dd 1 ; line-number gutter visible flag (default ON) UiLnMarginW dd LN_MARGIN_W ; scaled gutter width UiLnPad dd LN_PAD ; scaled gutter padding -UiLnYBias dd 1 ; visual baseline bias for gutter text LnNumFmt db "%d",0 ; gutter number format MLineNum db "Line &Numbers",0 ; View menu label ConsolasFace db "Consolas",0 @@ -454,12 +452,6 @@ IF FEAT_LINENUMBERS xor edx, edx div ecx mov UiLnPad, eax - - mov eax, UiDpiY - add eax, 95 - xor edx, edx - div ecx - mov UiLnYBias, eax ENDIF UiMetricRelease: @@ -482,21 +474,11 @@ ENDIF push SIZEOF NONCLIENTMETRICSA push SPI_GETNONCLIENTMETRICS call [_imp__SystemParametersInfoA@16] - test eax, eax - je UiMetricStatusFallback lea eax, ncm.lfStatusFont push eax call [_imp__CreateFontIndirectA@4] mov hUiFont, eax - UiMetricStatusFallback: - mov eax, hUiFont - test eax, eax - jne UiMetricLineFont - push DEFAULT_GUI_FONT - call [_imp__GetStockObject@4] - mov hUiFont, eax - UiMetricLineFont: mov eax, dword ptr [RichFont+12] ; CHARFORMATW.yHeight in twips imul eax, UiDpiY @@ -1380,19 +1362,19 @@ LnInvalidate proc NEAR hW:DWORD LOCAL rc:RECT cmp fLineNum, 0 je LnInvDone - lea eax, rc - push eax - push hW - call [_imp__GetClientRect@8] + lea eax, rc + push eax + push hW + call [_imp__GetClientRect@8] mov rc.left, 0 mov rc.top, 0 mov eax, UiLnMarginW mov rc.right, eax - cmp fStatus, 0 - je LnInvClipDone - mov eax, UiSbHeight - sub rc.bottom, eax - LnInvClipDone: + cmp fStatus, 0 + je LnInvClipDone + mov eax, UiSbHeight + sub rc.bottom, eax +LnInvClipDone: push FALSE lea eax, rc push eax @@ -2212,7 +2194,7 @@ ENDIF ; EDIT control (class "RICHEDIT50W") mov eax, WS_CHILD or WS_VISIBLE or ES_LEFT \ - or ES_MULTILINE or ES_AUTOVSCROLL or WS_VSCROLL + or ES_MULTILINE or ES_AUTOVSCROLL or WS_VSCROLL or ES_NOHIDESEL ; create EDIT control EditStyleReady: @@ -2291,16 +2273,16 @@ ENDIF push WS_EX_STATICEDGE call [_imp__CreateWindowExA@48] mov hStatus, eax - mov eax, hUiFont - test eax, eax - je StatusFontDone - push TRUE - push eax - push WM_SETFONT - mov eax, hStatus - push eax - call [_imp__SendMessageA@16] - StatusFontDone: + mov eax, hUiFont + test eax, eax + je StatusFontDone + push TRUE + push eax + push WM_SETFONT + mov eax, hStatus + push eax + call [_imp__SendMessageA@16] + StatusFontDone: ; show initial Ln/Col in the status bar call UpdateStatus @@ -2326,11 +2308,11 @@ IF FEAT_LINENUMBERS push eax push hWnd call [_imp__GetClientRect@8] - cmp fStatus, 0 - je LnPaintSized - mov eax, UiSbHeight - sub rc.bottom, eax - LnPaintSized: + cmp fStatus, 0 + je LnPaintSized + mov eax, UiSbHeight + sub rc.bottom, eax + LnPaintSized: mov eax, UiLnMarginW mov rc.right, eax ; strip = {0,0,MARGIN,clientH} push COLOR_BTNFACE @@ -2343,13 +2325,13 @@ IF FEAT_LINENUMBERS push TRANSPARENT push ebx call [_imp__SetBkMode@8] - mov eax, hLnFont - test eax, eax - je LnFontReady - push eax - push ebx - call [_imp__SelectObject@8] - LnFontReady: + mov eax, hLnFont + test eax, eax + je LnFontReady + push eax + push ebx + call [_imp__SelectObject@8] + LnFontReady: push 0 push 0 push EM_GETFIRSTVISIBLELINE @@ -2391,28 +2373,27 @@ IF FEAT_LINENUMBERS push eax call [_imp__wsprintfA] add esp, 12 - mov pt.x, eax ; save cch for measure/draw - lea eax, txtsz - push eax - push pt.x - lea eax, nbuf - push eax - push ebx - call [_imp__GetTextExtentPoint32A@16] - mov eax, UiLnMarginW - sub eax, UiLnPad - sub eax, txtsz.x - cmp eax, UiLnPad - jge LnXReady - mov eax, UiLnPad - LnXReady: - mov drawX, eax - push pt.x ; cch = digits written + mov pt.x, eax ; save cch for measure/draw + lea eax, txtsz + push eax + push pt.x lea eax, nbuf push eax - mov eax, pt.y - add eax, UiLnYBias - push eax + push ebx + call [_imp__GetTextExtentPoint32A@16] + mov eax, UiLnMarginW + sub eax, UiLnPad + sub eax, txtsz.x + cmp eax, UiLnPad + jge LnXReady + mov eax, UiLnPad + LnXReady: + mov drawX, eax + push pt.x ; cch = digits written + lea eax, nbuf + push eax + mov eax, pt.y + push eax mov eax, drawX push eax push ebx @@ -2869,10 +2850,10 @@ IF FEAT_LINENUMBERS mov eax, wParam cmp eax, hWnd jne NotWMSetCursor - mov eax, lParam - and eax, 0FFFFh - cmp eax, HTCLIENT - jne NotWMSetCursor + mov eax, lParam + and eax, 0FFFFh + cmp eax, HTCLIENT + jne NotWMSetCursor push IDC_ARROW push 0 call [_imp__LoadCursorA@8] @@ -2895,10 +2876,10 @@ ENDIF ; if status bar shown, reserve space and place it cmp fStatus, 0 je SizeEdit - sub edi, UiSbHeight + sub edi, UiSbHeight push SWP_NOZORDER - mov eax, UiSbHeight - push eax + mov eax, UiSbHeight + push eax push esi push edi push 0 @@ -2913,8 +2894,8 @@ IF FEAT_LINENUMBERS xor ebx, ebx cmp fLineNum, 0 je LnNoShift - mov ebx, UiLnMarginW - sub esi, ebx + mov ebx, UiLnMarginW + sub esi, ebx LnNoShift: push SWP_NOZORDER push edi diff --git a/trpad.exe b/trpad.exe index ab8e4a08cf20ec4c284b6781d99f4edabd834ff9..1d40e2fa4699ebeec0bbdc9c1eb884675d25baa7 100644 GIT binary patch delta 3031 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 Date: Wed, 10 Jun 2026 13:06:14 +0800 Subject: [PATCH 3/9] additional visual style manifest as separated sidecar file --- trpad.exe.manifest | 1 + 1 file changed, 1 insertion(+) create mode 100644 trpad.exe.manifest diff --git a/trpad.exe.manifest b/trpad.exe.manifest new file mode 100644 index 0000000..b5fb3b7 --- /dev/null +++ b/trpad.exe.manifest @@ -0,0 +1 @@ + \ No newline at end of file From 891093c200d71eb1ba26f966be063c333e07a8e5 Mon Sep 17 00:00:00 2001 From: jdp1024 Date: Wed, 10 Jun 2026 15:15:47 +0800 Subject: [PATCH 4/9] keep window placement --- trpad.asm | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++--- trpad.exe | Bin 3255 -> 3332 bytes 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/trpad.asm b/trpad.asm index 8f70b34..5d8a3c5 100644 --- a/trpad.asm +++ b/trpad.asm @@ -39,6 +39,8 @@ ; - UI font and layout improvements ; - enable line number gutter by default ; and Find/Replace fix - 3255 Bytes (@jdp1024) +; Added +; - keep window placement - 3332 Bytes (@jdp1024) ; Compiler directives and includes: .386 ; Full 80386 instruction set and mode @@ -136,10 +138,15 @@ LN_MARGIN_W equ 44 ; gutter width in pixels LN_PAD equ 6 ; left padding of the numbers IDM_VIEW_LINENUM equ 0E231h ; View > Line Numbers command id ENDIF - IFNDEF DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 equ -4 ENDIF +IFNDEF SHREGSET_FORCE_HKCU +SHREGSET_FORCE_HKCU equ 2 +ENDIF +IFNDEF SRRF_RT_REG_BINARY +SRRF_RT_REG_BINARY equ 8 +ENDIF IF FEAT_DARKMODE ; ---- constants used only by the Dark Mode feature ---- @@ -226,6 +233,10 @@ EXTERN _imp__SystemParametersInfoA@16 :PTR ; query non-client metrics EXTERN _imp__CreateFontIndirectA@4 :PTR ; create status bar font from LOGFONTA EXTERN _imp__CreateFontA@56 :PTR ; create gutter font from RichFont face EXTERN _imp__SelectObject@8 :PTR ; select gutter font +EXTERN _imp__GetWindowPlacement@8 :PTR ; remember window placement +EXTERN _imp__SetWindowPlacement@8 :PTR ; store window placement +EXTERN _imp__SHRegSetUSValueA@24 :PTR ; window placement storage +EXTERN _imp__SHRegGetValueA@28 :PTR IF FEAT_LINENUMBERS EXTERN _imp__BeginPaint@8 :PTR ; begin gutter paint @@ -243,8 +254,10 @@ EXTERN _imp__GetMenu@4 :PTR ; menu bar for the check mark EXTERN _imp__CheckMenuItem@12 :PTR ; check/uncheck Dark Mode ENDIF -User32Str db "user32.dll",0 ; for LoadLibrary -DPIFunc db "SetProcessDpiAwarenessContext",0 ; enable DPI awareness v2 +User32Str db "user32.dll",0 ; for LoadLibrary +DPIFunc db "SetProcessDpiAwarenessContext",0 ; enable DPI awareness v2 +RegPathWinPlace db "SOFTWARE\TinyRetroPad",0 +RegKeyWinPlace db "WP",0 ClassName db ".",0 ; save bytes here (seems to work) RichDll db "Msftedit",0 ; Rich Edit DLL (no ext saves those bytes) @@ -1970,6 +1983,9 @@ MainEntry proc NEAR LOCAL hInstance: HINSTANCE LOCAL wc: WNDCLASS LOCAL msg: MSG + LOCAL dwSize: DWORD + LOCAL dwType: DWORD + LOCAL WinPlace: WINDOWPLACEMENT push offset User32Str call [_imp__LoadLibraryA@4] @@ -2043,6 +2059,27 @@ NoDPIAwareFunc: mov hMain, eax + ; restore prior window placement (if present) + mov dwSize, sizeof WINDOWPLACEMENT + lea eax, dwSize + push eax + lea eax, WinPlace + push eax + push 0 + push SRRF_RT_REG_BINARY + push offset RegKeyWinPlace + push offset RegPathWinPlace + push HKEY_CURRENT_USER + call [_imp__SHRegGetValueA@28] + test eax, eax + jne NoRestore + lea eax, WinPlace + push eax + push hMain + call [_imp__SetWindowPlacement@8] + + NoRestore: + ; load file and set title call LoadStartupFile xor eax, eax @@ -2170,6 +2207,7 @@ MainEntry endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM + LOCAL WinPlace:WINDOWPLACEMENT IF FEAT_LINENUMBERS LOCAL ps:PAINTSTRUCT LOCAL rc:RECT @@ -2930,6 +2968,20 @@ ENDIF cmp uMsg, WM_DESTROY jne NotWMDestroy + mov WinPlace.iLength, sizeof WINDOWPLACEMENT + lea eax, WinPlace + push eax + push hMain + call [_imp__GetWindowPlacement@8] + push SHREGSET_FORCE_HKCU + push sizeof WinPlace + lea eax, WinPlace + push eax + push REG_BINARY + push offset RegKeyWinPlace + push offset RegPathWinPlace + call [_imp__SHRegSetUSValueA@24] + ; post quit message and exit push 0 call [_imp__PostQuitMessage@4] diff --git a/trpad.exe b/trpad.exe index 1d40e2fa4699ebeec0bbdc9c1eb884675d25baa7..c8fc21d555cd22fdb11bd1567b83e5d1d126338b 100644 GIT binary patch delta 3114 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 EQrh15j{pDw delta 3036 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 Date: Wed, 10 Jun 2026 21:09:21 +0800 Subject: [PATCH 5/9] activate comctl32 v6 by embedded manifest removed the sidecar external manifest file added a bold.bat to build with MS link.exe for easier debugging set window background to COLOR_BTNFACE --- bold.bat | 15 +++++ build.bat | 6 +- trpad.asm | 142 ++++++++++++++++++++++++++++++++++++++++++++- trpad.exe | Bin 3332 -> 3682 bytes trpad.exe.manifest | 1 - 5 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 bold.bat delete mode 100644 trpad.exe.manifest diff --git a/bold.bat b/bold.bat new file mode 100644 index 0000000..2e8c8fa --- /dev/null +++ b/bold.bat @@ -0,0 +1,15 @@ +ml /nologo /c /coff /Cp /Id:\masm32\include trpad.asm + +link trpad.obj ^ + /OUT:trpad.exe ^ + /NODEFAULTLIB ^ + /RELEASE ^ + /FIXED ^ + /DYNAMICBASE:NO ^ + /MERGE:.rdata=.text ^ + /SUBSYSTEM:WINDOWS ^ + /ENTRY:MainEntry ^ + /SAFESEH:NO ^ + kernel32.lib user32.lib shell32.lib comdlg32.lib gdi32.lib shlwapi.lib + +del trpad.obj \ No newline at end of file diff --git a/build.bat b/build.bat index 24d507b..012dfce 100644 --- a/build.bat +++ b/build.bat @@ -1,4 +1,4 @@ -ml /nologo /c /coff /Cp /IC:\masm32\include trpad.asm +ml /nologo /c /coff /Cp /Id:\masm32\include trpad.asm crinkler trpad.obj ^ /OUT:trpad.exe ^ @@ -7,7 +7,9 @@ crinkler trpad.obj ^ /NOINITIALIZERS ^ /TINYIMPORT ^ /ORDERTRIES:2000 ^ + /NODEFAULTLIB /UNALIGNCODE /TRANSFORM:CALLS ^ + /UNSAFEIMPORT ^ /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x86" ^ - kernel32.lib user32.lib shell32.lib comdlg32.lib gdi32.lib + kernel32.lib user32.lib shell32.lib comdlg32.lib gdi32.lib shlwapi.lib del trpad.obj \ No newline at end of file diff --git a/trpad.asm b/trpad.asm index 5d8a3c5..f069bdb 100644 --- a/trpad.asm +++ b/trpad.asm @@ -41,6 +41,8 @@ ; and Find/Replace fix - 3255 Bytes (@jdp1024) ; Added ; - keep window placement - 3332 Bytes (@jdp1024) +; Added comctl32 6 activation - 3682 Bytes (@jdp1024) + ; Compiler directives and includes: .386 ; Full 80386 instruction set and mode @@ -55,6 +57,7 @@ option casemap:none ; Preserve the case of system identifiers but not our ; only costs space when it is switched on. FEAT_LINENUMBERS = 1 ; View > Line Numbers gutter (default ON) FEAT_DARKMODE = 0 ; View > Dark Mode (default OFF) +FEAT_COMCTL32V6 = 1 ; activate comctl32 6.0 (default ON) ; ========================================================== ; Include files - headers and libs that we need for @@ -183,6 +186,13 @@ EXTERN _imp__GlobalFree@4 :PTR ; free buffer EXTERN _imp__ReadFile@20 :PTR ; read file into EDIT EXTERN _imp__WriteFile@20 :PTR ; save EDIT to file EXTERN _imp__CloseHandle@4 :PTR ; close file handle +EXTERN _imp__CreateActCtxA@4 :PTR ; create activation context from manifest path +EXTERN _imp__ActivateActCtx@8 :PTR ; activate common-controls v6 manifest +EXTERN _imp__DeactivateActCtx@8 :PTR ; release activation cookie on exit +EXTERN _imp__ReleaseActCtx@4 :PTR ; free activation-context handle +EXTERN _imp__GetTempPathA@8 :PTR ; temp directory for runtime manifest +EXTERN _imp__GetTempFileNameA@16 :PTR ; unique temp manifest filename +EXTERN _imp__DeleteFileA@4 :PTR ; remove temp manifest on exit EXTERN _imp__SetWindowTextA@8 :PTR ; set title / EDIT text EXTERN _imp__GetSystemMenu@8 :PTR ; get system menu EXTERN _imp__AppendMenuA@16 :PTR ; add Save menu item @@ -226,7 +236,6 @@ EXTERN _imp__GetDlgItemInt@16 :PTR ; read Go To line number EXTERN _imp__EndDialog@8 :PTR ; close Go To dialog EXTERN _imp__SetFocus@4 :PTR ; focus edit control after commands EXTERN _imp__ExitProcess@4 :PTR ; terminate process cleanly -EXTERN _imp__SetProcessDpiAwarenessContext@4 :PTR ; set process DPI awared EXTERN _imp__GetDC@4 :PTR ; screen DC for UI DPI EXTERN _imp__ReleaseDC@8 :PTR ; release screen DC EXTERN _imp__SystemParametersInfoA@16 :PTR ; query non-client metrics @@ -265,6 +274,24 @@ EditClass db "RICHEDIT50W",0 ; modern Rich Edit control from WinAPI SaveText db "Save",0 ; button added to system menu EmptyText db 0 +IF FEAT_COMCTL32V6 +MAX_ACTCTX_PATH equ 260 ; temp path for runtime manifest file +ComCtlManifest label byte + db '' + db '' + db '' + db '' + db '',0 +ComCtlManifestEnd label byte +ActCtxPrefix db "trp",0 +ActCtxPath db MAX_ACTCTX_PATH dup (0) ; temp directory for manifest bootstrap +ActCtxFile db MAX_ACTCTX_PATH dup (0) ; temp manifest file path +ActCtxH dd 0 ; active context handle +ActCtxCookie dd 0 ; activation cookie for current thread +ENDIF + hMain dd 0 ; main window handle hEdit dd 0 ; EDIT control handle CmdFile db MAX_CMD_PATH dup (0) ; startup file path buffer @@ -1975,6 +2002,113 @@ SaveFile proc NEAR ret SaveFile endp ;end SaveFile proc +IF FEAT_COMCTL32V6 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; activate comctl32 v6 from embedded xml ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +EnableComCtlV6 proc NEAR + LOCAL ac:ACTCTXA + LOCAL hFile:DWORD + + xor eax, eax + mov hFile, eax + + push OFFSET ActCtxPath + push MAX_ACTCTX_PATH + call [_imp__GetTempPathA@8] + test eax, eax + je ActCtxDone + + push OFFSET ActCtxFile + push 0 + push OFFSET ActCtxPrefix + push OFFSET ActCtxPath + call [_imp__GetTempFileNameA@16] + test eax, eax + je ActCtxDone + + push NULL + push FILE_ATTRIBUTE_NORMAL + push CREATE_ALWAYS + push NULL + push 0 + push GENERIC_WRITE + push OFFSET ActCtxFile + call [_imp__CreateFileA@28] + cmp eax, INVALID_HANDLE_VALUE + je ActCtxDelete + mov hFile, eax + + push NULL + lea eax, BytesRead + push eax + mov eax, OFFSET ComCtlManifestEnd + sub eax, OFFSET ComCtlManifest + dec eax + push eax + push OFFSET ComCtlManifest + mov eax, hFile + push eax + call [_imp__WriteFile@20] + test eax, eax + je ActCtxCloseOnly + + mov eax, hFile + push eax + call [_imp__CloseHandle@4] + xor eax, eax + mov hFile, eax + + lea edi, ac + mov ecx, (SIZEOF ACTCTXA)/4 + xor eax, eax + rep stosd + mov ac.cbSize, SIZEOF ACTCTXA + mov ac.lpSource, OFFSET ActCtxFile + + lea eax, ac + push eax + call [_imp__CreateActCtxA@4] + cmp eax, INVALID_HANDLE_VALUE + je ActCtxCloseOnly + mov ActCtxH, eax + + lea edx, ActCtxCookie + push edx + push eax + call [_imp__ActivateActCtx@8] + test eax, eax + je ActCtxRelease + jmp ActCtxCloseOnly + +ActCtxRelease: + mov eax, ActCtxH + push eax + call [_imp__ReleaseActCtx@4] + xor eax, eax + mov ActCtxH, eax + +ActCtxCloseOnly: + mov eax, hFile + test eax, eax + je ActCtxMaybeDelete + push eax + call [_imp__CloseHandle@4] +ActCtxMaybeDelete: + cmp ActCtxH, 0 + jne ActCtxDone + +ActCtxDelete: + push OFFSET ActCtxFile + call [_imp__DeleteFileA@4] + mov byte ptr [ActCtxFile], 0 + +ActCtxDone: + ret +EnableComCtlV6 endp + +ENDIF + ;;;;;;;;;;;;;;;;;;;;;;; ; program entry point ; ;;;;;;;;;;;;;;;;;;;;;;; @@ -1998,6 +2132,11 @@ MainEntry proc NEAR call eax NoDPIAwareFunc: + +IF FEAT_COMCTL32V6 + ; enable common-controls v6 from the embedded manifest buffer + call EnableComCtlV6 +ENDIF call InitUiMetrics ; get program HINSTANCE @@ -2029,6 +2168,7 @@ NoDPIAwareFunc: mov eax, hInstance mov wc.hInstance, eax mov wc.lpszClassName, OFFSET ClassName + mov wc.hbrBackground, COLOR_BTNFACE ; register window class lea eax, wc diff --git a/trpad.exe b/trpad.exe index c8fc21d555cd22fdb11bd1567b83e5d1d126338b..53f53b2eadbd6bb81b454bfbb2b0126fdd1c80f0 100644 GIT binary patch delta 3461 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 diff --git a/trpad.exe.manifest b/trpad.exe.manifest deleted file mode 100644 index b5fb3b7..0000000 --- a/trpad.exe.manifest +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 385bdfcb73e59a8c36d144a5ef285a3f2a8e9645 Mon Sep 17 00:00:00 2001 From: jdp1024 Date: Wed, 10 Jun 2026 22:36:18 +0800 Subject: [PATCH 6/9] a trick to save about 450 bytes (before compression) by using the manifest in explorer.exe's resource tested under Windows 11 24H2 and 25H2 --- trpad.asm | 121 +++++++++++++++--------------------------------------- trpad.exe | Bin 3682 -> 3423 bytes 2 files changed, 32 insertions(+), 89 deletions(-) diff --git a/trpad.asm b/trpad.asm index f069bdb..00a550c 100644 --- a/trpad.asm +++ b/trpad.asm @@ -41,7 +41,7 @@ ; and Find/Replace fix - 3255 Bytes (@jdp1024) ; Added ; - keep window placement - 3332 Bytes (@jdp1024) -; Added comctl32 6 activation - 3682 Bytes (@jdp1024) +; Added comctl32 6 activation - 3423 Bytes (@jdp1024) ; Compiler directives and includes: @@ -190,9 +190,7 @@ EXTERN _imp__CreateActCtxA@4 :PTR ; create activation context from manifes EXTERN _imp__ActivateActCtx@8 :PTR ; activate common-controls v6 manifest EXTERN _imp__DeactivateActCtx@8 :PTR ; release activation cookie on exit EXTERN _imp__ReleaseActCtx@4 :PTR ; free activation-context handle -EXTERN _imp__GetTempPathA@8 :PTR ; temp directory for runtime manifest -EXTERN _imp__GetTempFileNameA@16 :PTR ; unique temp manifest filename -EXTERN _imp__DeleteFileA@4 :PTR ; remove temp manifest on exit +EXTERN _imp__GetWindowsDirectoryA@8 :PTR ; Windows directory for explorer.exe path EXTERN _imp__SetWindowTextA@8 :PTR ; set title / EDIT text EXTERN _imp__GetSystemMenu@8 :PTR ; get system menu EXTERN _imp__AppendMenuA@16 :PTR ; add Save menu item @@ -263,10 +261,10 @@ EXTERN _imp__GetMenu@4 :PTR ; menu bar for the check mark EXTERN _imp__CheckMenuItem@12 :PTR ; check/uncheck Dark Mode ENDIF -User32Str db "user32.dll",0 ; for LoadLibrary -DPIFunc db "SetProcessDpiAwarenessContext",0 ; enable DPI awareness v2 -RegPathWinPlace db "SOFTWARE\TinyRetroPad",0 -RegKeyWinPlace db "WP",0 +User32Str db "user32",0 ; for LoadLibrary +DPIFunc db "SetProcessDpiAwarenessContext",0 ; enable DPI awareness v2 +RegPathWinPlace db "SOFTWARE\TinyRetroPad",0 ; registry path +RegKeyWinPlace db "WP",0 ; registry key ClassName db ".",0 ; save bytes here (seems to work) RichDll db "Msftedit",0 ; Rich Edit DLL (no ext saves those bytes) @@ -275,19 +273,9 @@ SaveText db "Save",0 ; button added to system menu EmptyText db 0 IF FEAT_COMCTL32V6 -MAX_ACTCTX_PATH equ 260 ; temp path for runtime manifest file -ComCtlManifest label byte - db '' - db '' - db '' - db '' - db '',0 -ComCtlManifestEnd label byte -ActCtxPrefix db "trp",0 -ActCtxPath db MAX_ACTCTX_PATH dup (0) ; temp directory for manifest bootstrap -ActCtxFile db MAX_ACTCTX_PATH dup (0) ; temp manifest file path +ACTCTX_FLAG_RESOURCE_NAME_VALID equ 8 +ActCtxSuffix db "\explorer.exe",0 +ActCtxSource db MAX_PATH dup (0) ; filled at runtime: %WinDir%\explorer.exe ActCtxH dd 0 ; active context handle ActCtxCookie dd 0 ; activation cookie for current thread ENDIF @@ -2003,74 +1991,44 @@ SaveFile proc NEAR SaveFile endp ;end SaveFile proc IF FEAT_COMCTL32V6 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; activate comctl32 v6 from embedded xml ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; activate comctl32 v6 from explorer manifest ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EnableComCtlV6 proc NEAR LOCAL ac:ACTCTXA - LOCAL hFile:DWORD - xor eax, eax - mov hFile, eax - - push OFFSET ActCtxPath - push MAX_ACTCTX_PATH - call [_imp__GetTempPathA@8] - test eax, eax - je ActCtxDone - - push OFFSET ActCtxFile - push 0 - push OFFSET ActCtxPrefix - push OFFSET ActCtxPath - call [_imp__GetTempFileNameA@16] + ; get full path of explorer.exe + push MAX_PATH + push OFFSET ActCtxSource + call [_imp__GetWindowsDirectoryA@8] test eax, eax je ActCtxDone + mov edi, OFFSET ActCtxSource + add edi, eax + mov esi, OFFSET ActCtxSuffix + ActCtxCopy: + mov al, [esi] + mov [edi], al + inc esi + inc edi + test al, al + jnz ActCtxCopy - push NULL - push FILE_ATTRIBUTE_NORMAL - push CREATE_ALWAYS - push NULL - push 0 - push GENERIC_WRITE - push OFFSET ActCtxFile - call [_imp__CreateFileA@28] - cmp eax, INVALID_HANDLE_VALUE - je ActCtxDelete - mov hFile, eax - - push NULL - lea eax, BytesRead - push eax - mov eax, OFFSET ComCtlManifestEnd - sub eax, OFFSET ComCtlManifest - dec eax - push eax - push OFFSET ComCtlManifest - mov eax, hFile - push eax - call [_imp__WriteFile@20] - test eax, eax - je ActCtxCloseOnly - - mov eax, hFile - push eax - call [_imp__CloseHandle@4] - xor eax, eax - mov hFile, eax - + ; then use its manifest resource lea edi, ac mov ecx, (SIZEOF ACTCTXA)/4 xor eax, eax rep stosd mov ac.cbSize, SIZEOF ACTCTXA - mov ac.lpSource, OFFSET ActCtxFile + mov ac.dwFlags, ACTCTX_FLAG_RESOURCE_NAME_VALID + mov ac.lpSource, OFFSET ActCtxSource + mov ac.lpResourceName, 1 lea eax, ac push eax call [_imp__CreateActCtxA@4] cmp eax, INVALID_HANDLE_VALUE - je ActCtxCloseOnly + je ActCtxDone mov ActCtxH, eax lea edx, ActCtxCookie @@ -2079,7 +2037,7 @@ EnableComCtlV6 proc NEAR call [_imp__ActivateActCtx@8] test eax, eax je ActCtxRelease - jmp ActCtxCloseOnly + jmp ActCtxDone ActCtxRelease: mov eax, ActCtxH @@ -2088,21 +2046,6 @@ ActCtxRelease: xor eax, eax mov ActCtxH, eax -ActCtxCloseOnly: - mov eax, hFile - test eax, eax - je ActCtxMaybeDelete - push eax - call [_imp__CloseHandle@4] -ActCtxMaybeDelete: - cmp ActCtxH, 0 - jne ActCtxDone - -ActCtxDelete: - push OFFSET ActCtxFile - call [_imp__DeleteFileA@4] - mov byte ptr [ActCtxFile], 0 - ActCtxDone: ret EnableComCtlV6 endp diff --git a/trpad.exe b/trpad.exe index 53f53b2eadbd6bb81b454bfbb2b0126fdd1c80f0..e3bb12c23ecb7781cd18287d1ccd742df20733ca 100644 GIT binary patch delta 3200 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 delta 3461 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 From 11aa4ec7033f5ba3dc209fb3b7581bbdd0570738 Mon Sep 17 00:00:00 2001 From: jdp1024 Date: Thu, 11 Jun 2026 00:53:47 +0800 Subject: [PATCH 7/9] global variable and consts relayout to reduce exe size with link.exe 1 byte smaller with crinkler --- trpad.asm | 100 ++++++++++++++++++++++++++++++++++++++---------------- trpad.exe | Bin 3423 -> 3422 bytes 2 files changed, 70 insertions(+), 30 deletions(-) diff --git a/trpad.asm b/trpad.asm index 00a550c..c06c84d 100644 --- a/trpad.asm +++ b/trpad.asm @@ -42,6 +42,9 @@ ; Added ; - keep window placement - 3332 Bytes (@jdp1024) ; Added comctl32 6 activation - 3423 Bytes (@jdp1024) +; Added consts and global variables relayout - 3422 Bytes (@jdp1024) + +; With MS link.exe, the exe size is 10752 bytes (@jdp1024) ; Compiler directives and includes: @@ -261,11 +264,13 @@ EXTERN _imp__GetMenu@4 :PTR ; menu bar for the check mark EXTERN _imp__CheckMenuItem@12 :PTR ; check/uncheck Dark Mode ENDIF +.CONST User32Str db "user32",0 ; for LoadLibrary DPIFunc db "SetProcessDpiAwarenessContext",0 ; enable DPI awareness v2 RegPathWinPlace db "SOFTWARE\TinyRetroPad",0 ; registry path RegKeyWinPlace db "WP",0 ; registry key +.CONST ClassName db ".",0 ; save bytes here (seems to work) RichDll db "Msftedit",0 ; Rich Edit DLL (no ext saves those bytes) EditClass db "RICHEDIT50W",0 ; modern Rich Edit control from WinAPI @@ -274,20 +279,24 @@ EmptyText db 0 IF FEAT_COMCTL32V6 ACTCTX_FLAG_RESOURCE_NAME_VALID equ 8 +.CONST ActCtxSuffix db "\explorer.exe",0 -ActCtxSource db MAX_PATH dup (0) ; filled at runtime: %WinDir%\explorer.exe -ActCtxH dd 0 ; active context handle -ActCtxCookie dd 0 ; activation cookie for current thread +.DATA? +ActCtxSource db MAX_PATH dup (?) ; filled at runtime: %WinDir%\explorer.exe +ActCtxH dd ? ; active context handle +ActCtxCookie dd ? ; activation cookie for current thread ENDIF -hMain dd 0 ; main window handle -hEdit dd 0 ; EDIT control handle -CmdFile db MAX_CMD_PATH dup (0) ; startup file path buffer -TitleBuf db MAX_TITLE dup (0) ; window title buffer -BytesRead dd 0 ; bytes read from file -fDirty dd 0 ; EDIT modified flag -fWrap dd 1 ; word wrap state +.DATA? +hMain dd ? ; main window handle +hEdit dd ? ; EDIT control handle +CmdFile db MAX_CMD_PATH dup (?) ; startup file path buffer +TitleBuf db MAX_TITLE dup (?) ; window title buffer +BytesRead dd ? ; bytes read from file +fDirty dd ? ; EDIT modified flag +fWrap dd ? ; word wrap state +.CONST UntitledText db "Untitled",0 NotepadTail db " - TinyRetroPad",0 @@ -330,48 +339,67 @@ AboutText db "TinyRetroPad - tiny notepad-style editor",0 SaveCap db "TinyRetroPad",0 SaveAskText db "Save changes?",0 SpaceText db " ",0 -DateBuf db 32 dup (0) -TimeBuf db 32 dup (0) + +.DATA? +DateBuf db 32 dup (?) +TimeBuf db 32 dup (?) + +.CONST FileFilter db "All Files",0,"*.*",0,0 +.CONST FindMsgStr db "commdlg_FindReplace",0 -FindWhat dw 128 dup (0) ; Find What text buffer -ReplaceWith dw 128 dup (0) ; Replace With text buffer + +.DATA? +FindWhat dw 128 dup (?) ; Find What text buffer +ReplaceWith dw 128 dup (?) ; Replace With text buffer fr FINDREPLACEW <> ; shared find/replace request -hFindDlg dd 0 ; modeless find/replace dialog HWND -uFindMsg dd 0 ; registered FINDMSGSTRING message +hFindDlg dd ? ; modeless find/replace dialog HWND +uFindMsg dd ? ; registered FINDMSGSTRING message +.CONST StaticClass db "STATIC",0 ; built-in class for status bar pane DocName db "TinyRetroPad",0 ; print job document name LnColFmt db " Ln %d, Col %d",0 ; status bar Ln/Col format -StatusBuf db 48 dup (0) ; formatted Ln/Col text -hStatus dd 0 ; status bar window handle -fStatus dd 1 ; status bar visible flag (default ON) -UiDpiY dd 96 ; cached screen DPI for UI scaling -UiWinWidth dd WindowWidth ; scaled startup window width -UiWinHeight dd WindowHeight ; scaled startup window height -UiSbHeight dd SBHEIGHT ; scaled status bar height -hUiFont dd 0 ; status bar UI font handle -hLnFont dd 0 ; gutter font handle (from RichFont) + +.DATA? +StatusBuf db 48 dup (?) ; formatted Ln/Col text +hStatus dd ? ; status bar window handle + +.DATA? +fStatus dd ? ; status bar visible flag (default ON) +UiDpiY dd ? ; cached screen DPI for UI scaling +UiWinWidth dd ? ; scaled startup window width +UiWinHeight dd ? ; scaled startup window height +UiSbHeight dd ? ; scaled status bar height +hUiFont dd ? ; status bar UI font handle +hLnFont dd ? ; gutter font handle (from RichFont) IF FEAT_LINENUMBERS -fLineNum dd 1 ; line-number gutter visible flag (default ON) -UiLnMarginW dd LN_MARGIN_W ; scaled gutter width -UiLnPad dd LN_PAD ; scaled gutter padding +.DATA? +fLineNum dd ? ; line-number gutter visible flag (default ON) +UiLnMarginW dd ? ; scaled gutter width +UiLnPad dd ? ; scaled gutter padding +.CONST LnNumFmt db "%d",0 ; gutter number format MLineNum db "Line &Numbers",0 ; View menu label ConsolasFace db "Consolas",0 ENDIF IF FEAT_DARKMODE +.DATA? fDark dd 0 ; dark mode flag (default OFF) +.CONST MDarkMode db "Dark &Mode",0 ; View menu label ENDIF -hInst dd 0 ; module handle (for dialogs) +.DATA? +hInst dd ? ; module handle (for dialogs) +.CONST OpenVerb db "open",0 ; ShellExecute verb HelpUrl db "https://github.com/davepl",0 +.CONST ; in-memory Go To dialog template (no font block to stay compact) ALIGN 4 GoToTmpl LABEL DWORD @@ -2064,6 +2092,18 @@ MainEntry proc NEAR LOCAL dwType: DWORD LOCAL WinPlace: WINDOWPLACEMENT + ; initialize global variables + mov fWrap, 1 + mov fStatus, 1 + mov UiDpiY, 96 + mov UiWinWidth, WindowWidth + mov UiWinHeight, WindowHeight + mov UiSbHeight, SBHEIGHT + mov fLineNum, 1 + mov UiLnMarginW, LN_MARGIN_W + mov UiLnPad, LN_PAD + + ; enable DPI awareness v2 push offset User32Str call [_imp__LoadLibraryA@4] push offset DPIFunc @@ -2077,7 +2117,7 @@ MainEntry proc NEAR NoDPIAwareFunc: IF FEAT_COMCTL32V6 - ; enable common-controls v6 from the embedded manifest buffer + ; enable common-controls v6 from explorer.exe call EnableComCtlV6 ENDIF call InitUiMetrics diff --git a/trpad.exe b/trpad.exe index e3bb12c23ecb7781cd18287d1ccd742df20733ca..0f79983f751222030f7b0ec028e3489b313b9d8d 100644 GIT binary patch delta 3204 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 delta 3205 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 Date: Thu, 11 Jun 2026 16:03:38 +0800 Subject: [PATCH 8/9] added highlight of the current line number fixed flickers of the line number bar --- trpad.asm | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++- trpad.exe | Bin 3422 -> 3568 bytes 2 files changed, 165 insertions(+), 2 deletions(-) diff --git a/trpad.asm b/trpad.asm index c06c84d..8ec22c6 100644 --- a/trpad.asm +++ b/trpad.asm @@ -35,6 +35,7 @@ ; Added DIALOG based Feature - 2686 Bytes ; Added KEYBOARD accelerators - 2794 Bytes ; Added +; - Line Numbers default ON ; - DPI Awareness v2 for both the main window and the Go To dialog ; - UI font and layout improvements ; - enable line number gutter by default @@ -43,8 +44,13 @@ ; - keep window placement - 3332 Bytes (@jdp1024) ; Added comctl32 6 activation - 3423 Bytes (@jdp1024) ; Added consts and global variables relayout - 3422 Bytes (@jdp1024) +; Added highlight of the current line number and fixed flickers of the +; line number bar when the caret moves by only repainting the area +; of changed line numbers. The line number bar still flickers when +; scrolling the richedit very fast, the full solution is beyond +; the need of this program. - 3568 Bytes (@jdp1024) -; With MS link.exe, the exe size is 10752 bytes (@jdp1024) +; With MS link.exe, the exe size is 11346 bytes (@jdp1024) ; Compiler directives and includes: @@ -229,6 +235,7 @@ EXTERN _imp__GetDeviceCaps@8 :PTR ; printer resolution/size EXTERN _imp__DeleteDC@4 :PTR ; release printer DC EXTERN _imp__ShowWindow@8 :PTR ; show/hide status bar EXTERN _imp__GetClientRect@8 :PTR ; client size for relayout +EXTERN _imp__GetSysColor@4 :PTR ; resolve system COLOR_* to COLORREF EXTERN _imp__wsprintfA :PTR ; format Ln/Col string EXTERN _imp__ShellExecuteA@24 :PTR ; open help URL in browser EXTERN _imp__PageSetupDlgA@4 :PTR ; common Page Setup dialog @@ -256,6 +263,7 @@ EXTERN _imp__GetSysColorBrush@4 :PTR ; gutter background brush EXTERN _imp__GetTextExtentPoint32A@16 :PTR ; measure number width EXTERN _imp__InvalidateRect@12 :PTR ; force gutter repaint EXTERN _imp__SetBkMode@8 :PTR ; transparent number text +EXTERN _imp__SetTextColor@8 :PTR ; switch line-number text color EXTERN _imp__TextOutA@20 :PTR ; draw the line numbers ENDIF @@ -380,6 +388,7 @@ IF FEAT_LINENUMBERS fLineNum dd ? ; line-number gutter visible flag (default ON) UiLnMarginW dd ? ; scaled gutter width UiLnPad dd ? ; scaled gutter padding +LnHiLine dd ? ; last highlighted caret line .CONST LnNumFmt db "%d",0 ; gutter number format MLineNum db "Line &Numbers",0 ; View menu label @@ -1439,6 +1448,100 @@ LnInvClipDone: LnInvDone: ret LnInvalidate endp + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; invalidate one line-number row in gutter ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +LnInvalidateLine proc NEAR hW:DWORD, lineIdx:DWORD + LOCAL rc:RECT + LOCAL pt:POINT + cmp fLineNum, 0 + je LnInvLineDone + cmp lineIdx, -1 + je LnInvLineDone + + lea eax, rc + push eax + push hW + call [_imp__GetClientRect@8] + mov rc.left, 0 + mov eax, UiLnMarginW + mov rc.right, eax + cmp fStatus, 0 + je LnInvLineClipOk + mov eax, UiSbHeight + sub rc.bottom, eax +LnInvLineClipOk: + + push 0 + push lineIdx + push EM_LINEINDEX + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] + cmp eax, -1 + je LnInvLineDone + + push eax + lea eax, pt + push eax + push EM_POSFROMCHAR + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] + + mov eax, pt.y + dec eax + mov rc.top, eax + + mov eax, lineIdx + inc eax + push 0 + push eax + push EM_LINEINDEX + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] + cmp eax, -1 + je LnInvLineLast + push eax + lea eax, pt + push eax + push EM_POSFROMCHAR + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] + mov eax, pt.y + inc eax + mov rc.bottom, eax + jmp LnInvLineClamp + +LnInvLineLast: + mov eax, rc.top + add eax, UiSbHeight + mov rc.bottom, eax + +LnInvLineClamp: + cmp rc.top, 0 + jge LnInvLineTopOk + mov rc.top, 0 +LnInvLineTopOk: + mov eax, rc.bottom + cmp eax, rc.top + jg LnInvLineBottomOk + mov eax, rc.top + inc eax + mov rc.bottom, eax +LnInvLineBottomOk: + push FALSE + lea eax, rc + push eax + push hW + call [_imp__InvalidateRect@12] + +LnInvLineDone: + ret +LnInvalidateLine endp ENDIF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2102,6 +2205,7 @@ MainEntry proc NEAR mov fLineNum, 1 mov UiLnMarginW, LN_MARGIN_W mov UiLnPad, LN_PAD + mov LnHiLine, -1 ; enable DPI awareness v2 push offset User32Str @@ -2151,7 +2255,8 @@ ENDIF mov eax, hInstance mov wc.hInstance, eax mov wc.lpszClassName, OFFSET ClassName - mov wc.hbrBackground, COLOR_BTNFACE + mov wc.hbrBackground, COLOR_BTNFACE+1 + mov wc.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW ; register window class lea eax, wc @@ -2334,9 +2439,11 @@ WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM IF FEAT_LINENUMBERS LOCAL ps:PAINTSTRUCT LOCAL rc:RECT + LOCAL frc:RECT LOCAL pt:POINT LOCAL txtsz:POINT LOCAL drawX:DWORD + LOCAL curLine:DWORD LOCAL nbuf[16]:BYTE ENDIF IF FEAT_DARKMODE @@ -2507,6 +2614,13 @@ IF FEAT_LINENUMBERS push eax call [_imp__SendMessageA@16] mov edi, eax ; edi = total line count + push 0 + push -1 + push EM_LINEFROMCHAR + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] + mov curLine, eax ; caret/current line index LnLoop: cmp esi, edi jge LnPaintEnd @@ -2550,6 +2664,34 @@ IF FEAT_LINENUMBERS mov eax, UiLnPad LnXReady: mov drawX, eax + mov eax, esi + cmp eax, curLine + jne LnNormColor + mov frc.left, 0 + mov eax, pt.y + dec eax + mov frc.top, eax + mov eax, UiLnMarginW + mov frc.right, eax + mov eax, pt.y + add eax, txtsz.y + inc eax + mov frc.bottom, eax + push COLOR_INFOBK + call [_imp__GetSysColorBrush@4] + push eax + lea eax, frc + push eax + push ebx + call [_imp__FillRect@12] + jmp LnColorDone + LnNormColor: + push COLOR_WINDOWTEXT + call [_imp__GetSysColor@4] + push eax + push ebx + call [_imp__SetTextColor@8] + LnColorDone: push pt.x ; cch = digits written lea eax, nbuf push eax @@ -2980,6 +3122,27 @@ ENDIF cmp eax, EN_SELCHANGE ; caret/selection moved jne NotSelChange call UpdateStatus + IF FEAT_LINENUMBERS + push 0 + push -1 + push EM_LINEFROMCHAR + mov eax, hEdit + push eax + call [_imp__SendMessageA@16] + mov curLine, eax + cmp eax, LnHiLine + je NotifyDone + mov eax, LnHiLine + push eax + push hWnd + call LnInvalidateLine + mov eax, curLine + push eax + push hWnd + call LnInvalidateLine + mov eax, curLine + mov LnHiLine, eax + ENDIF jmp NotifyDone NotSelChange: cmp eax, 0700h ; EN_MSGFILTER diff --git a/trpad.exe b/trpad.exe index 0f79983f751222030f7b0ec028e3489b313b9d8d..79d7d048ba8bca701e093f9530c7ed86a28bf5a3 100644 GIT binary patch delta 3352 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 i5_jwRs~@3}^mx{~M!>XR3!=4$X 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 Date: Thu, 11 Jun 2026 16:15:16 +0800 Subject: [PATCH 9/9] fix build with FEAT_LINENUMBERS=0 --- trpad.asm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/trpad.asm b/trpad.asm index 8ec22c6..284e6c6 100644 --- a/trpad.asm +++ b/trpad.asm @@ -49,6 +49,7 @@ ; of changed line numbers. The line number bar still flickers when ; scrolling the richedit very fast, the full solution is beyond ; the need of this program. - 3568 Bytes (@jdp1024) +; The exe without line number bar is 3076 Bytes. ; With MS link.exe, the exe size is 11346 bytes (@jdp1024) @@ -544,6 +545,7 @@ ENDIF call [_imp__CreateFontIndirectA@4] mov hUiFont, eax +IF FEAT_LINENUMBERS UiMetricLineFont: mov eax, dword ptr [RichFont+12] ; CHARFORMATW.yHeight in twips imul eax, UiDpiY @@ -575,7 +577,7 @@ ENDIF jne UiMetricDone mov eax, hUiFont mov hLnFont, eax - +ENDIF UiMetricDone: ret InitUiMetrics endp @@ -2202,10 +2204,13 @@ MainEntry proc NEAR mov UiWinWidth, WindowWidth mov UiWinHeight, WindowHeight mov UiSbHeight, SBHEIGHT + +IF FEAT_LINENUMBERS mov fLineNum, 1 mov UiLnMarginW, LN_MARGIN_W mov UiLnPad, LN_PAD mov LnHiLine, -1 +ENDIF ; enable DPI awareness v2 push offset User32Str @@ -3159,9 +3164,11 @@ ENDIF pop eax ret NotifyLnScroll: +IF FEAT_LINENUMBERS push hWnd call LnInvalidate jmp NotifyDone +ENDIF NotifyDone: xor eax, eax ret