diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 118deb90584..e24586cd8d5 100755 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -446,6 +446,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) mm->set_control(control_mem); mm->set_shift(shift_mem); mm->set_alt(alt_mem); + mm->set_pressure((raw->data.mouse.ulButtons & RI_MOUSE_LEFT_BUTTON_DOWN) ? 1.0f : 0.0f); mm->set_button_mask(last_button_state); @@ -554,13 +555,21 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) Ref mm; mm.instance(); - mm->set_pressure(pen_info.pressure ? (float)pen_info.pressure / 1024 : 0); - mm->set_tilt(Vector2(pen_info.tiltX ? (float)pen_info.tiltX / 90 : 0, pen_info.tiltY ? (float)pen_info.tiltY / 90 : 0)); + if (pen_info.penMask & PEN_MASK_PRESSURE) { + mm->set_pressure((float)pen_info.pressure / 1024); + } else { + mm->set_pressure((HIWORD(wParam) & POINTER_MESSAGE_FLAG_FIRSTBUTTON) ? 1.0f : 0.0f); + } + if ((pen_info.penMask & PEN_MASK_TILT_X) && (pen_info.penMask & PEN_MASK_TILT_Y)) { + mm->set_tilt(Vector2((float)pen_info.tiltX / 90, (float)pen_info.tiltY / 90)); + } mm->set_control((wParam & MK_CONTROL) != 0); mm->set_shift((wParam & MK_SHIFT) != 0); mm->set_alt(alt_mem); + mm->set_pressure((wParam & MK_LBUTTON) ? 1.0f : 0.0f); + mm->set_button_mask(last_button_state); POINT coords; //client coords diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index cf16295a70f..981005913cc 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -64,6 +64,22 @@ typedef UINT32 POINTER_FLAGS; typedef UINT32 PEN_FLAGS; typedef UINT32 PEN_MASK; +#ifndef PEN_MASK_PRESSURE +#define PEN_MASK_PRESSURE 0x00000001 +#endif + +#ifndef PEN_MASK_TILT_X +#define PEN_MASK_TILT_X 0x00000004 +#endif + +#ifndef PEN_MASK_TILT_Y +#define PEN_MASK_TILT_Y 0x00000008 +#endif + +#ifndef POINTER_MESSAGE_FLAG_FIRSTBUTTON +#define POINTER_MESSAGE_FLAG_FIRSTBUTTON 0x00000010 +#endif + enum tagPOINTER_INPUT_TYPE { PT_POINTER = 0x00000001, PT_TOUCH = 0x00000002, diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp index 1a1ce4c8505..2a1bdb6b819 100644 --- a/platform/x11/os_x11.cpp +++ b/platform/x11/os_x11.cpp @@ -2085,6 +2085,7 @@ void OS_X11::process_xevents() { xi.pressure = 0; xi.tilt = Vector2(); + xi.pressure_supported = false; while (XPending(x11_display) > 0) { XEvent event; @@ -2137,9 +2138,11 @@ void OS_X11::process_xevents() { Map::Element *pen_pressure = xi.pen_pressure_range.find(device_id); if (pen_pressure) { Vector2 pen_pressure_range = pen_pressure->value(); - if (pen_pressure_range != Vector2()) + if (pen_pressure_range != Vector2()) { + xi.pressure_supported = true; xi.pressure = (*values - pen_pressure_range[0]) / (pen_pressure_range[1] - pen_pressure_range[0]); + } } values++; @@ -2484,7 +2487,11 @@ void OS_X11::process_xevents() { Ref mm; mm.instance(); - mm->set_pressure(xi.pressure); + if (xi.pressure_supported) { + mm->set_pressure(xi.pressure); + } else { + mm->set_pressure((get_mouse_button_state() & (1 << (BUTTON_LEFT - 1))) ? 1.0f : 0.0f); + } mm->set_tilt(xi.tilt); // Make the absolute position integral so it doesn't look _too_ weird :) diff --git a/platform/x11/os_x11.h b/platform/x11/os_x11.h index 175a4c0cabe..be11d2be500 100644 --- a/platform/x11/os_x11.h +++ b/platform/x11/os_x11.h @@ -138,6 +138,7 @@ class OS_X11 : public OS_Unix { XIEventMask all_master_event_mask; Map state; double pressure; + bool pressure_supported; Vector2 tilt; Vector2 mouse_pos_to_filter; Vector2 relative_motion;