Skip to content

Commit

Permalink
supportMultipleNativeTouchScreens
Browse files Browse the repository at this point in the history
  • Loading branch information
shi-weili committed Sep 17, 2018
1 parent f456c0a commit 5ffab3e
Show file tree
Hide file tree
Showing 6 changed files with 145 additions and 153 deletions.
2 changes: 1 addition & 1 deletion assets/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
"mouse": true,
"tuio": true,
"native": false,
"multiNativeTouchScreen": true
"supportMultipleNativeTouchScreens": true
},
"debug": {
"debugEnabled": true,
Expand Down
2 changes: 1 addition & 1 deletion src/bluecadet/core/BaseApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ void BaseApp::setup() {
mTuioDriver.connect();
}
if (settings->mNativeTouchEnabled) {
if (settings->mMultiNativeTouchScreenEnabled) {
if (settings->mSupportMultipleNativeTouchScreens) {
mMultiNativeTouchDriver.connect();
} else {
mNativeTouchDriver.connect();
Expand Down
4 changes: 2 additions & 2 deletions src/bluecadet/core/SettingsManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ void SettingsManager::setup(ci::app::App::Settings * appSettings, ci::fs::path j
addCommandLineParser("mouse", [&](const string &value) { mMouseEnabled = value == "true"; });
addCommandLineParser("tuio", [&](const string &value) { mTuioTouchEnabled = value == "true"; });
addCommandLineParser("native", [&](const string &value) { mNativeTouchEnabled = value == "true"; });
addCommandLineParser("multiNativeTouchScreen", [&](const string &value) { mMultiNativeTouchScreenEnabled = value == "true"; });
addCommandLineParser("supportMultipleNativeTouchScreens", [&](const string &value) { mSupportMultipleNativeTouchScreens = value == "true"; });
addCommandLineParser("drawTouches", [&](const string &value) { mShowTouches = value == "true"; });
addCommandLineParser("draw_touches", [&](const string &value) { mShowTouches = value == "true"; });
addCommandLineParser("drawStats", [&](const string &value) { mShowStats = value == "true"; });
Expand Down Expand Up @@ -127,7 +127,7 @@ void SettingsManager::parseJson(ci::JsonTree & json) {
setFieldFromJsonIfExists(&mMouseEnabled, "settings.touch.mouse");
setFieldFromJsonIfExists(&mTuioTouchEnabled, "settings.touch.tuio");
setFieldFromJsonIfExists(&mNativeTouchEnabled, "settings.touch.native");
setFieldFromJsonIfExists(&mMultiNativeTouchScreenEnabled, "settings.touch.multiNativeTouchScreen");
setFieldFromJsonIfExists(&mSupportMultipleNativeTouchScreens, "settings.touch.supportMultipleNativeTouchScreens");

// Debug
//setFieldFromJsonIfExists(&mDebugEnabled, "settings.debug.debugMode");
Expand Down
2 changes: 1 addition & 1 deletion src/bluecadet/core/SettingsManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class SettingsManager {

// Touches
bool mNativeTouchEnabled = false; //! Native touch coming from the OS
bool mMultiNativeTouchScreenEnabled = true; //! Native touch with multi-touchscreen support
bool mSupportMultipleNativeTouchScreens = true; //! Native touch with multi-touchscreen support
bool mTuioTouchEnabled = true; //! TUIO touch events; It's recommended to disable native touch when TUIO is enabled to prevent duplicate events.
bool mMouseEnabled = true; //! Treat mouse events as touch events.

Expand Down
146 changes: 140 additions & 6 deletions src/bluecadet/touch/drivers/MultiNativeTouchDriver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,146 @@ namespace bluecadet {
namespace touch {
namespace drivers {

// <Windows 8 touch API>

#define WM_POINTERENTER 0x0249
#define WM_POINTERLEAVE 0x024A
#define WM_POINTERUPDATE 0x0245
#define WM_POINTERDOWN 0x0246
#define WM_POINTERUP 0x0247
#define WM_POINTERCAPTURECHANGED 0x024C
#define POINTER_CANCELLED 0x1000

#define GET_POINTERID_WPARAM(wParam) (LOWORD(wParam))

typedef enum {
PT_POINTER = 0x00000001,
PT_TOUCH = 0x00000002,
PT_PEN = 0x00000003,
PT_MOUSE = 0x00000004,
PT_TOUCHPAD = 0x00000005
} POINTER_INPUT_TYPE;

typedef enum {
POINTER_FLAG_NONE = 0x00000000,
POINTER_FLAG_NEW = 0x00000001,
POINTER_FLAG_INRANGE = 0x00000002,
POINTER_FLAG_INCONTACT = 0x00000004,
POINTER_FLAG_FIRSTBUTTON = 0x00000010,
POINTER_FLAG_SECONDBUTTON = 0x00000020,
POINTER_FLAG_THIRDBUTTON = 0x00000040,
POINTER_FLAG_FOURTHBUTTON = 0x00000080,
POINTER_FLAG_FIFTHBUTTON = 0x00000100,
POINTER_FLAG_PRIMARY = 0x00002000,
POINTER_FLAG_CONFIDENCE = 0x00004000,
POINTER_FLAG_CANCELED = 0x00008000,
POINTER_FLAG_DOWN = 0x00010000,
POINTER_FLAG_UPDATE = 0x00020000,
POINTER_FLAG_UP = 0x00040000,
POINTER_FLAG_WHEEL = 0x00080000,
POINTER_FLAG_HWHEEL = 0x00100000,
POINTER_FLAG_CAPTURECHANGED = 0x00200000,
POINTER_FLAG_HASTRANSFORM = 0x00400000
} POINTER_FLAGS;

typedef enum {
POINTER_CHANGE_NONE,
POINTER_CHANGE_FIRSTBUTTON_DOWN,
POINTER_CHANGE_FIRSTBUTTON_UP,
POINTER_CHANGE_SECONDBUTTON_DOWN,
POINTER_CHANGE_SECONDBUTTON_UP,
POINTER_CHANGE_THIRDBUTTON_DOWN,
POINTER_CHANGE_THIRDBUTTON_UP,
POINTER_CHANGE_FOURTHBUTTON_DOWN,
POINTER_CHANGE_FOURTHBUTTON_UP,
POINTER_CHANGE_FIFTHBUTTON_DOWN,
POINTER_CHANGE_FIFTHBUTTON_UP,
} POINTER_BUTTON_CHANGE_TYPE;

typedef enum {
TOUCH_FLAG_NONE = 0x00000000
} TOUCH_FLAGS;

typedef enum {
TOUCH_MASK_NONE = 0x00000000,
TOUCH_MASK_CONTACTAREA = 0x00000001,
TOUCH_MASK_ORIENTATION = 0x00000002,
TOUCH_MASK_PRESSURE = 0x00000004
} TOUCH_MASK;

typedef enum {
PEN_FLAG_NONE = 0x00000000,
PEN_FLAG_BARREL = 0x00000001,
PEN_FLAG_INVERTED = 0x00000002,
PEN_FLAG_ERASER = 0x00000004
} PEN_FLAGS;

typedef enum {
PEN_MASK_NONE = 0x00000000,
PEN_MASK_PRESSURE = 0x00000001,
PEN_MASK_ROTATION = 0x00000002,
PEN_MASK_TILT_X = 0x00000004,
PEN_MASK_TILT_Y = 0x00000008
} PEN_MASK;

typedef struct {
POINTER_INPUT_TYPE pointerType;
UINT32 pointerId;
UINT32 frameId;
POINTER_FLAGS pointerFlags;
HANDLE sourceDevice;
HWND hwndTarget;
POINT ptPixelLocation;
POINT ptHimetricLocation;
POINT ptPixelLocationRaw;
POINT ptHimetricLocationRaw;
DWORD dwTime;
UINT32 historyCount;
INT32 InputData;
DWORD dwKeyStates;
UINT64 PerformanceCount;
POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
} POINTER_INFO;

typedef struct {
POINTER_INFO pointerInfo;
TOUCH_FLAGS touchFlags;
TOUCH_MASK touchMask;
RECT rcContact;
RECT rcContactRaw;
UINT32 orientation;
UINT32 pressure;
} POINTER_TOUCH_INFO;

typedef struct {
POINTER_INFO pointerInfo;
PEN_FLAGS penFlags;
PEN_MASK penMask;
UINT32 pressure;
UINT32 rotation;
INT32 tiltX;
INT32 tiltY;
} POINTER_PEN_INFO;

typedef BOOL(WINAPI *GET_POINTER_INFO)(UINT32 pointerId, POINTER_INFO *pointerInfo);
typedef BOOL(WINAPI *GET_POINTER_TOUCH_INFO)(UINT32 pointerId, POINTER_TOUCH_INFO *pointerInfo);
typedef BOOL(WINAPI *GET_POINTER_PEN_INFO)(UINT32 pointerId, POINTER_PEN_INFO *pointerInfo);

// </Windows 8 touch API>

#define EXPORT_API __declspec(dllexport)

extern "C"
{
EXPORT_API void __stdcall initTouch();
}

LRESULT CALLBACK wndProc8(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam);

ci::signals::Signal<void(ci::vec2, int)> signalOnTouchAdded;
ci::signals::Signal<void(ci::vec2, int)>& getSignalOnTouchAdded() { return signalOnTouchAdded; }
ci::signals::Signal<void(ci::vec2, int)> signalOnTouchUpdated;
ci::signals::Signal<void(ci::vec2, int)>& getSignalOnTouchUpdated() { return signalOnTouchUpdated; }
ci::signals::Signal<void(ci::vec2, int)> signalOnTouchRemoved;
ci::signals::Signal<void(ci::vec2, int)>& getSignalOnTouchRemoved() { return signalOnTouchRemoved; }

GET_POINTER_INFO GetPointerInfo;
GET_POINTER_TOUCH_INFO GetPointerTouchInfo;
Expand Down Expand Up @@ -109,9 +243,9 @@ void MultiNativeTouchDriver::connect() {
initTouch();

// Connect to the application window touch event signals
mTouchBeganConnection = getSignalOnTouchAdded().connect(std::bind(&MultiNativeTouchDriver::nativeTouchBegan, this, std::placeholders::_1, std::placeholders::_2));
mTouchMovedConnection = getSignalOnTouchUpdated().connect(std::bind(&MultiNativeTouchDriver::nativeTouchMoved, this, std::placeholders::_1, std::placeholders::_2));
mTouchEndConnection = getSignalOnTouchRemoved().connect(std::bind(&MultiNativeTouchDriver::nativeTouchEnded, this, std::placeholders::_1, std::placeholders::_2));
mTouchBeganConnection = signalOnTouchAdded.connect(std::bind(&MultiNativeTouchDriver::nativeTouchBegan, this, std::placeholders::_1, std::placeholders::_2));
mTouchMovedConnection = signalOnTouchUpdated.connect(std::bind(&MultiNativeTouchDriver::nativeTouchMoved, this, std::placeholders::_1, std::placeholders::_2));
mTouchEndConnection = signalOnTouchRemoved.connect(std::bind(&MultiNativeTouchDriver::nativeTouchEnded, this, std::placeholders::_1, std::placeholders::_2));

// Shared pointer to the Touch Manager
mTouchManager = TouchManager::getInstance();
Expand Down
142 changes: 0 additions & 142 deletions src/bluecadet/touch/drivers/MultiNativeTouchDriver.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,149 +17,7 @@ namespace bluecadet {
namespace touch {
namespace drivers {

ci::signals::Signal< void(ci::vec2, int) > & getSignalOnTouchAdded();
ci::signals::Signal< void(ci::vec2, int) > & getSignalOnTouchUpdated();
ci::signals::Signal< void(ci::vec2, int) > & getSignalOnTouchRemoved();

// <Windows 8 touch API>

#define WM_POINTERENTER 0x0249
#define WM_POINTERLEAVE 0x024A
#define WM_POINTERUPDATE 0x0245
#define WM_POINTERDOWN 0x0246
#define WM_POINTERUP 0x0247
#define WM_POINTERCAPTURECHANGED 0x024C
#define POINTER_CANCELLED 0x1000

#define GET_POINTERID_WPARAM(wParam) (LOWORD(wParam))

typedef enum {
PT_POINTER = 0x00000001,
PT_TOUCH = 0x00000002,
PT_PEN = 0x00000003,
PT_MOUSE = 0x00000004,
PT_TOUCHPAD = 0x00000005
} POINTER_INPUT_TYPE;

typedef enum {
POINTER_FLAG_NONE = 0x00000000,
POINTER_FLAG_NEW = 0x00000001,
POINTER_FLAG_INRANGE = 0x00000002,
POINTER_FLAG_INCONTACT = 0x00000004,
POINTER_FLAG_FIRSTBUTTON = 0x00000010,
POINTER_FLAG_SECONDBUTTON = 0x00000020,
POINTER_FLAG_THIRDBUTTON = 0x00000040,
POINTER_FLAG_FOURTHBUTTON = 0x00000080,
POINTER_FLAG_FIFTHBUTTON = 0x00000100,
POINTER_FLAG_PRIMARY = 0x00002000,
POINTER_FLAG_CONFIDENCE = 0x00004000,
POINTER_FLAG_CANCELED = 0x00008000,
POINTER_FLAG_DOWN = 0x00010000,
POINTER_FLAG_UPDATE = 0x00020000,
POINTER_FLAG_UP = 0x00040000,
POINTER_FLAG_WHEEL = 0x00080000,
POINTER_FLAG_HWHEEL = 0x00100000,
POINTER_FLAG_CAPTURECHANGED = 0x00200000,
POINTER_FLAG_HASTRANSFORM = 0x00400000
} POINTER_FLAGS;

typedef enum {
POINTER_CHANGE_NONE,
POINTER_CHANGE_FIRSTBUTTON_DOWN,
POINTER_CHANGE_FIRSTBUTTON_UP,
POINTER_CHANGE_SECONDBUTTON_DOWN,
POINTER_CHANGE_SECONDBUTTON_UP,
POINTER_CHANGE_THIRDBUTTON_DOWN,
POINTER_CHANGE_THIRDBUTTON_UP,
POINTER_CHANGE_FOURTHBUTTON_DOWN,
POINTER_CHANGE_FOURTHBUTTON_UP,
POINTER_CHANGE_FIFTHBUTTON_DOWN,
POINTER_CHANGE_FIFTHBUTTON_UP,
} POINTER_BUTTON_CHANGE_TYPE;

typedef enum {
TOUCH_FLAG_NONE = 0x00000000
} TOUCH_FLAGS;

typedef enum {
TOUCH_MASK_NONE = 0x00000000,
TOUCH_MASK_CONTACTAREA = 0x00000001,
TOUCH_MASK_ORIENTATION = 0x00000002,
TOUCH_MASK_PRESSURE = 0x00000004
} TOUCH_MASK;

typedef enum {
PEN_FLAG_NONE = 0x00000000,
PEN_FLAG_BARREL = 0x00000001,
PEN_FLAG_INVERTED = 0x00000002,
PEN_FLAG_ERASER = 0x00000004
} PEN_FLAGS;

typedef enum {
PEN_MASK_NONE = 0x00000000,
PEN_MASK_PRESSURE = 0x00000001,
PEN_MASK_ROTATION = 0x00000002,
PEN_MASK_TILT_X = 0x00000004,
PEN_MASK_TILT_Y = 0x00000008
} PEN_MASK;

typedef struct {
POINTER_INPUT_TYPE pointerType;
UINT32 pointerId;
UINT32 frameId;
POINTER_FLAGS pointerFlags;
HANDLE sourceDevice;
HWND hwndTarget;
POINT ptPixelLocation;
POINT ptHimetricLocation;
POINT ptPixelLocationRaw;
POINT ptHimetricLocationRaw;
DWORD dwTime;
UINT32 historyCount;
INT32 InputData;
DWORD dwKeyStates;
UINT64 PerformanceCount;
POINTER_BUTTON_CHANGE_TYPE ButtonChangeType;
} POINTER_INFO;

typedef struct {
POINTER_INFO pointerInfo;
TOUCH_FLAGS touchFlags;
TOUCH_MASK touchMask;
RECT rcContact;
RECT rcContactRaw;
UINT32 orientation;
UINT32 pressure;
} POINTER_TOUCH_INFO;

typedef struct {
POINTER_INFO pointerInfo;
PEN_FLAGS penFlags;
PEN_MASK penMask;
UINT32 pressure;
UINT32 rotation;
INT32 tiltX;
INT32 tiltY;
} POINTER_PEN_INFO;

typedef BOOL(WINAPI *GET_POINTER_INFO)(UINT32 pointerId, POINTER_INFO *pointerInfo);
typedef BOOL(WINAPI *GET_POINTER_TOUCH_INFO)(UINT32 pointerId, POINTER_TOUCH_INFO *pointerInfo);
typedef BOOL(WINAPI *GET_POINTER_PEN_INFO)(UINT32 pointerId, POINTER_PEN_INFO *pointerInfo);

// </Windows 8 touch API>

#define EXPORT_API __declspec(dllexport)

extern "C"
{
EXPORT_API void __stdcall initTouch();
}

LRESULT CALLBACK wndProc8(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void decodeWin8Touches(UINT msg, WPARAM wParam, LPARAM lParam);

class MultiNativeTouchDriver {

public:
MultiNativeTouchDriver();
~MultiNativeTouchDriver();
Expand Down

0 comments on commit 5ffab3e

Please sign in to comment.