JBR-2490 Add option to work with Surface Pen

(cherry picked from commit 5acc7680a1)
(cherry picked from commit b604023cef)
This commit is contained in:
Denis Konoplev
2020-10-23 11:42:02 +03:00
committed by jbrbot
parent 58580580dc
commit 16d7b25f63
2 changed files with 26 additions and 3 deletions

View File

@@ -18,4 +18,10 @@ public class TouchEvent {
* in ms
*/
public static final long NO_UPDATE_TIMEOUT = 1000L;
public final static String defaultTouchHandlingOption = "com.jetbrains.default.touchscreen.mode";
@Native
public final static boolean defaultTouchHandling = "true".equalsIgnoreCase(
Util.getProperty(defaultTouchHandlingOption, "false"));
}

View File

@@ -1333,6 +1333,19 @@ static BOOL IsMouseEventFromTouch()
{
return (::GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH_MASK) == MOUSEEVENTF_FROMTOUCH;
}
// consider making general function
// T getClassStaticField(cls, field, default_val)
static BOOL IsDefaultTouch()
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
jclass cls = env->FindClass("sun/awt/event/TouchEvent");
CHECK_NULL_RETURN(cls, FALSE);
jfieldID fieldID = env->GetStaticFieldID(cls, "defaultTouchHandling", "Z");
CHECK_NULL_RETURN(fieldID, FALSE);
return static_cast<BOOL>(env->GetStaticBooleanField(cls, fieldID));
}
/*
* Dispatch messages for this window class--general component
*/
@@ -1358,6 +1371,8 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
return (LRESULT)TRUE;
}
static const BOOL PROCESS_TOUCH_EVENTS = !IsDefaultTouch();
DWORD curPos = 0;
UINT switchMessage = message;
@@ -1641,7 +1656,7 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSEHWHEEL:
case WM_AWT_MOUSEENTER:
case WM_AWT_MOUSEEXIT:
if (IsMouseEventFromTouch()) {
if (IsMouseEventFromTouch() && PROCESS_TOUCH_EVENTS) {
break;
}
curPos = ::GetMessagePos();
@@ -1721,8 +1736,10 @@ LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
}
break;
case WM_TOUCH:
WmTouch(wParam, lParam);
break;
if (PROCESS_TOUCH_EVENTS) {
WmTouch(wParam, lParam);
break;
}
case WM_SETCURSOR:
mr = mrDoDefault;
if (LOWORD(lParam) == HTCLIENT) {