Block WM_MOUSEMOVE during Windows Ink pen handling.

This commit is contained in:
bruvzg 2020-05-22 10:44:47 +03:00
parent 0b8cb945cf
commit b08b027a9a
No known key found for this signature in database
GPG Key ID: EBDC1EE1E7261782
3 changed files with 43 additions and 3 deletions

View File

@ -2007,11 +2007,37 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
old_x = mm->get_position().x; old_x = mm->get_position().x;
old_y = mm->get_position().y; old_y = mm->get_position().y;
if (windows[window_id].window_has_focus) if (windows[window_id].window_has_focus)
Input::get_singleton()->parse_input_event(mm); Input::get_singleton()->accumulate_input_event(mm);
} }
return 0; return 0;
} }
} break; } break;
case WM_POINTERENTER: {
if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) {
break;
}
if ((OS::get_singleton()->get_current_tablet_driver() != "winink") || !winink_available) {
break;
}
uint32_t pointer_id = LOWORD(wParam);
POINTER_INPUT_TYPE pointer_type = PT_POINTER;
if (!win8p_GetPointerType(pointer_id, &pointer_type)) {
break;
}
if (pointer_type != PT_PEN) {
break;
}
windows[window_id].block_mm = true;
return 0;
} break;
case WM_POINTERLEAVE: {
windows[window_id].block_mm = false;
return 0;
} break;
case WM_POINTERUPDATE: { case WM_POINTERUPDATE: {
if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) { if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) {
break; break;
@ -2127,12 +2153,16 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
old_x = mm->get_position().x; old_x = mm->get_position().x;
old_y = mm->get_position().y; old_y = mm->get_position().y;
if (windows[window_id].window_has_focus) { if (windows[window_id].window_has_focus) {
Input::get_singleton()->parse_input_event(mm); Input::get_singleton()->accumulate_input_event(mm);
} }
return 0; //Pointer event handled return 0 to avoid duplicate WM_MOUSEMOVE event return 0; //Pointer event handled return 0 to avoid duplicate WM_MOUSEMOVE event
} break; } break;
case WM_MOUSEMOVE: { case WM_MOUSEMOVE: {
if (windows[window_id].block_mm) {
break;
}
if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) { if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) {
break; break;
} }
@ -2732,6 +2762,7 @@ void DisplayServerWindows::_process_key_events() {
void DisplayServerWindows::_update_tablet_ctx(const String &p_old_driver, const String &p_new_driver) { void DisplayServerWindows::_update_tablet_ctx(const String &p_old_driver, const String &p_new_driver) {
for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) { for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
WindowData &wd = E->get(); WindowData &wd = E->get();
wd.block_mm = false;
if ((p_old_driver == "wintab") && wintab_available && wd.wtctx) { if ((p_old_driver == "wintab") && wintab_available && wd.wtctx) {
wintab_WTEnable(wd.wtctx, false); wintab_WTEnable(wd.wtctx, false);
wintab_WTClose(wd.wtctx); wintab_WTClose(wd.wtctx);

View File

@ -229,6 +229,14 @@ typedef struct tagPOINTER_PEN_INFO {
#define WM_POINTERUPDATE 0x0245 #define WM_POINTERUPDATE 0x0245
#endif #endif
#ifndef WM_POINTERENTER
#define WM_POINTERENTER 0x0249
#endif
#ifndef WM_POINTERLEAVE
#define WM_POINTERLEAVE 0x024A
#endif
typedef BOOL(WINAPI *GetPointerTypePtr)(uint32_t p_id, POINTER_INPUT_TYPE *p_type); typedef BOOL(WINAPI *GetPointerTypePtr)(uint32_t p_id, POINTER_INPUT_TYPE *p_type);
typedef BOOL(WINAPI *GetPointerPenInfoPtr)(uint32_t p_id, POINTER_PEN_INFO *p_pen_info); typedef BOOL(WINAPI *GetPointerPenInfoPtr)(uint32_t p_id, POINTER_PEN_INFO *p_pen_info);
@ -333,6 +341,7 @@ private:
int min_pressure; int min_pressure;
int max_pressure; int max_pressure;
bool tilt_supported; bool tilt_supported;
bool block_mm = false;
int last_pressure_update; int last_pressure_update;
float last_pressure; float last_pressure;

View File

@ -786,7 +786,7 @@ String OS_Windows::get_tablet_driver_name(int p_driver) const {
if (p_driver < 0 || p_driver >= tablet_drivers.size()) { if (p_driver < 0 || p_driver >= tablet_drivers.size()) {
return ""; return "";
} else { } else {
return tablet_drivers[p_driver].utf8().get_data(); return tablet_drivers[p_driver];
} }
} }