! Copyright (C) 2005, 2006 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
+! See https://factorcode.org/license.txt for BSD license.
USING: accessors alien alien.c-types alien.syntax classes.struct
generalizations kernel literals math math.bitwise namespaces
parser system windows.com.syntax windows.kernel32 windows.ole32
CONSTANT: DISP_CHANGE_BADFLAGS -4
CONSTANT: DISP_CHANGE_BADPARAM -5
+STRUCT: DEVMODE_PROPS1
+ { dmOrientation short }
+ { dmPaperSize short }
+ { dmPaperLength short }
+ { dmPaperWidth short }
+ { dmScale short }
+ { dmCopies short }
+ { dmDefaultSource short }
+ { dmPrintQuality short } ;
+STRUCT: DEVMODE_PROPS2
+ { dmPosition POINTL }
+ { dmDisplayOrientation DWORD }
+ { dmDisplayFixedOutput DWORD } ;
+
+UNION-STRUCT: DEVMODE_UNION_1
+ { props1 DEVMODE_PROPS1 }
+ { props2 DEVMODE_PROPS2 } ;
STRUCT: DEVMODE
- { dmDeviceName TCHAR[CCHDEVICENAME] }
+ { dmDeviceName WCHAR[CCHDEVICENAME] }
{ dmSpecVersion WORD }
{ dmDriverVersion WORD }
{ dmSize WORD }
{ dmDriverExtra WORD }
{ dmFields DWORD }
- { dmOrientation short }
- { dmPaperSize short }
- { dmPaperLength short }
- { dmPaperWidth short }
- { dmScale short }
- { dmCopies short }
- { dmDefaultSource short }
- { dmPrintQuality short }
+ { props DEVMODE_UNION_1 }
{ dmColor short }
{ dmDuplex short }
{ dmYResolution short }
{ dmTTOption short }
{ dmCollate short }
- { dmFormName TCHAR[CCHFORMNAME] }
+ { dmFormName WCHAR[CCHFORMNAME] }
{ dmLogPixels WORD }
{ dmBitsPerPel DWORD }
{ dmPelsWidth DWORD }
{ dmDisplayFrequency DWORD }
{ dmiCMMethod DWORD }
{ dmICMIntent DWORD }
-
{ dmMediaType DWORD }
{ dmDitherType DWORD }
{ dmReserved1 DWORD }
{ dmReserved2 DWORD }
- { dmPanningWidth DWORD } ;
-
-! union { DWORD dmDisplayFlags; DWORD dmNup; } ;
- ! union {
- ! struct {
- ! short dmOrientation;
- ! short dmPaperSize;
- ! short dmPaperLength;
- ! short dmPaperWidth;
- ! short dmScale;
- ! short dmCopies;
- ! short dmDefaultSource;
- ! short dmPrintQuality;
- ! } ;
- ! struct {
- ! POINTL dmPosition;
- ! DWORD dmDisplayOrientation;
- ! DWORD dmDisplayFixedOutput;
- ! } ;
- ! } ;
+ { dmPanningWidth DWORD }
+ { dmPanningHeight DWORD } ;
+TYPEDEF: DEVMODE DEVMODEW
TYPEDEF: DEVMODE* PDEVMODE
TYPEDEF: DEVMODE* LPDEVMODE
+STRUCT: DISPLAY_DEVICEW
+ { cb DWORD }
+ { DeviceName CHAR[32] }
+ { DeviceString CHAR[128] }
+ { StateFlags DWORD }
+ { DeviceID CHAR[128] }
+ { DeviceKey CHAR[128] } ;
+TYPEDEF: DISPLAY_DEVICEW* PDISPLAY_DEVICEW
+TYPEDEF: DISPLAY_DEVICEW* LPDISPLAY_DEVICEW
+
+CALLBACK: BOOL DESKTOPENUMPROCW ( LPWSTR arg1, LPARAM arg2 )
+
CONSTANT: MSGFLT_ADD 1
CONSTANT: MSGFLT_REMOVE 2
! FUNCTION: EnumChildWindows
FUNCTION: UINT EnumClipboardFormats ( UINT format )
! FUNCTION: EnumDesktopsA
-! FUNCTION: EnumDesktopsW
+
+FUNCTION: BOOL EnumDesktopsW (
+ HWINSTA hwinsta,
+ DESKTOPENUMPROCW lpEnumFunc,
+ LPARAM lParam
+)
+
FUNCTION: BOOL EnumDesktopWindows ( HDESK hDesktop, WNDENUMPROC lpFn, LPARAM lParam )
! FUNCTION: EnumDisplayDevicesA
-! FUNCTION: EnumDisplayDevicesW
-! FUNCTION: BOOL EnumDisplayMonitors ( HDC hdc, LPCRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData )
+FUNCTION: BOOL EnumDisplayDevicesW (
+ LPCWSTR lpDevice,
+ DWORD iDevNum,
+ PDISPLAY_DEVICEW lpDisplayDevice,
+ DWORD dwFlags
+)
+CALLBACK: BOOL MONITORENUMPROC ( HMONITOR arg1, HDC arg2, LPRECT arg3, LPARAM arg4 )
+FUNCTION: BOOL EnumDisplayMonitors ( HDC hdc, LPRECT lprcClip, MONITORENUMPROC lpfnEnum, LPARAM dwData )
! FUNCTION: EnumDisplaySettingsA
! FUNCTION: EnumDisplaySettingsExA
-! FUNCTION: EnumDisplaySettingsExW
+FUNCTION: BOOL EnumDisplaySettingsExW ( LPCWSTR lpszDeviceName,
+ DWORD iModeNum,
+ DEVMODEW *lpDevMode,
+ DWORD dwFlags
+)
+
FUNCTION: BOOL EnumDisplaySettingsW ( LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMODE *lpDevMode )
ALIAS: EnumDisplaySettings EnumDisplaySettingsW
! FUNCTION: EnumPropsA
FUNCTION: LPARAM GetMessageExtraInfo ( )
! FUNCTION: GetMessagePos
! FUNCTION: GetMessageTime
-! FUNCTION: GetMonitorInfoA
-
+! FUNCTION: BOOL GetMonitorInfoA ( HMONITOR hMonitor, LPMONITORINFO lpmi )
FUNCTION: BOOL GetMonitorInfoW ( HMONITOR hMonitor, LPMONITORINFO lpmi )
ALIAS: GetMonitorInfo GetMonitorInfoW
FUNCTION: HWND GetParent ( HWND hWnd )
FUNCTION: int GetPriorityClipboardFormat ( UINT* paFormatPriorityList, int cFormats )
! FUNCTION: GetProcessDefaultLayout
-! FUNCTION: GetProcessWindowStation
+FUNCTION: HWINSTA GetProcessWindowStation ( )
! FUNCTION: GetProgmanWindow
! FUNCTION: GetPropA
! FUNCTION: GetPropW
! 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 }
FUNCTION: UINT GetDpiForWindow ( HWND hwnd )
-FUNCTION: HRESULT GetProcessDpiAwareness ( HANDLE hprocess, PROCESS_DPI_AWARENESS* value )
-
FUNCTION: UINT GetSystemDpiForProcess (
HANDLE hProcess
)
)
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: ranges -100 1000 [a..b] [ <alien> IsValidDpiAwarenessContext ] zip-with
+! [ 0 > ] filter-values 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,