windows: Fix user32/shcore DPI functions.
							parent
							
								
									67d5e633f1
								
							
						
					
					
						commit
						96d3482475
					
				| 
						 | 
				
			
			@ -533,6 +533,9 @@ SYMBOL: wm-handlers
 | 
			
		|||
wm-handlers [
 | 
			
		||||
    H{
 | 
			
		||||
        ${ WM_CLOSE [ handle-wm-close 0 ] }
 | 
			
		||||
        ! ${ WM_NCCREATE [ [ 3drop EnableNonClientDpiScaling drop ] [ DefWindowProc ] 4bi ] }
 | 
			
		||||
        ! ${ WM_GETDPISCALEDSIZE [ DefWindowProc ] }
 | 
			
		||||
        ! ${ WM_DPICHANGED [ DefWindowProc ] }
 | 
			
		||||
        ${ WM_PAINT [ 4dup handle-wm-paint DefWindowProc ] }
 | 
			
		||||
 | 
			
		||||
        ${ WM_SIZE [ handle-wm-size 0 ] }
 | 
			
		||||
| 
						 | 
				
			
			@ -603,6 +606,7 @@ M: windows-ui-backend do-events
 | 
			
		|||
    ] [ drop ] if ;
 | 
			
		||||
 | 
			
		||||
: adjust-RECT ( RECT style ex-style -- )
 | 
			
		||||
    ! [ 0 ] dip GetDpiForSystem AdjustWindowRectExForDpi win32-error=0/f ;
 | 
			
		||||
    [ 0 ] dip AdjustWindowRectEx win32-error=0/f ;
 | 
			
		||||
 | 
			
		||||
: make-RECT ( world -- RECT )
 | 
			
		||||
| 
						 | 
				
			
			@ -630,6 +634,14 @@ M: windows-ui-backend do-events
 | 
			
		|||
        dup
 | 
			
		||||
    ] change-global ;
 | 
			
		||||
 | 
			
		||||
: get-device-caps ( handle -- x y )
 | 
			
		||||
    GetDC
 | 
			
		||||
    [ LOGPIXELSX GetDeviceCaps ]
 | 
			
		||||
    [ LOGPIXELSY GetDeviceCaps ] bi ;
 | 
			
		||||
 | 
			
		||||
: get-default-device-caps ( -- x y )
 | 
			
		||||
    f get-device-caps ;
 | 
			
		||||
 | 
			
		||||
:: create-window ( rect style ex-style -- hwnd )
 | 
			
		||||
    rect style ex-style make-adjusted-RECT
 | 
			
		||||
    [ get-window-class f ] dip
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1640,7 +1640,7 @@ FUNCTION: BOOL GdiFlush ( )
 | 
			
		|||
! FUNCTION: GetDCBrushColor
 | 
			
		||||
! FUNCTION: GetDCOrgEx
 | 
			
		||||
! FUNCTION: GetDCPenColor
 | 
			
		||||
! FUNCTION: GetDeviceCaps
 | 
			
		||||
FUNCTION: int GetDeviceCaps ( HDC hdc, int index )
 | 
			
		||||
! FUNCTION: GetDeviceGammaRamp
 | 
			
		||||
! FUNCTION: GetDIBColorTable
 | 
			
		||||
! FUNCTION: GetDIBits
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -210,7 +210,10 @@ CONSTANT: WM_NCMOUSELEAVE 0x02A2
 | 
			
		|||
CONSTANT: WM_WTSSESSION_CHANGE 0x02B1
 | 
			
		||||
CONSTANT: WM_TABLET_FIRST 0x02c0
 | 
			
		||||
CONSTANT: WM_TABLET_LAST 0x02df
 | 
			
		||||
CONSTANT: WM_DPICHANGED 0x02E0
 | 
			
		||||
CONSTANT: WM_DPICHANGED 0x02e0
 | 
			
		||||
CONSTANT: WM_DPICHANGED_BEFOREPARENT 0x02e2
 | 
			
		||||
CONSTANT: WM_DPICHANGED_AFTERPARENT 0x02e3
 | 
			
		||||
CONSTANT: WM_GETDPISCALEDSIZE 0x2e4
 | 
			
		||||
CONSTANT: WM_CUT 0x0300
 | 
			
		||||
CONSTANT: WM_COPY 0x0301
 | 
			
		||||
CONSTANT: WM_PASTE 0x0302
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,4 +11,65 @@ ENUM: MONITOR_DPI_TYPE
 | 
			
		|||
    MDT_RAW_DPI
 | 
			
		||||
    { MDT_DEFAULT 0 } ;
 | 
			
		||||
 | 
			
		||||
ENUM: PROCESS_DPI_AWARENESS
 | 
			
		||||
    { PROCESS_DPI_UNAWARE 0 }
 | 
			
		||||
    { PROCESS_SYSTEM_DPI_AWARE 1 }
 | 
			
		||||
    { PROCESS_PER_MONITOR_DPI_AWARE 2 } ;
 | 
			
		||||
 | 
			
		||||
