|
@@ -66,6 +66,10 @@ bool Desktop::canUseSemiTransparentWindows() noexcept |
|
|
//==============================================================================
|
|
|
//==============================================================================
|
|
|
#ifndef WM_TOUCH
|
|
|
#ifndef WM_TOUCH
|
|
|
#define WM_TOUCH 0x0240
|
|
|
#define WM_TOUCH 0x0240
|
|
|
|
|
|
#define TOUCH_COORD_TO_PIXEL(l) ((l) / 100)
|
|
|
|
|
|
#define TOUCHEVENTF_MOVE 0x0001
|
|
|
|
|
|
#define TOUCHEVENTF_DOWN 0x0002
|
|
|
|
|
|
#define TOUCHEVENTF_UP 0x0004
|
|
|
DECLARE_HANDLE (HTOUCHINPUT);
|
|
|
DECLARE_HANDLE (HTOUCHINPUT);
|
|
|
|
|
|
|
|
|
typedef struct tagTOUCHINPUT
|
|
|
typedef struct tagTOUCHINPUT
|
|
@@ -81,21 +85,16 @@ bool Desktop::canUseSemiTransparentWindows() noexcept |
|
|
DWORD cxContact;
|
|
|
DWORD cxContact;
|
|
|
DWORD cyContact;
|
|
|
DWORD cyContact;
|
|
|
} TOUCHINPUT, *PTOUCHINPUT;
|
|
|
} TOUCHINPUT, *PTOUCHINPUT;
|
|
|
|
|
|
|
|
|
#define TOUCH_COORD_TO_PIXEL(l) ((l) / 100)
|
|
|
|
|
|
|
|
|
|
|
|
#define TOUCHEVENTF_MOVE 0x0001
|
|
|
|
|
|
#define TOUCHEVENTF_DOWN 0x0002
|
|
|
|
|
|
#define TOUCHEVENTF_UP 0x0004
|
|
|
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
|
|
|
typedef BOOL (WINAPI* RegisterTouchWindowFunc) (HWND, ULONG);
|
|
|
typedef BOOL (WINAPI* RegisterTouchWindowFunc) (HWND, ULONG);
|
|
|
typedef BOOL (WINAPI* GetTouchInputInfoFunc) (HTOUCHINPUT, UINT, PTOUCHINPUT, int);
|
|
|
typedef BOOL (WINAPI* GetTouchInputInfoFunc) (HTOUCHINPUT, UINT, PTOUCHINPUT, int);
|
|
|
typedef BOOL (WINAPI* CloseTouchInputHandleFunc) (HTOUCHINPUT);
|
|
|
typedef BOOL (WINAPI* CloseTouchInputHandleFunc) (HTOUCHINPUT);
|
|
|
|
|
|
|
|
|
static RegisterTouchWindowFunc registerTouchWindow = nullptr;
|
|
|
|
|
|
static GetTouchInputInfoFunc getTouchInputInfo = nullptr;
|
|
|
|
|
|
|
|
|
static RegisterTouchWindowFunc registerTouchWindow = nullptr;
|
|
|
|
|
|
static GetTouchInputInfoFunc getTouchInputInfo = nullptr;
|
|
|
static CloseTouchInputHandleFunc closeTouchInputHandle = nullptr;
|
|
|
static CloseTouchInputHandleFunc closeTouchInputHandle = nullptr;
|
|
|
|
|
|
|
|
|
static bool hasCheckedForMultiTouch = false;
|
|
|
static bool hasCheckedForMultiTouch = false;
|
|
|
|
|
|
|
|
|
static bool canUseMultiTouch()
|
|
|
static bool canUseMultiTouch()
|
|
@@ -1542,17 +1541,20 @@ private: |
|
|
const DWORD flags = inputInfo[i].dwFlags;
|
|
|
const DWORD flags = inputInfo[i].dwFlags;
|
|
|
|
|
|
|
|
|
if ((flags & (TOUCHEVENTF_DOWN | TOUCHEVENTF_MOVE | TOUCHEVENTF_UP)) != 0)
|
|
|
if ((flags & (TOUCHEVENTF_DOWN | TOUCHEVENTF_MOVE | TOUCHEVENTF_UP)) != 0)
|
|
|
handleTouchInput (inputInfo[i], (flags & TOUCHEVENTF_DOWN) != 0,
|
|
|
|
|
|
(flags & TOUCHEVENTF_UP) != 0,
|
|
|
|
|
|
false);
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
if (! handleTouchInput (inputInfo[i], (flags & TOUCHEVENTF_DOWN) != 0,
|
|
|
|
|
|
(flags & TOUCHEVENTF_UP) != 0))
|
|
|
|
|
|
return; // abandon method if this window was deleted by the callback
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
closeTouchInputHandle (eventHandle);
|
|
|
closeTouchInputHandle (eventHandle);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void handleTouchInput (const TOUCHINPUT& touch, const bool isDown, const bool isUp, bool isCancel)
|
|
|
|
|
|
|
|
|
bool handleTouchInput (const TOUCHINPUT& touch, const bool isDown, const bool isUp)
|
|
|
{
|
|
|
{
|
|
|
|
|
|
bool isCancel = false;
|
|
|
const int touchIndex = currentTouches.getIndexOfTouch (touch.dwID);
|
|
|
const int touchIndex = currentTouches.getIndexOfTouch (touch.dwID);
|
|
|
const int64 time = getMouseEventTime();
|
|
|
const int64 time = getMouseEventTime();
|
|
|
const Point<int> pos (globalToLocal (Point<int> ((int) TOUCH_COORD_TO_PIXEL (touch.x),
|
|
|
const Point<int> pos (globalToLocal (Point<int> ((int) TOUCH_COORD_TO_PIXEL (touch.x),
|
|
@@ -1567,7 +1569,7 @@ private: |
|
|
// this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before.
|
|
|
// this forces a mouse-enter/up event, in case for some reason we didn't get a mouse-up before.
|
|
|
handleMouseEvent (touchIndex + 1, pos, modsToSend.withoutMouseButtons(), time);
|
|
|
handleMouseEvent (touchIndex + 1, pos, modsToSend.withoutMouseButtons(), time);
|
|
|
if (! isValidPeer (this)) // (in case this component was deleted by the event)
|
|
|
if (! isValidPeer (this)) // (in case this component was deleted by the event)
|
|
|
return;
|
|
|
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
else if (isUp)
|
|
|
else if (isUp)
|
|
|
{
|
|
|
{
|
|
@@ -1586,14 +1588,16 @@ private: |
|
|
|
|
|
|
|
|
handleMouseEvent (touchIndex + 1, pos, modsToSend, time);
|
|
|
handleMouseEvent (touchIndex + 1, pos, modsToSend, time);
|
|
|
if (! isValidPeer (this)) // (in case this component was deleted by the event)
|
|
|
if (! isValidPeer (this)) // (in case this component was deleted by the event)
|
|
|
return;
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
if (isUp || isCancel)
|
|
|
if (isUp || isCancel)
|
|
|
{
|
|
|
{
|
|
|
handleMouseEvent (touchIndex + 1, Point<int> (-1, -1), currentModifiers, time);
|
|
|
handleMouseEvent (touchIndex + 1, Point<int> (-1, -1), currentModifiers, time);
|
|
|
if (! isValidPeer (this))
|
|
|
if (! isValidPeer (this))
|
|
|
return;
|
|
|
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
//==============================================================================
|
|
|