mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Add Windows touch support
This is disabled by default break out WindowsTouchHandler into a seperate Class , that file is way too big anyway
This commit is contained in:
parent
260b0334e7
commit
b991d49049
6 changed files with 180 additions and 28 deletions
|
@ -294,6 +294,7 @@
|
|||
<ClCompile Include="InputDevice.cpp" />
|
||||
<ClCompile Include="KeyboardDevice.cpp" />
|
||||
<ClCompile Include="RawInput.cpp" />
|
||||
<ClCompile Include="TouchInputHandler.cpp" />
|
||||
<ClCompile Include="W32Util\DialogManager.cpp" />
|
||||
<ClCompile Include="W32Util\Misc.cpp">
|
||||
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)%(Filename)2.obj</ObjectFileName>
|
||||
|
@ -344,6 +345,7 @@
|
|||
<ClInclude Include="InputDevice.h" />
|
||||
<ClInclude Include="KeyboardDevice.h" />
|
||||
<ClInclude Include="RawInput.h" />
|
||||
<ClInclude Include="TouchInputHandler.h" />
|
||||
<ClInclude Include="W32Util\DialogManager.h" />
|
||||
<ClInclude Include="W32Util\Misc.h" />
|
||||
<ClInclude Include="W32Util\PropertySheet.h" />
|
||||
|
|
|
@ -140,6 +140,9 @@
|
|||
<ClCompile Include="RawInput.cpp">
|
||||
<Filter>Windows\Input</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TouchInputHandler.cpp">
|
||||
<Filter>Windows\Input</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Debugger\CtrlDisAsmView.h">
|
||||
|
@ -254,6 +257,9 @@
|
|||
<ClInclude Include="RawInput.h">
|
||||
<Filter>Windows\Input</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TouchInputHandler.h">
|
||||
<Filter>Windows\Input</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="icon1.ico">
|
||||
|
|
125
Windows/TouchInputHandler.cpp
Normal file
125
Windows/TouchInputHandler.cpp
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include "Windows/TouchInputHandler.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "Common/CommonWindows.h"
|
||||
#include "input/input_state.h"
|
||||
#include "base/NativeApp.h"
|
||||
#include "Windows/WndMainWindow.h"
|
||||
|
||||
extern InputState input_state;
|
||||
|
||||
TouchInputHandler::TouchInputHandler()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
TouchInputHandler::~TouchInputHandler()
|
||||
{
|
||||
}
|
||||
|
||||
void TouchInputHandler::handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
#if ENABLE_TOUCH
|
||||
UINT inputCount = LOWORD(wParam);
|
||||
TOUCHINPUT *inputs = new TOUCHINPUT[inputCount];
|
||||
if (GetTouchInputInfo((HTOUCHINPUT) lParam,
|
||||
inputCount,
|
||||
inputs,
|
||||
sizeof(TOUCHINPUT)))
|
||||
{
|
||||
for (int i = 0; i < inputCount; i++) {
|
||||
int id = 0;
|
||||
|
||||
//here we map the windows touch id to the ppsspp internal touch id
|
||||
//currently we ignore the fact that the mouse uses touch id 0, so that
|
||||
//the mouse could possibly interfere with the mapping so for safety
|
||||
//the maximum amount of touch points is MAX_POINTERS-1
|
||||
std::map<int, int>::const_iterator it = touchTranslate.find(inputs[i].dwID);
|
||||
if (it != touchTranslate.end()) //check if we already mapped this touch id
|
||||
{
|
||||
id = it->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (touchTranslate.size() + 1 >= MAX_POINTERS) //check if we're tracking too many points
|
||||
{
|
||||
touchUp(touchTranslate.begin()->second, 0, 0);
|
||||
touchTranslate.erase(touchTranslate.begin());
|
||||
}
|
||||
//finding first free internal touch id and map this windows id to an internal id
|
||||
bool *first_free = std::find(input_state.pointer_down, input_state.pointer_down + MAX_POINTERS, false);
|
||||
id = (first_free - input_state.pointer_down) / sizeof(bool);
|
||||
touchTranslate[inputs[i].dwID] = id;
|
||||
}
|
||||
|
||||
POINT point;
|
||||
point.x = TOUCH_COORD_TO_PIXEL(inputs[i].x);
|
||||
point.y = TOUCH_COORD_TO_PIXEL(inputs[i].y);
|
||||
|
||||
if (ScreenToClient(hWnd, &point)){
|
||||
if (inputs[i].dwFlags & TOUCHEVENTF_DOWN)
|
||||
{
|
||||
touchDown(id, point.x, point.y);
|
||||
}
|
||||
if (inputs[i].dwFlags & TOUCHEVENTF_MOVE)
|
||||
{
|
||||
touchMove(id, point.x, point.y);
|
||||
}
|
||||
if (inputs[i].dwFlags & TOUCHEVENTF_UP)
|
||||
{
|
||||
touchUp(id, point.x, point.y);
|
||||
touchTranslate.erase(touchTranslate.find(inputs[i].dwID));
|
||||
}
|
||||
}
|
||||
}
|
||||
CloseTouchInputHandle((HTOUCHINPUT) lParam);
|
||||
}
|
||||
else
|
||||
{
|
||||
// GetLastError() and error handling.
|
||||
}
|
||||
delete[] inputs;
|
||||
#endif
|
||||
}
|
||||
|
||||
void TouchInputHandler::touchUp(int id, float x, float y){
|
||||
TouchInput touchevent;
|
||||
touchevent.id = id;
|
||||
touchevent.x = x;
|
||||
touchevent.y = y;
|
||||
touchevent.flags = TOUCH_UP;
|
||||
input_state.lock.lock();
|
||||
input_state.pointer_down[id] = false;
|
||||
input_state.pointer_x[id] = x;
|
||||
input_state.pointer_y[id] = y;
|
||||
input_state.lock.unlock();
|
||||
NativeTouch(touchevent);
|
||||
}
|
||||
|
||||
void TouchInputHandler::touchDown(int id, float x, float y){
|
||||
TouchInput touchevent;
|
||||
touchevent.id = id;
|
||||
touchevent.x = x;
|
||||
touchevent.y = y;
|
||||
touchevent.flags = TOUCH_DOWN;
|
||||
input_state.lock.lock();
|
||||
input_state.pointer_down[id] = true;
|
||||
input_state.pointer_x[id] = x;
|
||||
input_state.pointer_y[id] = y;
|
||||
input_state.lock.unlock();
|
||||
NativeTouch(touchevent);
|
||||
}
|
||||
|
||||
void TouchInputHandler::touchMove(int id, float x, float y){
|
||||
TouchInput touchevent;
|
||||
touchevent.id = id;
|
||||
touchevent.x = x;
|
||||
touchevent.y = y;
|
||||
touchevent.flags = TOUCH_MOVE;
|
||||
input_state.lock.lock();
|
||||
input_state.pointer_x[id] = x;
|
||||
input_state.pointer_y[id] = y;
|
||||
input_state.lock.unlock();
|
||||
NativeTouch(touchevent);
|
||||
}
|
19
Windows/TouchInputHandler.h
Normal file
19
Windows/TouchInputHandler.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
#pragma once
|
||||
|
||||
#include <map>
|
||||
|
||||
class TouchInputHandler
|
||||
{
|
||||
public:
|
||||
TouchInputHandler();
|
||||
|
||||
void handleTouchEvent(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
~TouchInputHandler();
|
||||
private:
|
||||
std::map<int, int> touchTranslate;
|
||||
void touchUp(int id, float x, float y);
|
||||
void touchDown(int id, float x, float y);
|
||||
void touchMove(int id, float x, float y);
|
||||
|
||||
};
|
||||
|
|
@ -62,6 +62,7 @@
|
|||
#include "Windows/W32Util/ShellUtil.h"
|
||||
#include "Windows/W32Util/Misc.h"
|
||||
#include "Windows/RawInput.h"
|
||||
#include "Windows/TouchInputHandler.h"
|
||||
#include "GPU/GPUInterface.h"
|
||||
#include "GPU/GPUState.h"
|
||||
#include "gfx_es2/gpu_features.h"
|
||||
|
@ -78,8 +79,6 @@
|
|||
#include "XPTheme.h"
|
||||
#endif
|
||||
|
||||
#define ENABLE_TOUCH 0
|
||||
|
||||
static const int numCPUs = 1;
|
||||
|
||||
int verysleepy__useSendMessage = 1;
|
||||
|
@ -116,6 +115,10 @@ namespace MainWindow
|
|||
HWND hwndMain;
|
||||
HWND hwndDisplay;
|
||||
HWND hwndGameList;
|
||||
|
||||
#if ENABLE_TOUCH
|
||||
TouchInputHandler touchHandler;
|
||||
#endif
|
||||
static HMENU menu;
|
||||
|
||||
static HINSTANCE hInst;
|
||||
|
@ -905,7 +908,14 @@ namespace MainWindow
|
|||
// and as asynchronous touch events for minimal latency.
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
{
|
||||
#if ENABLE_TOUCH
|
||||
#define MOUSEEVENTF_FROMTOUCH 0xFF515700
|
||||
if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) {
|
||||
// Click was generated by Windows Touch, ignore and handle WM_TOUCH instead
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// Hack: Take the opportunity to show the cursor.
|
||||
mouseButtonDown = true;
|
||||
{
|
||||
|
@ -929,6 +939,12 @@ namespace MainWindow
|
|||
break;
|
||||
|
||||
case WM_MOUSEMOVE:
|
||||
#if ENABLE_TOUCH
|
||||
if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) {
|
||||
// Click was generated by Windows Touch, ignore and handle WM_TOUCH instead
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// Hack: Take the opportunity to show the cursor.
|
||||
mouseButtonDown = (wParam & MK_LBUTTON) != 0;
|
||||
|
@ -959,6 +975,12 @@ namespace MainWindow
|
|||
break;
|
||||
|
||||
case WM_LBUTTONUP:
|
||||
#if ENABLE_TOUCH
|
||||
if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) {
|
||||
// Click was generated by Windows Touch, ignore and handle WM_TOUCH instead
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// Hack: Take the opportunity to hide the cursor.
|
||||
mouseButtonDown = false;
|
||||
|
@ -978,35 +1000,11 @@ namespace MainWindow
|
|||
}
|
||||
break;
|
||||
|
||||
// Actual touch! Unfinished...
|
||||
|
||||
case WM_TOUCH:
|
||||
{
|
||||
// TODO: Enabling this section will probably break things on Windows XP.
|
||||
// We probably need to manually fetch pointers to GetTouchInputInfo and CloseTouchInputHandle.
|
||||
#if ENABLE_TOUCH
|
||||
UINT inputCount = LOWORD(wParam);
|
||||
TOUCHINPUT *inputs = new TOUCHINPUT[inputCount];
|
||||
if (GetTouchInputInfo((HTOUCHINPUT)lParam,
|
||||
inputCount,
|
||||
inputs,
|
||||
sizeof(TOUCHINPUT)))
|
||||
{
|
||||
for (int i = 0; i < inputCount; i++) {
|
||||
// TODO: process inputs here!
|
||||
|
||||
}
|
||||
|
||||
if (!CloseTouchInputHandle((HTOUCHINPUT)lParam))
|
||||
{
|
||||
// Error handling.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// GetLastError() and error handling.
|
||||
}
|
||||
delete [] inputs;
|
||||
touchHandler.handleTouchEvent(hWnd, message, wParam, lParam);
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
|
||||
#include "Core/System.h"
|
||||
|
||||
#define ENABLE_TOUCH 0
|
||||
|
||||
namespace MainWindow
|
||||
{
|
||||
enum {
|
||||
|
|
Loading…
Add table
Reference in a new issue