ENUM: SCALE_CHANGE_FLAGS
 | 
			
		||||
    { SCF_VALUE_NONE 0 }
 | 
			
		||||
    { SCF_SCALE 1 }
 | 
			
		||||
    { SCF_PHYSICAL 2 } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT GetDpiForMonitor ( HMONITOR hMonitor, MONITOR_DPI_TYPE dpiType, UINT* dpiX, UINT *dpiY )
 | 
			
		||||
 | 
			
		||||
ENUM: DEVICE_SCALE_FACTOR
 | 
			
		||||
    { DEVICE_SCALE_FACTOR_INVALID 0 }
 | 
			
		||||
    { SCALE_100_PERCENT 100 }
 | 
			
		||||
    { SCALE_120_PERCENT 120 }
 | 
			
		||||
    { SCALE_125_PERCENT 125 }
 | 
			
		||||
    { SCALE_140_PERCENT 140 }
 | 
			
		||||
    { SCALE_150_PERCENT 150 }
 | 
			
		||||
    { SCALE_160_PERCENT 160 }
 | 
			
		||||
    { SCALE_175_PERCENT 175 }
 | 
			
		||||
    { SCALE_180_PERCENT 180 }
 | 
			
		||||
    { SCALE_200_PERCENT 200 }
 | 
			
		||||
    { SCALE_225_PERCENT 223 }
 | 
			
		||||
    { SCALE_250_PERCENT 250 }
 | 
			
		||||
    { SCALE_300_PERCENT 300 }
 | 
			
		||||
    { SCALE_350_PERCENT 350 }
 | 
			
		||||
    { SCALE_400_PERCENT 400 }
 | 
			
		||||
    { SCALE_450_PERCENT 450 }
 | 
			
		||||
    { SCALE_500_PERCENT 500 } ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT GetScaleFactorForMonitor (
 | 
			
		||||
    HMONITOR            hMon,
 | 
			
		||||
    DEVICE_SCALE_FACTOR *pScale
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT RegisterScaleChangeEvent (
 | 
			
		||||
    HANDLE    hEvent,
 | 
			
		||||
    DWORD_PTR *pdwCookie
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
ENUM: DISPLAY_DEVICE_TYPE
 | 
			
		||||
    { DEVICE_PRIMARY 0 }
 | 
			
		||||
    { DEVICE_IMMERSIVE 1 } ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT RevokeScaleChangeNotifications (
 | 
			
		||||
    DISPLAY_DEVICE_TYPE displayDevice,
 | 
			
		||||
    DWORD               dwCookie
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT UnregisterScaleChangeEvent (
 | 
			
		||||
    DWORD_PTR dwCookie
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT GetProcessDpiAwareness ( HANDLE hprocess, PROCESS_DPI_AWARENESS* value )
 | 
			
		||||
FUNCTION: HRESULT SetProcessDpiAwareness ( PROCESS_DPI_AWARENESS value )
 | 
			
		||||
 | 
			
		||||
ENUM: SHELL_UI_COMPONENT
 | 
			
		||||
    { SHELL_UI_COMPONENT_TASKBARS 0 }
 | 
			
		||||
    { SHELL_UI_COMPONENT_NOTIFICATIONAREA 1 }
 | 
			
		||||
    { SHELL_UI_COMPONENT_DESKBAND 2 } ;
 | 
			
		||||
| 
						 | 
				
			
			@ -2263,11 +2263,6 @@ STRUCT: POWERBROADCAST_SETTING
 | 
			
		|||
! HighDPI
 | 
			
		||||
TYPEDEF: HANDLE DPI_AWARENESS_CONTEXT
 | 
			
		||||
 | 
			
		||||
ENUM: PROCESS_DPI_AWARENESS
 | 
			
		||||
    { PROCESS_DPI_UNAWARE 0 }
 | 
			
		||||
    { PROCESS_SYSTEM_DPI_AWARE 1 }
 | 
			
		||||
    { PROCESS_PER_MONITOR_DPI_AWARE 2 } ;
 | 
			
		||||
 | 
			
		||||
ENUM: DPI_AWARENESS
 | 
			
		||||
    { DPI_AWARENESS_INVALID -1 }
 | 
			
		||||
    { DPI_AWARENESS_UNAWARE 0 }
 | 
			
		||||
| 
						 | 
				
			
			@ -2314,8 +2309,6 @@ FUNCTION: UINT GetDpiForSystem ( )
 | 
			
		|||
 | 
			
		||||
FUNCTION: UINT GetDpiForWindow ( HWND hwnd )
 | 
			
		||||
 | 
			
		||||
FUNCTION: HRESULT GetProcessDpiAwareness ( HANDLE hprocess, PROCESS_DPI_AWARENESS* value )
 | 
			
		||||
 | 
			
		||||
FUNCTION: UINT GetSystemDpiForProcess (
 | 
			
		||||
    HANDLE hProcess
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -2340,28 +2333,40 @@ FUNCTION: DPI_HOSTING_BEHAVIOR GetWindowDpiHostingBehavior (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
FUNCTION: BOOL SetProcessDPIAware ( )
 | 
			
		||||
FUNCTION: HRESULT SetProcessDpiAwareness ( PROCESS_DPI_AWARENESS value )
 | 
			
		||||
FUNCTION: BOOL SetProcessDpiAwarenessContext ( DPI_AWARENESS_CONTEXT value )
 | 
			
		||||
 | 
			
		||||
FUNCTION: DPI_AWARENESS_CONTEXT GetWindowDpiAwarenessContext ( HWND hwnd )
 | 
			
		||||
FUNCTION: DPI_AWARENESS GetAwarenessFromDpiAwarenessContext ( DPI_AWARENESS_CONTEXT value )
 | 
			
		||||
 | 
			
		||||
: get-thread-dpi-awareness ( -- enum )
 | 
			
		||||
    GetThreadDpiAwarenessContext GetAwarenessFromDpiAwarenessContext ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: BOOL IsValidDpiAwarenessContext (
 | 
			
		||||
    DPI_AWARENESS_CONTEXT value
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
! Needs work
 | 
			
		||||
! GetThreadDpiAwarenessContext -8 swap <displaced-alien> IsValidDpiAwarenessContext ! 0, should be 1
 | 
			
		||||
! : DPI_AWARENESS_CONTEXT_UNAWARE ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
!     GetThreadDpiAwarenessContext -1 swap <displaced-alien> ;
 | 
			
		||||
! : DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
!     GetThreadDpiAwarenessContext -2 swap <displaced-alien> ;
 | 
			
		||||
! : DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
!     GetThreadDpiAwarenessContext -3 swap <displaced-alien> ;
 | 
			
		||||
! : DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
!     GetThreadDpiAwarenessContext -4 swap <displaced-alien> ;
 | 
			
		||||
! : DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
!     GetThreadDpiAwarenessContext -5 swap <displaced-alien> ;
 | 
			
		||||
! DPI_AWARENESS_CONTEXT experimentally:
 | 
			
		||||
! USE: math.ranges -100 1000 [a,b] [ <alien> IsValidDpiAwarenessContext ] map-zip
 | 
			
		||||
! [ nip 0 > ] assoc-filter keys .
 | 
			
		||||
! { -5 -4 -3 -2 -1 17 18 34 273 529 785 }
 | 
			
		||||
 | 
			
		||||
! -4 <alien> 34 <alien> AreDpiAwarenessContextsEqual . ! t
 | 
			
		||||
! -5 <alien> -5 <alien> AreDpiAwarenessContextsEqual . ! t
 | 
			
		||||
! -6 <alien> -6 <alien> AreDpiAwarenessContextsEqual . ! f
 | 
			
		||||
: DPI_AWARENESS_CONTEXT_UNAWARE ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
    -1 <alien> ;
 | 
			
		||||
 | 
			
		||||
: DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
    -2 <alien> ;
 | 
			
		||||
 | 
			
		||||
: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
    -3 <alien> ;
 | 
			
		||||
 | 
			
		||||
: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
    -4 <alien> ;
 | 
			
		||||
 | 
			
		||||
: DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ( -- DPI_AWARENESS_CONTEXT )
 | 
			
		||||
    -5 <alien> ;
 | 
			
		||||
 | 
			
		||||
FUNCTION: BOOL LogicalToPhysicalPointForPerMonitorDPI (
 | 
			
		||||
    HWND    hWnd,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
! Copyright (C) 2010 Doug Coleman.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors alien.c-types arrays classes.struct fry kernel
 | 
			
		||||
literals locals make math math.bitwise multiline sequences
 | 
			
		||||
slots.syntax ui.backend.windows vocabs.loader windows.errors
 | 
			
		||||
windows.gdi32 windows.kernel32 windows.types windows.user32
 | 
			
		||||
ui.gadgets.worlds ;
 | 
			
		||||
USING: accessors alien.c-types alien.data classes.struct
 | 
			
		||||
io.binary kernel literals locals make math math.bitwise
 | 
			
		||||
sequences slots.syntax ui.backend.windows ui.gadgets.worlds
 | 
			
		||||
windows.errors windows.gdi32 windows.shcore windows.types
 | 
			
		||||
windows.user32 ;
 | 
			
		||||
IN: windows.fullscreen
 | 
			
		||||
 | 
			
		||||
: hwnd>hmonitor ( HWND -- HMONITOR )
 | 
			
		||||
| 
						 | 
				
			
			@ -140,3 +140,7 @@ ERROR: unsupported-resolution triple ;
 | 
			
		|||
 | 
			
		||||
: set-fullscreen ( gadget triple fullscreen? -- )
 | 
			
		||||
    [ find-world ] 2dip (set-fullscreen) ;
 | 
			
		||||
 | 
			
		||||
: get-desktop-scale-factor ( -- n )
 | 
			
		||||
    desktop-hmonitor 0 DEVICE_SCALE_FACTOR <ref>
 | 
			
		||||
    [ GetScaleFactorForMonitor win32-error=0/f ] keep le> ;
 | 
			
		||||
		Loading…
	
		Reference in New Issue