Improve/fix multitouch on Windows
- Fix logic error. - Track touches to enable defensive handling and releasing on focus out. - Change comment-out by preprocessor `#if`. - Track/report coordinates as float.
This commit is contained in:
parent
6decbec461
commit
d089e688b0
2 changed files with 48 additions and 15 deletions
|
@ -73,22 +73,17 @@ static String format_error_message(DWORD id) {
|
|||
|
||||
LPWSTR messageBuffer = NULL;
|
||||
size_t size = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||
NULL, id, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&messageBuffer, 0, NULL);
|
||||
NULL, id, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&messageBuffer, 0, NULL);
|
||||
|
||||
String msg = "Error "+itos(id)+": "+String(messageBuffer,size);
|
||||
String msg = "Error " + itos(id) + ": " + String(messageBuffer, size);
|
||||
|
||||
LocalFree(messageBuffer);
|
||||
|
||||
return msg;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern HINSTANCE godot_hinstance;
|
||||
|
||||
|
||||
|
||||
void RedirectIOToConsole() {
|
||||
|
||||
int hConHandle;
|
||||
|
@ -228,7 +223,19 @@ bool OS_Windows::can_draw() const {
|
|||
#define SIGNATURE_MASK 0xFFFFFF00
|
||||
#define IsPenEvent(dw) (((dw)&SIGNATURE_MASK) == MI_WP_SIGNATURE)
|
||||
|
||||
void OS_Windows::_touch_event(bool p_pressed, int p_x, int p_y, int idx) {
|
||||
void OS_Windows::_touch_event(bool p_pressed, float p_x, float p_y, int idx) {
|
||||
|
||||
#if WINVER >= 0x0601 // for windows 7
|
||||
// Defensive
|
||||
if (touch_state.has(idx) == p_pressed)
|
||||
return;
|
||||
|
||||
if (p_pressed) {
|
||||
touch_state.insert(idx, Vector2(p_x, p_y));
|
||||
} else {
|
||||
touch_state.erase(idx);
|
||||
}
|
||||
#endif
|
||||
|
||||
Ref<InputEventScreenTouch> event;
|
||||
event.instance();
|
||||
|
@ -241,7 +248,19 @@ void OS_Windows::_touch_event(bool p_pressed, int p_x, int p_y, int idx) {
|
|||
}
|
||||
};
|
||||
|
||||
void OS_Windows::_drag_event(int p_x, int p_y, int idx) {
|
||||
void OS_Windows::_drag_event(float p_x, float p_y, int idx) {
|
||||
|
||||
#if WINVER >= 0x0601 // for windows 7
|
||||
Map<int, Vector2>::Element *curr = touch_state.find(idx);
|
||||
// Defensive
|
||||
if (!curr)
|
||||
return;
|
||||
|
||||
if (curr->get() == Vector2(p_x, p_y))
|
||||
return;
|
||||
|
||||
curr->get() = Vector2(p_x, p_y);
|
||||
#endif
|
||||
|
||||
Ref<InputEventScreenDrag> event;
|
||||
event.instance();
|
||||
|
@ -271,6 +290,13 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
if (mouse_mode == MOUSE_MODE_CAPTURED || mouse_mode == MOUSE_MODE_CONFINED) {
|
||||
ReleaseCapture();
|
||||
}
|
||||
#if WINVER >= 0x0601 // for windows 7
|
||||
// Release every touch to avoid sticky points
|
||||
for (Map<int, Vector2>::Element *E = touch_state.front(); E; E = E->next()) {
|
||||
_touch_event(false, E->get().x, E->get().y, E->key());
|
||||
}
|
||||
touch_state.clear();
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
case WM_ACTIVATE: // Watch For Window Activate Message
|
||||
|
@ -687,10 +713,10 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||
//do something with each touch input entry
|
||||
if (ti.dwFlags & TOUCHEVENTF_MOVE) {
|
||||
|
||||
_drag_event(ti.x / 100, ti.y / 100, ti.dwID);
|
||||
_drag_event(ti.x / 100.0f, ti.y / 100.0f, ti.dwID);
|
||||
} else if (ti.dwFlags & (TOUCHEVENTF_UP | TOUCHEVENTF_DOWN)) {
|
||||
|
||||
_touch_event(ti.dwFlags & TOUCHEVENTF_DOWN != 0, ti.x / 100, ti.y / 100, ti.dwID);
|
||||
_touch_event(ti.dwFlags & TOUCHEVENTF_DOWN, ti.x / 100.0f, ti.y / 100.0f, ti.dwID);
|
||||
};
|
||||
}
|
||||
bHandled = TRUE;
|
||||
|
@ -1092,7 +1118,9 @@ void OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int
|
|||
tme.dwHoverTime = HOVER_DEFAULT;
|
||||
TrackMouseEvent(&tme);
|
||||
|
||||
//RegisterTouchWindow(hWnd, 0); // Windows 7
|
||||
#if WINVER >= 0x0601 // for windows 7
|
||||
RegisterTouchWindow(hWnd, 0); // Windows 7
|
||||
#endif
|
||||
|
||||
_ensure_user_data_dir();
|
||||
|
||||
|
@ -1206,6 +1234,9 @@ void OS_Windows::finalize() {
|
|||
|
||||
memdelete(joypad);
|
||||
memdelete(input);
|
||||
#if WINVER >= 0x0601 // for windows 7
|
||||
touch_state.clear();
|
||||
#endif
|
||||
|
||||
visual_server->finish();
|
||||
memdelete(visual_server);
|
||||
|
@ -1608,7 +1639,6 @@ void OS_Windows::_update_window_style(bool repaint) {
|
|||
|
||||
Error OS_Windows::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path) {
|
||||
|
||||
|
||||
DLL_DIRECTORY_COOKIE cookie;
|
||||
|
||||
if (p_also_set_library_path) {
|
||||
|
|
|
@ -117,6 +117,9 @@ class OS_Windows : public OS {
|
|||
|
||||
InputDefault *input;
|
||||
JoypadWindows *joypad;
|
||||
#if WINVER >= 0x0601 // for windows 7
|
||||
Map<int, Vector2> touch_state;
|
||||
#endif
|
||||
|
||||
PowerWindows *power_manager;
|
||||
|
||||
|
@ -132,8 +135,8 @@ class OS_Windows : public OS {
|
|||
|
||||
CrashHandler crash_handler;
|
||||
|
||||
void _drag_event(int p_x, int p_y, int idx);
|
||||
void _touch_event(bool p_pressed, int p_x, int p_y, int idx);
|
||||
void _drag_event(float p_x, float p_y, int idx);
|
||||
void _touch_event(bool p_pressed, float p_x, float p_y, int idx);
|
||||
|
||||
void _update_window_style(bool repaint = true);
|
||||
|
||||
|
|
Loading…
Reference in a new issue