zorldo

Goofing around with Ebiten
git clone git://bsandro.tech/zorldo
Log | Files | Refs | README

win32_platform.h (15740B)


      1 //========================================================================
      2 // GLFW 3.3 Win32 - www.glfw.org
      3 //------------------------------------------------------------------------
      4 // Copyright (c) 2002-2006 Marcus Geelnard
      5 // Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>
      6 //
      7 // This software is provided 'as-is', without any express or implied
      8 // warranty. In no event will the authors be held liable for any damages
      9 // arising from the use of this software.
     10 //
     11 // Permission is granted to anyone to use this software for any purpose,
     12 // including commercial applications, and to alter it and redistribute it
     13 // freely, subject to the following restrictions:
     14 //
     15 // 1. The origin of this software must not be misrepresented; you must not
     16 //    claim that you wrote the original software. If you use this software
     17 //    in a product, an acknowledgment in the product documentation would
     18 //    be appreciated but is not required.
     19 //
     20 // 2. Altered source versions must be plainly marked as such, and must not
     21 //    be misrepresented as being the original software.
     22 //
     23 // 3. This notice may not be removed or altered from any source
     24 //    distribution.
     25 //
     26 //========================================================================
     27 
     28 // We don't need all the fancy stuff
     29 #ifndef NOMINMAX
     30  #define NOMINMAX
     31 #endif
     32 
     33 #ifndef VC_EXTRALEAN
     34  #define VC_EXTRALEAN
     35 #endif
     36 
     37 #ifndef WIN32_LEAN_AND_MEAN
     38  #define WIN32_LEAN_AND_MEAN
     39 #endif
     40 
     41 // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for
     42 // example to allow applications to correctly declare a GL_ARB_debug_output
     43 // callback) but windows.h assumes no one will define APIENTRY before it does
     44 #undef APIENTRY
     45 
     46 // GLFW on Windows is Unicode only and does not work in MBCS mode
     47 #ifndef UNICODE
     48  #define UNICODE
     49 #endif
     50 
     51 // GLFW requires Windows XP or later
     52 #if WINVER < 0x0501
     53  #undef WINVER
     54  #define WINVER 0x0501
     55 #endif
     56 #if _WIN32_WINNT < 0x0501
     57  #undef _WIN32_WINNT
     58  #define _WIN32_WINNT 0x0501
     59 #endif
     60 
     61 // GLFW uses DirectInput8 interfaces
     62 #define DIRECTINPUT_VERSION 0x0800
     63 
     64 // GLFW uses OEM cursor resources
     65 #define OEMRESOURCE
     66 
     67 #include <wctype.h>
     68 #include <windows.h>
     69 #include <dinput.h>
     70 #include <xinput.h>
     71 #include <dbt.h>
     72 
     73 // HACK: Define macros that some windows.h variants don't
     74 #ifndef WM_MOUSEHWHEEL
     75  #define WM_MOUSEHWHEEL 0x020E
     76 #endif
     77 #ifndef WM_DWMCOMPOSITIONCHANGED
     78  #define WM_DWMCOMPOSITIONCHANGED 0x031E
     79 #endif
     80 #ifndef WM_DWMCOLORIZATIONCOLORCHANGED
     81  #define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320
     82 #endif
     83 #ifndef WM_COPYGLOBALDATA
     84  #define WM_COPYGLOBALDATA 0x0049
     85 #endif
     86 #ifndef WM_UNICHAR
     87  #define WM_UNICHAR 0x0109
     88 #endif
     89 #ifndef UNICODE_NOCHAR
     90  #define UNICODE_NOCHAR 0xFFFF
     91 #endif
     92 #ifndef WM_DPICHANGED
     93  #define WM_DPICHANGED 0x02E0
     94 #endif
     95 #ifndef GET_XBUTTON_WPARAM
     96  #define GET_XBUTTON_WPARAM(w) (HIWORD(w))
     97 #endif
     98 #ifndef EDS_ROTATEDMODE
     99  #define EDS_ROTATEDMODE 0x00000004
    100 #endif
    101 #ifndef DISPLAY_DEVICE_ACTIVE
    102  #define DISPLAY_DEVICE_ACTIVE 0x00000001
    103 #endif
    104 #ifndef _WIN32_WINNT_WINBLUE
    105  #define _WIN32_WINNT_WINBLUE 0x0603
    106 #endif
    107 #ifndef _WIN32_WINNT_WIN8
    108  #define _WIN32_WINNT_WIN8 0x0602
    109 #endif
    110 #ifndef WM_GETDPISCALEDSIZE
    111  #define WM_GETDPISCALEDSIZE 0x02e4
    112 #endif
    113 #ifndef USER_DEFAULT_SCREEN_DPI
    114  #define USER_DEFAULT_SCREEN_DPI 96
    115 #endif
    116 #ifndef OCR_HAND
    117  #define OCR_HAND 32649
    118 #endif
    119 
    120 #if WINVER < 0x0601
    121 typedef struct
    122 {
    123     DWORD cbSize;
    124     DWORD ExtStatus;
    125 } CHANGEFILTERSTRUCT;
    126 #ifndef MSGFLT_ALLOW
    127  #define MSGFLT_ALLOW 1
    128 #endif
    129 #endif /*Windows 7*/
    130 
    131 #if WINVER < 0x0600
    132 #define DWM_BB_ENABLE 0x00000001
    133 #define DWM_BB_BLURREGION 0x00000002
    134 typedef struct
    135 {
    136     DWORD dwFlags;
    137     BOOL fEnable;
    138     HRGN hRgnBlur;
    139     BOOL fTransitionOnMaximized;
    140 } DWM_BLURBEHIND;
    141 #else
    142  #include <dwmapi.h>
    143 #endif /*Windows Vista*/
    144 
    145 #ifndef DPI_ENUMS_DECLARED
    146 typedef enum
    147 {
    148     PROCESS_DPI_UNAWARE = 0,
    149     PROCESS_SYSTEM_DPI_AWARE = 1,
    150     PROCESS_PER_MONITOR_DPI_AWARE = 2
    151 } PROCESS_DPI_AWARENESS;
    152 typedef enum
    153 {
    154     MDT_EFFECTIVE_DPI = 0,
    155     MDT_ANGULAR_DPI = 1,
    156     MDT_RAW_DPI = 2,
    157     MDT_DEFAULT = MDT_EFFECTIVE_DPI
    158 } MONITOR_DPI_TYPE;
    159 #endif /*DPI_ENUMS_DECLARED*/
    160 
    161 #ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
    162 #define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((HANDLE) -4)
    163 #endif /*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/
    164 
    165 // HACK: Define versionhelpers.h functions manually as MinGW lacks the header
    166 #define IsWindowsXPOrGreater()                                 \
    167     _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINXP),   \
    168                                         LOBYTE(_WIN32_WINNT_WINXP), 0)
    169 #define IsWindowsVistaOrGreater()                                     \
    170     _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_VISTA),   \
    171                                         LOBYTE(_WIN32_WINNT_VISTA), 0)
    172 #define IsWindows7OrGreater()                                         \
    173     _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN7),    \
    174                                         LOBYTE(_WIN32_WINNT_WIN7), 0)
    175 #define IsWindows8OrGreater()                                         \
    176     _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN8),    \
    177                                         LOBYTE(_WIN32_WINNT_WIN8), 0)
    178 #define IsWindows8Point1OrGreater()                                   \
    179     _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINBLUE), \
    180                                         LOBYTE(_WIN32_WINNT_WINBLUE), 0)
    181 
    182 #define _glfwIsWindows10AnniversaryUpdateOrGreaterWin32() \
    183     _glfwIsWindows10BuildOrGreaterWin32(14393)
    184 #define _glfwIsWindows10CreatorsUpdateOrGreaterWin32() \
    185     _glfwIsWindows10BuildOrGreaterWin32(15063)
    186 
    187 // HACK: Define macros that some xinput.h variants don't
    188 #ifndef XINPUT_CAPS_WIRELESS
    189  #define XINPUT_CAPS_WIRELESS 0x0002
    190 #endif
    191 #ifndef XINPUT_DEVSUBTYPE_WHEEL
    192  #define XINPUT_DEVSUBTYPE_WHEEL 0x02
    193 #endif
    194 #ifndef XINPUT_DEVSUBTYPE_ARCADE_STICK
    195  #define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03
    196 #endif
    197 #ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK
    198  #define XINPUT_DEVSUBTYPE_FLIGHT_STICK 0x04
    199 #endif
    200 #ifndef XINPUT_DEVSUBTYPE_DANCE_PAD
    201  #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05
    202 #endif
    203 #ifndef XINPUT_DEVSUBTYPE_GUITAR
    204  #define XINPUT_DEVSUBTYPE_GUITAR 0x06
    205 #endif
    206 #ifndef XINPUT_DEVSUBTYPE_DRUM_KIT
    207  #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08
    208 #endif
    209 #ifndef XINPUT_DEVSUBTYPE_ARCADE_PAD
    210  #define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13
    211 #endif
    212 #ifndef XUSER_MAX_COUNT
    213  #define XUSER_MAX_COUNT 4
    214 #endif
    215 
    216 // HACK: Define macros that some dinput.h variants don't
    217 #ifndef DIDFT_OPTIONAL
    218  #define DIDFT_OPTIONAL 0x80000000
    219 #endif
    220 
    221 // winmm.dll function pointer typedefs
    222 typedef DWORD (WINAPI * PFN_timeGetTime)(void);
    223 #define timeGetTime _glfw.win32.winmm.GetTime
    224 
    225 // xinput.dll function pointer typedefs
    226 typedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);
    227 typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);
    228 #define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities
    229 #define XInputGetState _glfw.win32.xinput.GetState
    230 
    231 // dinput8.dll function pointer typedefs
    232 typedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);
    233 #define DirectInput8Create _glfw.win32.dinput8.Create
    234 
    235 // user32.dll function pointer typedefs
    236 typedef BOOL (WINAPI * PFN_SetProcessDPIAware)(void);
    237 typedef BOOL (WINAPI * PFN_ChangeWindowMessageFilterEx)(HWND,UINT,DWORD,CHANGEFILTERSTRUCT*);
    238 typedef BOOL (WINAPI * PFN_EnableNonClientDpiScaling)(HWND);
    239 typedef BOOL (WINAPI * PFN_SetProcessDpiAwarenessContext)(HANDLE);
    240 typedef UINT (WINAPI * PFN_GetDpiForWindow)(HWND);
    241 typedef BOOL (WINAPI * PFN_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);
    242 #define SetProcessDPIAware _glfw.win32.user32.SetProcessDPIAware_
    243 #define ChangeWindowMessageFilterEx _glfw.win32.user32.ChangeWindowMessageFilterEx_
    244 #define EnableNonClientDpiScaling _glfw.win32.user32.EnableNonClientDpiScaling_
    245 #define SetProcessDpiAwarenessContext _glfw.win32.user32.SetProcessDpiAwarenessContext_
    246 #define GetDpiForWindow _glfw.win32.user32.GetDpiForWindow_
    247 #define AdjustWindowRectExForDpi _glfw.win32.user32.AdjustWindowRectExForDpi_
    248 
    249 // dwmapi.dll function pointer typedefs
    250 typedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*);
    251 typedef HRESULT (WINAPI * PFN_DwmFlush)(VOID);
    252 typedef HRESULT(WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);
    253 typedef HRESULT (WINAPI * PFN_DwmGetColorizationColor)(DWORD*,BOOL*);
    254 #define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled
    255 #define DwmFlush _glfw.win32.dwmapi.Flush
    256 #define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow
    257 #define DwmGetColorizationColor _glfw.win32.dwmapi.GetColorizationColor
    258 
    259 // shcore.dll function pointer typedefs
    260 typedef HRESULT (WINAPI * PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS);
    261 typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,UINT*);
    262 #define SetProcessDpiAwareness _glfw.win32.shcore.SetProcessDpiAwareness_
    263 #define GetDpiForMonitor _glfw.win32.shcore.GetDpiForMonitor_
    264 
    265 // ntdll.dll function pointer typedefs
    266 typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG);
    267 #define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_
    268 
    269 typedef VkFlags VkWin32SurfaceCreateFlagsKHR;
    270 
    271 typedef struct VkWin32SurfaceCreateInfoKHR
    272 {
    273     VkStructureType                 sType;
    274     const void*                     pNext;
    275     VkWin32SurfaceCreateFlagsKHR    flags;
    276     HINSTANCE                       hinstance;
    277     HWND                            hwnd;
    278 } VkWin32SurfaceCreateInfoKHR;
    279 
    280 typedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
    281 typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t);
    282 
    283 #include "win32_joystick.h"
    284 #include "wgl_context.h"
    285 #include "egl_context.h"
    286 #include "osmesa_context.h"
    287 
    288 #if !defined(_GLFW_WNDCLASSNAME)
    289  #define _GLFW_WNDCLASSNAME L"GLFW30"
    290 #endif
    291 
    292 #define _glfw_dlopen(name) LoadLibraryA(name)
    293 #define _glfw_dlclose(handle) FreeLibrary((HMODULE) handle)
    294 #define _glfw_dlsym(handle, name) GetProcAddress((HMODULE) handle, name)
    295 
    296 #define _GLFW_EGL_NATIVE_WINDOW  ((EGLNativeWindowType) window->win32.handle)
    297 #define _GLFW_EGL_NATIVE_DISPLAY EGL_DEFAULT_DISPLAY
    298 
    299 #define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowWin32  win32
    300 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32
    301 #define _GLFW_PLATFORM_LIBRARY_TIMER_STATE  _GLFWtimerWin32   win32
    302 #define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorWin32 win32
    303 #define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorWin32  win32
    304 #define _GLFW_PLATFORM_TLS_STATE            _GLFWtlsWin32     win32
    305 #define _GLFW_PLATFORM_MUTEX_STATE          _GLFWmutexWin32   win32
    306 
    307 
    308 // Win32-specific per-window data
    309 //
    310 typedef struct _GLFWwindowWin32
    311 {
    312     HWND                handle;
    313     HICON               bigIcon;
    314     HICON               smallIcon;
    315 
    316     GLFWbool            cursorTracked;
    317     GLFWbool            frameAction;
    318     GLFWbool            iconified;
    319     GLFWbool            maximized;
    320     // Whether to enable framebuffer transparency on DWM
    321     GLFWbool            transparent;
    322     GLFWbool            scaleToMonitor;
    323 
    324     // Cached size used to filter out duplicate events
    325     int                 width, height;
    326 
    327     // The last received cursor position, regardless of source
    328     int                 lastCursorPosX, lastCursorPosY;
    329     // The last recevied high surrogate when decoding pairs of UTF-16 messages
    330     WCHAR               highSurrogate;
    331 
    332 } _GLFWwindowWin32;
    333 
    334 // Win32-specific global data
    335 //
    336 typedef struct _GLFWlibraryWin32
    337 {
    338     HWND                helperWindowHandle;
    339     HDEVNOTIFY          deviceNotificationHandle;
    340     DWORD               foregroundLockTimeout;
    341     int                 acquiredMonitorCount;
    342     char*               clipboardString;
    343     short int           keycodes[512];
    344     short int           scancodes[GLFW_KEY_LAST + 1];
    345     char                keynames[GLFW_KEY_LAST + 1][5];
    346     // Where to place the cursor when re-enabled
    347     double              restoreCursorPosX, restoreCursorPosY;
    348     // The window whose disabled cursor mode is active
    349     _GLFWwindow*        disabledCursorWindow;
    350     RAWINPUT*           rawInput;
    351     int                 rawInputSize;
    352     UINT                mouseTrailSize;
    353 
    354     struct {
    355         HINSTANCE                       instance;
    356         PFN_timeGetTime                 GetTime;
    357     } winmm;
    358 
    359     struct {
    360         HINSTANCE                       instance;
    361         PFN_DirectInput8Create          Create;
    362         IDirectInput8W*                 api;
    363     } dinput8;
    364 
    365     struct {
    366         HINSTANCE                       instance;
    367         PFN_XInputGetCapabilities       GetCapabilities;
    368         PFN_XInputGetState              GetState;
    369     } xinput;
    370 
    371     struct {
    372         HINSTANCE                       instance;
    373         PFN_SetProcessDPIAware          SetProcessDPIAware_;
    374         PFN_ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx_;
    375         PFN_EnableNonClientDpiScaling   EnableNonClientDpiScaling_;
    376         PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_;
    377         PFN_GetDpiForWindow             GetDpiForWindow_;
    378         PFN_AdjustWindowRectExForDpi    AdjustWindowRectExForDpi_;
    379     } user32;
    380 
    381     struct {
    382         HINSTANCE                       instance;
    383         PFN_DwmIsCompositionEnabled     IsCompositionEnabled;
    384         PFN_DwmFlush                    Flush;
    385         PFN_DwmEnableBlurBehindWindow   EnableBlurBehindWindow;
    386         PFN_DwmGetColorizationColor     GetColorizationColor;
    387     } dwmapi;
    388 
    389     struct {
    390         HINSTANCE                       instance;
    391         PFN_SetProcessDpiAwareness      SetProcessDpiAwareness_;
    392         PFN_GetDpiForMonitor            GetDpiForMonitor_;
    393     } shcore;
    394 
    395     struct {
    396         HINSTANCE                       instance;
    397         PFN_RtlVerifyVersionInfo        RtlVerifyVersionInfo_;
    398     } ntdll;
    399 
    400 } _GLFWlibraryWin32;
    401 
    402 // Win32-specific per-monitor data
    403 //
    404 typedef struct _GLFWmonitorWin32
    405 {
    406     HMONITOR            handle;
    407     // This size matches the static size of DISPLAY_DEVICE.DeviceName
    408     WCHAR               adapterName[32];
    409     WCHAR               displayName[32];
    410     char                publicAdapterName[32];
    411     char                publicDisplayName[32];
    412     GLFWbool            modesPruned;
    413     GLFWbool            modeChanged;
    414 
    415 } _GLFWmonitorWin32;
    416 
    417 // Win32-specific per-cursor data
    418 //
    419 typedef struct _GLFWcursorWin32
    420 {
    421     HCURSOR             handle;
    422 
    423 } _GLFWcursorWin32;
    424 
    425 // Win32-specific global timer data
    426 //
    427 typedef struct _GLFWtimerWin32
    428 {
    429     GLFWbool            hasPC;
    430     uint64_t            frequency;
    431 
    432 } _GLFWtimerWin32;
    433 
    434 // Win32-specific thread local storage data
    435 //
    436 typedef struct _GLFWtlsWin32
    437 {
    438     GLFWbool            allocated;
    439     DWORD               index;
    440 
    441 } _GLFWtlsWin32;
    442 
    443 // Win32-specific mutex data
    444 //
    445 typedef struct _GLFWmutexWin32
    446 {
    447     GLFWbool            allocated;
    448     CRITICAL_SECTION    section;
    449 
    450 } _GLFWmutexWin32;
    451 
    452 
    453 GLFWbool _glfwRegisterWindowClassWin32(void);
    454 void _glfwUnregisterWindowClassWin32(void);
    455 
    456 WCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source);
    457 char* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source);
    458 BOOL _glfwIsWindowsVersionOrGreaterWin32(WORD major, WORD minor, WORD sp);
    459 BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build);
    460 void _glfwInputErrorWin32(int error, const char* description);
    461 void _glfwUpdateKeyNamesWin32(void);
    462 
    463 void _glfwInitTimerWin32(void);
    464 
    465 void _glfwPollMonitorsWin32(void);
    466 void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);
    467 void _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor);
    468 void _glfwGetMonitorContentScaleWin32(HMONITOR handle, float* xscale, float* yscale);
    469