소스 검색

Block WM_MOUSEMOVE during Windows Ink pen handling.

bruvzg 5 년 전
부모
커밋
b08b027a9a
3개의 변경된 파일43개의 추가작업 그리고 3개의 파일을 삭제
  1. 33 2
      platform/windows/display_server_windows.cpp
  2. 9 0
      platform/windows/display_server_windows.h
  3. 1 1
      platform/windows/os_windows.cpp

+ 33 - 2
platform/windows/display_server_windows.cpp

@@ -2007,11 +2007,37 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
 					old_x = mm->get_position().x;
 					old_y = mm->get_position().y;
 					if (windows[window_id].window_has_focus)
-						Input::get_singleton()->parse_input_event(mm);
+						Input::get_singleton()->accumulate_input_event(mm);
 				}
 				return 0;
 			}
 		} 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: {
 			if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) {
 				break;
@@ -2127,12 +2153,16 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
 			old_x = mm->get_position().x;
 			old_y = mm->get_position().y;
 			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
 		} break;
 		case WM_MOUSEMOVE: {
+			if (windows[window_id].block_mm) {
+				break;
+			}
+
 			if (mouse_mode == MOUSE_MODE_CAPTURED && use_raw_input) {
 				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) {
 	for (Map<WindowID, WindowData>::Element *E = windows.front(); E; E = E->next()) {
 		WindowData &wd = E->get();
+		wd.block_mm = false;
 		if ((p_old_driver == "wintab") && wintab_available && wd.wtctx) {
 			wintab_WTEnable(wd.wtctx, false);
 			wintab_WTClose(wd.wtctx);

+ 9 - 0
platform/windows/display_server_windows.h

@@ -229,6 +229,14 @@ typedef struct tagPOINTER_PEN_INFO {
 #define WM_POINTERUPDATE 0x0245
 #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 *GetPointerPenInfoPtr)(uint32_t p_id, POINTER_PEN_INFO *p_pen_info);
 
@@ -333,6 +341,7 @@ private:
 		int min_pressure;
 		int max_pressure;
 		bool tilt_supported;
+		bool block_mm = false;
 
 		int last_pressure_update;
 		float last_pressure;

+ 1 - 1
platform/windows/os_windows.cpp

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