diff --git a/src/win32_init.c b/src/win32_init.c old mode 100644 new mode 100755 index c39c67c16..beed97863 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -96,6 +96,22 @@ static GLboolean initLibraries(void) GetProcAddress(_glfw.win32.user32.instance, "SetProcessDPIAware"); _glfw.win32.user32.ChangeWindowMessageFilterEx = (CHANGEWINDOWMESSAGEFILTEREX_T) GetProcAddress(_glfw.win32.user32.instance, "ChangeWindowMessageFilterEx"); + _glfw.win32.user32.GetTouchInputInfo = (GETTOUCHINPUTINFO_T) + GetProcAddress(_glfw.win32.user32.instance, "GetTouchInputInfo"); + _glfw.win32.user32.CloseTouchInputHandle = (CLOSETOUCHINPUTHANDLE_T) + GetProcAddress(_glfw.win32.user32.instance, "CloseTouchInputHandle"); + _glfw.win32.user32.RegisterTouchWindow = (REGISTERTOUCHWINDOW_T) + GetProcAddress(_glfw.win32.user32.instance, "RegisterTouchWindow"); + _glfw.win32.user32.UnregisterTouchWindow = (UNREGISTERTOUCHWINDOW_T) + GetProcAddress(_glfw.win32.user32.instance, "UnregisterTouchWindow"); + } + + if (_glfw.win32.user32.GetTouchInputInfo && + _glfw.win32.user32.CloseTouchInputHandle && + _glfw.win32.user32.RegisterTouchWindow && + _glfw.win32.user32.UnregisterTouchWindow) + { + _glfw.win32.touch.available = GL_TRUE; } _glfw.win32.dwmapi.instance = LoadLibraryW(L"dwmapi.dll"); diff --git a/src/win32_platform.h b/src/win32_platform.h old mode 100644 new mode 100755 index 6313a918e..22c03bbd5 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -99,6 +99,34 @@ typedef struct tagCHANGEFILTERSTRUCT #endif #endif /*Windows 7*/ +#if WINVER < 0x0601 + +#define WM_TOUCH 0x0240 + +DECLARE_HANDLE(HTOUCHINPUT); + +typedef struct tagTOUCHINPUT +{ + LONG x; + LONG y; + HANDLE hSource; + DWORD dwID; + DWORD dwFlags; + DWORD dwMask; + DWORD dwTime; + ULONG_PTR dwExtraInfo; + DWORD cxContact; + DWORD cyContext; +} TOUCHINPUT, *PTOUCHINPUT; + +#define TOUCH_COORD_TO_PIXEL(x) ((x) / 100) + +#define TOUCHEVENTF_MOVE 0x0001 +#define TOUCHEVENTF_DOWN 0x0002 +#define TOUCHEVENTF_UP 0x0004 + +#endif /*WINVER < 0x0601*/ + // winmm.dll function pointer typedefs typedef MMRESULT (WINAPI * JOYGETDEVCAPS_T)(UINT,LPJOYCAPS,UINT); typedef MMRESULT (WINAPI * JOYGETPOS_T)(UINT,LPJOYINFO); @@ -112,8 +140,16 @@ typedef DWORD (WINAPI * TIMEGETTIME_T)(void); // user32.dll function pointer typedefs typedef BOOL (WINAPI * SETPROCESSDPIAWARE_T)(void); typedef BOOL (WINAPI * CHANGEWINDOWMESSAGEFILTEREX_T)(HWND,UINT,DWORD,PCHANGEFILTERSTRUCT); +typedef BOOL (WINAPI * GETTOUCHINPUTINFO_T)(HTOUCHINPUT,UINT,PTOUCHINPUT,int); +typedef BOOL (WINAPI * CLOSETOUCHINPUTHANDLE_T)(HTOUCHINPUT); +typedef BOOL (WINAPI * REGISTERTOUCHWINDOW_T)(HWND,LONG); +typedef BOOL (WINAPI * UNREGISTERTOUCHWINDOW_T)(HWND); #define _glfw_SetProcessDPIAware _glfw.win32.user32.SetProcessDPIAware #define _glfw_ChangeWindowMessageFilterEx _glfw.win32.user32.ChangeWindowMessageFilterEx +#define _glfw_GetTouchInputInfo _glfw.win32.user32.GetTouchInputInfo +#define _glfw_CloseTouchInputHandle _glfw.win32.user32.CloseTouchInputHandle +#define _glfw_RegisterTouchWindow _glfw.win32.user32.RegisterTouchWindow +#define _glfw_UnregisterTouchWindow _glfw.win32.user32.UnregisterTouchWindow // dwmapi.dll function pointer typedefs typedef HRESULT (WINAPI * DWMISCOMPOSITIONENABLED_T)(BOOL*); @@ -184,8 +220,16 @@ typedef struct _GLFWlibraryWin32 HINSTANCE instance; SETPROCESSDPIAWARE_T SetProcessDPIAware; CHANGEWINDOWMESSAGEFILTEREX_T ChangeWindowMessageFilterEx; + GETTOUCHINPUTINFO_T GetTouchInputInfo; + CLOSETOUCHINPUTHANDLE_T CloseTouchInputHandle; + REGISTERTOUCHWINDOW_T RegisterTouchWindow; + UNREGISTERTOUCHWINDOW_T UnregisterTouchWindow; } user32; + struct { + GLboolean available; + } touch; + // dwmapi.dll struct { HINSTANCE instance; diff --git a/src/win32_window.c b/src/win32_window.c index df3ae6d5e..d171361f1 100755 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -527,10 +527,13 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, TOUCHINPUT* inputs; UINT count = LOWORD(wParam); + if (!_glfw.win32.touch.available) + return 0; + inputs = (TOUCHINPUT*) malloc(sizeof(TOUCHINPUT) * count); - if (GetTouchInputInfo((HTOUCHINPUT) lParam, - count, inputs, sizeof(TOUCHINPUT))) + if (_glfw_GetTouchInputInfo((HTOUCHINPUT) lParam, + count, inputs, sizeof(TOUCHINPUT))) { int i, width, height; @@ -564,7 +567,7 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, } } - CloseTouchInputHandle((HTOUCHINPUT) lParam); + _glfw_CloseTouchInputHandle((HTOUCHINPUT) lParam); } free(inputs); @@ -1095,10 +1098,13 @@ void _glfwPlatformPostEmptyEvent(void) void _glfwPlatformSetTouchInput(_GLFWwindow* window, int enabled) { + if (!_glfw.win32.touch.available) + return; + if (enabled) - RegisterTouchWindow(window->win32.handle, 0); + _glfw_RegisterTouchWindow(window->win32.handle, 0); else - UnregisterTouchWindow(window->win32.handle); + _glfw_UnregisterTouchWindow(window->win32.handle); } void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)