--- old/src/java.desktop/windows/native/libawt/windows/awt.h 2017-09-25 11:46:14.977807800 +0530 +++ new/src/java.desktop/windows/native/libawt/windows/awt.h 2017-09-25 11:46:14.095969000 +0530 @@ -163,6 +163,9 @@ #define IS_WIN2000 (LOBYTE(LOWORD(::GetVersion())) >= 5) #define IS_WINXP ((IS_WIN2000 && HIBYTE(LOWORD(::GetVersion())) >= 1) || LOBYTE(LOWORD(::GetVersion())) > 5) #define IS_WINVISTA (LOBYTE(LOWORD(::GetVersion())) >= 6) +#define IS_WIN8 (\ + (IS_WINVISTA && (HIBYTE(LOWORD(::GetVersion())) >= 2)) ||\ + (LOBYTE(LOWORD(::GetVersion())) > 6)) #define IS_WINVER_ATLEAST(maj, min) \ ((maj) < LOBYTE(LOWORD(::GetVersion())) || \ --- old/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp 2017-09-25 11:46:21.102548600 +0530 +++ new/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp 2017-09-25 11:46:20.205669900 +0530 @@ -1713,6 +1713,76 @@ break; } break; + + /* WM_POINTER is enabled for the TOUCH type 'pointer' input + This touch typed 'pointer' would map to the mouse functionality */ + case WM_POINTERENTER: + { + AwtToolkit& tk = AwtToolkit::GetInstance(); + UINT32 pointerId = GET_POINTERID_WPARAM(wParam); + POINTER_INFO pinfo; + + if(tk.TIGetPointerInfo(pointerId, &pinfo)) { + if (pinfo.pointerType == PT_TOUCH) { + POINT pdDnPoint = pinfo.ptPixelLocation; + if(::ScreenToClient(GetHWnd(), &pdDnPoint)) { + mr = WmMouseEnter(static_cast(wParam), pdDnPoint.x, pdDnPoint.y); + } + } + } + } + break; + case WM_POINTERLEAVE: + { + AwtToolkit& tk = AwtToolkit::GetInstance(); + UINT32 pointerId = GET_POINTERID_WPARAM(wParam); + POINTER_INFO pinfo; + + if(tk.TIGetPointerInfo(pointerId, &pinfo)) { + if (pinfo.pointerType == PT_TOUCH) { + POINT pdDnPoint = pinfo.ptPixelLocation; + if(::ScreenToClient(GetHWnd(), &pdDnPoint)) { + mr = WmMouseExit(static_cast(wParam), pdDnPoint.x, pdDnPoint.y); + } + } + } + } + break; + case WM_POINTERDOWN: + { + AwtToolkit& tk = AwtToolkit::GetInstance(); + UINT32 pointerId = GET_POINTERID_WPARAM(wParam); + POINTER_INFO pinfo; + + if(tk.TIGetPointerInfo(pointerId, &pinfo)) { + if (pinfo.pointerType == PT_TOUCH) { + POINT pdDnPoint = pinfo.ptPixelLocation; + if(::ScreenToClient(GetHWnd(), &pdDnPoint)) { + mr = WmMouseDown(static_cast(wParam), pdDnPoint.x, pdDnPoint.y, + LEFT_BUTTON); + } + } + } + } + break; + case WM_POINTERUP: + { + AwtToolkit& tk = AwtToolkit::GetInstance(); + UINT32 pointerId = GET_POINTERID_WPARAM(wParam); + POINTER_INFO pinfo; + + if(tk.TIGetPointerInfo(pointerId, &pinfo)) { + if (pinfo.pointerType == PT_TOUCH) { + POINT pdUpPoint = pinfo.ptPixelLocation; + if(::ScreenToClient(GetHWnd(), &pdUpPoint)) { + mr = WmMouseUp(static_cast(wParam), pdUpPoint.x, pdUpPoint.y, + LEFT_BUTTON); + } + } + } + } + break; + case WM_SETCURSOR: mr = mrDoDefault; if (LOWORD(lParam) == HTCLIENT) { --- old/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2017-09-25 11:46:26.448728600 +0530 +++ new/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.cpp 2017-09-25 11:46:25.576413800 +0530 @@ -305,6 +305,9 @@ m_isDynamicLayoutSet = FALSE; m_areExtraMouseButtonsEnabled = TRUE; + m_isWin8OrLater = FALSE; + m_pGetPointerInfoHandle = NULL; + m_verifyComponents = FALSE; m_breakOnError = FALSE; @@ -517,6 +520,19 @@ awt_dnd_initialize(); + /* + * Initialization of the touch related variables. + */ + tk.m_isWin8OrLater = IS_WIN8; + + if (tk.m_isWin8OrLater) { + HMODULE hUser32Dll = ::LoadLibrary(_T("user32.dll")); + if (hUser32Dll != NULL) { + tk.m_pGetPointerInfoHandle = (GetPointerInfoHandleFunc) + ::GetProcAddress(hUser32Dll, "GetPointerInfo"); + } + } + return TRUE; } @@ -541,6 +557,8 @@ awt_dnd_uninitialize(); awt_clipboard_uninitialize((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); + m_pGetPointerInfoHandle = NULL; + if (tk.m_inputMethodHWnd != NULL) { ::SendMessage(tk.m_inputMethodHWnd, WM_IME_CONTROL, IMC_OPENSTATUSWINDOW, 0); } @@ -2824,3 +2842,12 @@ UINT AwtToolkit::GetNumberOfButtons() { return MOUSE_BUTTONS_WINDOWS_SUPPORTED; } + +BOOL AwtToolkit::TIGetPointerInfo(UINT32 pointerID, POINTER_INFO *pointerInfo) +{ + if (m_pGetPointerInfoHandle == NULL) { + return FALSE; + } + + return m_pGetPointerInfoHandle(pointerID, pointerInfo); +} --- old/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.h 2017-09-25 11:46:31.624478700 +0530 +++ new/src/java.desktop/windows/native/libawt/windows/awt_Toolkit.h 2017-09-25 11:46:30.736100400 +0530 @@ -158,6 +158,67 @@ GetCurrentThreadId(), &(cs), THIS_FILE, __LINE__); \ } +// Redefine WinAPI values related to touch input, if OS < Windows 7. +#if (!defined(WINVER) || ((WINVER) < 0x0601)) + typedef UINT32 POINTER_FLAGS; + typedef UINT32 TOUCH_FLAGS; + typedef UINT32 TOUCH_MASK; + + #define GET_POINTERID_WPARAM(wParam) (LOWORD (wParam)) + + #define WM_POINTERENTER 0x0249 + #define WM_NCPOINTERDOWN 0x0242 + #define WM_NCPOINTERUP 0x0243 + #define WM_NCPOINTERUPDATE 0x0241 + #define WM_POINTERACTIVATE 0x024B + #define WM_POINTERCAPTURECHANGED 0x024C + #define WM_POINTERDOWN 0x0246 + #define WM_POINTERLEAVE 0x024A + #define WM_POINTERUP 0x0247 + #define WM_POINTERUPDATE 0x0245 + + typedef enum _POINTER_BUTTON_CHANGE_TYPE { + POINTER_CHANGE_NONE , + POINTER_CHANGE_FIRSTBUTTON_DOWN , + POINTER_CHANGE_FIRSTBUTTON_UP , + POINTER_CHANGE_SECONDBUTTON_DOWN , + POINTER_CHANGE_SECONDBUTTON_UP , + POINTER_CHANGE_THIRDBUTTON_DOWN , + POINTER_CHANGE_THIRDBUTTON_UP , + POINTER_CHANGE_FOURTHBUTTON_DOWN , + POINTER_CHANGE_FOURTHBUTTON_UP , + POINTER_CHANGE_FIFTHBUTTON_DOWN , + POINTER_CHANGE_FIFTHBUTTON_UP , + } POINTER_BUTTON_CHANGE_TYPE; + + typedef enum tagPOINTER_INPUT_TYPE { + PT_POINTER = 0x00000001, + PT_TOUCH = 0x00000002, + PT_PEN = 0x00000003, + PT_MOUSE = 0x00000004, + PT_TOUCHPAD = 0x00000005 + } POINTER_INPUT_TYPE; + + typedef struct tagPOINTER_INFO { + POINTER_INPUT_TYPE pointerType; + UINT32 pointerId; + UINT32 frameId; + POINTER_FLAGS pointerFlags; + HANDLE sourceDevice; + HWND hwndTarget; + POINT ptPixelLocation; + POINT ptHimetricLocation; + POINT ptPixelLocationRaw; + POINT ptHimetricLocationRaw; + DWORD dwTime; + UINT32 historyCount; + INT32 inputData; + DWORD dwKeyStates; + UINT64 PerformanceCount; + POINTER_BUTTON_CHANGE_TYPE ButtonChangeType; + } POINTER_INFO; +#endif + /************************************************************************ * AwtToolkit class */ @@ -196,6 +257,8 @@ void setExtraMouseButtonsEnabled(BOOL enable); static UINT GetNumberOfButtons(); + BOOL TIGetPointerInfo(UINT32 pointerID, POINTER_INFO *pointerInfo); + INLINE BOOL localPump() { return m_localPump; } INLINE BOOL VerifyComponents() { return FALSE; } // TODO: Use new DebugHelper class to set this flag INLINE HWND GetHWnd() { return m_toolkitHWnd; } @@ -402,6 +465,11 @@ BOOL m_isDisposed; // set to TRUE at end of Dispose BOOL m_areExtraMouseButtonsEnabled; + typedef BOOL (WINAPI *GetPointerInfoHandleFunc)(UINT32 pointerID, POINTER_INFO *pointerInfo); + + BOOL m_isWin8OrLater; + GetPointerInfoHandleFunc m_pGetPointerInfoHandle; + BOOL m_vmSignalled; // set to TRUE if QUERYENDSESSION has successfully // raised SIGTERM