[aseprite] 37/128: Add pressure and input device (mouse/stylus/eraser) info to mouse events
Tobias Hansen
thansen at moszumanska.debian.org
Mon May 9 21:24:21 UTC 2016
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository aseprite.
commit 955f86fc9eef40c59262ef2cf1cea0345f87d144
Author: David Capello <davidcapello at gmail.com>
Date: Wed Apr 20 15:44:15 2016 -0300
Add pressure and input device (mouse/stylus/eraser) info to mouse events
This is a first step to implement #610 and #710
---
src/she/event.h | 24 ++++++++++++++++-
src/she/win/pen.cpp | 25 ++++++++++++++----
src/she/win/pen.h | 11 ++++++--
src/she/win/window.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++++----
4 files changed, 122 insertions(+), 13 deletions(-)
diff --git a/src/she/event.h b/src/she/event.h
index a41ee6d..8d280cc 100644
--- a/src/she/event.h
+++ b/src/she/event.h
@@ -41,6 +41,14 @@ namespace she {
TouchMagnify,
};
+ enum InputDevice {
+ UnknownDevice,
+ MouseDevice,
+ MultitouchDevice, // Multitouch device with finger gestures
+ StylusDevice, // Pen/stylus device
+ EraserDevice, // Inverted-stylus device
+ };
+
enum MouseButton {
NoneButton,
LeftButton,
@@ -57,7 +65,10 @@ namespace she {
m_unicodeChar(0),
m_repeat(0),
m_preciseWheel(false),
- m_button(NoneButton) {
+ m_device(UnknownDevice),
+ m_button(NoneButton),
+ m_magnification(0.0),
+ m_pressure(0.0) {
}
Type type() const { return m_type; }
@@ -73,10 +84,13 @@ namespace she {
// We suppose that if we are receiving precise scrolling deltas,
// it means that the user is using a touch-like surface (trackpad,
// magic mouse scrolling, touch wacom tablet, etc.)
+ // TODO change this with the new InputDevice::MultitouchDevice
bool preciseWheel() const { return m_preciseWheel; }
+ InputDevice device() const { return m_device; }
MouseButton button() const { return m_button; }
double magnification() const { return m_magnification; }
+ double pressure() const { return m_pressure; }
void setType(Type type) { m_type = type; }
void setDisplay(Display* display) { m_display = display; }
@@ -89,8 +103,10 @@ namespace she {
void setPosition(const gfx::Point& pos) { m_position = pos; }
void setWheelDelta(const gfx::Point& delta) { m_wheelDelta = delta; }
void setPreciseWheel(bool precise) { m_preciseWheel = precise; }
+ void setDevice(InputDevice device) { m_device = device; }
void setButton(MouseButton button) { m_button = button; }
void setMagnification(double magnification) { m_magnification = magnification; }
+ void setPressure(double pressure) { m_pressure = pressure; }
private:
Type m_type;
@@ -103,8 +119,14 @@ namespace she {
gfx::Point m_position;
gfx::Point m_wheelDelta;
bool m_preciseWheel;
+ InputDevice m_device;
MouseButton m_button;
+
+ // For TouchMagnify event
double m_magnification;
+
+ // Pressure of stylus used in mouse-like events
+ double m_pressure;
};
} // namespace she
diff --git a/src/she/win/pen.cpp b/src/she/win/pen.cpp
index 343d08c..9baca48 100644
--- a/src/she/win/pen.cpp
+++ b/src/she/win/pen.cpp
@@ -19,12 +19,14 @@
typedef UINT (API* WTInfoW_Func)(UINT, UINT, LPVOID);
typedef HCTX (API* WTOpenW_Func)(HWND, LPLOGCONTEXTW, BOOL);
typedef BOOL (API* WTClose_Func)(HCTX);
+typedef BOOL (API* WTPacket_Func)(HCTX, UINT, LPVOID);
namespace she {
static WTInfoW_Func WTInfo;
static WTOpenW_Func WTOpen;
static WTClose_Func WTClose;
+static WTPacket_Func WTPacket;
PenAPI::PenAPI()
: m_wintabLib(nullptr)
@@ -40,18 +42,25 @@ PenAPI::~PenAPI()
m_wintabLib = nullptr;
}
-HCTX PenAPI::attachDisplay(HWND hwnd)
+HCTX PenAPI::open(HWND hwnd)
{
if (!m_wintabLib && !loadWintab())
return nullptr;
LOGCONTEXTW logctx;
memset(&logctx, 0, sizeof(LOGCONTEXTW));
- logctx.lcOptions |= CXO_SYSTEM;
UINT infoRes = WTInfo(WTI_DEFSYSCTX, 0, &logctx);
ASSERT(infoRes == sizeof(LOGCONTEXTW));
ASSERT(logctx.lcOptions & CXO_SYSTEM);
- logctx.lcOptions |= CXO_SYSTEM;
+
+ logctx.lcOptions =
+ CXO_SYSTEM |
+ CXO_MESSAGES |
+ CXO_CSRMESSAGES;
+ logctx.lcPktData = PACKETDATA;
+ logctx.lcPktMode = PACKETMODE;
+ logctx.lcMoveMask = PACKETDATA;
+
HCTX ctx = WTOpen(hwnd, &logctx, TRUE);
if (!ctx) {
LOG("Error attaching pen to display\n");
@@ -62,7 +71,7 @@ HCTX PenAPI::attachDisplay(HWND hwnd)
return ctx;
}
-void PenAPI::detachDisplay(HCTX ctx)
+void PenAPI::close(HCTX ctx)
{
if (ctx) {
ASSERT(m_wintabLib);
@@ -71,6 +80,11 @@ void PenAPI::detachDisplay(HCTX ctx)
}
}
+bool PenAPI::packet(HCTX ctx, UINT serial, LPVOID packet)
+{
+ return (WTPacket(ctx, serial, packet) ? true: false);
+}
+
bool PenAPI::loadWintab()
{
ASSERT(!m_wintabLib);
@@ -84,7 +98,8 @@ bool PenAPI::loadWintab()
WTInfo = base::get_dll_proc<WTInfoW_Func>(m_wintabLib, "WTInfoW");
WTOpen = base::get_dll_proc<WTOpenW_Func>(m_wintabLib, "WTOpenW");
WTClose = base::get_dll_proc<WTClose_Func>(m_wintabLib, "WTClose");
- if (!WTInfo || !WTOpen || !WTClose) {
+ WTPacket = base::get_dll_proc<WTPacket_Func>(m_wintabLib, "WTPacket");
+ if (!WTInfo || !WTOpen || !WTClose || !WTPacket) {
LOG("wintab32.dll does not contain all required functions\n");
return false;
}
diff --git a/src/she/win/pen.h b/src/she/win/pen.h
index d9ac9f6..20b97d8 100644
--- a/src/she/win/pen.h
+++ b/src/she/win/pen.h
@@ -13,15 +13,22 @@
#include <windows.h>
#include "wacom/wintab.h"
+#define PACKETDATA (PK_CURSOR | PK_BUTTONS | PK_X | PK_Y | PK_NORMAL_PRESSURE)
+#define PACKETMODE (PK_BUTTONS)
+#include "wacom/pktdef.h"
+
namespace she {
+ // Wintab API wrapper
+ // Read http://www.wacomeng.com/windows/docs/Wintab_v140.htm for more information.
class PenAPI {
public:
PenAPI();
~PenAPI();
- HCTX attachDisplay(HWND hwnd);
- void detachDisplay(HCTX ctx);
+ HCTX open(HWND hwnd);
+ void close(HCTX ctx);
+ bool packet(HCTX ctx, UINT serial, LPVOID packet);
private:
bool loadWintab();
diff --git a/src/she/win/window.h b/src/she/win/window.h
index 216ccd5..0603453 100644
--- a/src/she/win/window.h
+++ b/src/she/win/window.h
@@ -41,11 +41,13 @@ namespace she {
, m_restoredSize(0, 0)
, m_isCreated(false)
, m_hasMouse(false)
- , m_captureMouse(false) {
+ , m_captureMouse(false)
+ , m_hpenctx(nullptr)
+ , m_device(Event::UnknownDevice)
+ , m_pressure(0.0) {
registerClass();
m_hwnd = createHwnd(this, width, height);
m_hcursor = nullptr;
- m_hpenctx = nullptr;
m_scale = scale;
// This flag is used to avoid calling T::resizeImpl() when we
@@ -55,13 +57,13 @@ namespace she {
// Attach Wacom context
m_hpenctx = static_cast<WindowSystem*>(she::instance())
- ->penApi().attachDisplay(m_hwnd);
+ ->penApi().open(m_hwnd);
}
~WinWindow() {
if (m_hpenctx)
static_cast<WindowSystem*>(she::instance())
- ->penApi().detachDisplay(m_hpenctx);
+ ->penApi().close(m_hpenctx);
}
void queueEvent(Event& ev) {
@@ -323,6 +325,11 @@ namespace she {
_TrackMouseEvent(&tme);
}
+ if (m_device != Event::UnknownDevice) {
+ ev.setDevice(m_device);
+ ev.setPressure(m_pressure);
+ }
+
ev.setType(Event::MouseMove);
queueEvent(ev);
break;
@@ -353,6 +360,12 @@ namespace she {
msg == WM_LBUTTONDOWN ? Event::LeftButton:
msg == WM_RBUTTONDOWN ? Event::RightButton:
msg == WM_MBUTTONDOWN ? Event::MiddleButton: Event::NoneButton);
+
+ if (m_device != Event::UnknownDevice) {
+ ev.setDevice(m_device);
+ ev.setPressure(m_pressure);
+ }
+
queueEvent(ev);
break;
}
@@ -370,6 +383,12 @@ namespace she {
msg == WM_LBUTTONUP ? Event::LeftButton:
msg == WM_RBUTTONUP ? Event::RightButton:
msg == WM_MBUTTONUP ? Event::MiddleButton: Event::NoneButton);
+
+ if (m_device != Event::UnknownDevice) {
+ ev.setDevice(m_device);
+ ev.setPressure(m_pressure);
+ }
+
queueEvent(ev);
// Avoid popup menu for scrollbars
@@ -585,6 +604,48 @@ namespace she {
return result;
}
+ case WT_PROXIMITY: {
+ bool entering_ctx = (LOWORD(lparam) ? true: false);
+ if (!entering_ctx)
+ m_device = Event::UnknownDevice;
+ break;
+ }
+
+ case WT_CSRCHANGE: { // From Wintab 1.1
+ auto& api = static_cast<WindowSystem*>(she::instance())->penApi();
+ UINT serial = wparam;
+ HCTX ctx = (HCTX)lparam;
+ PACKET packet;
+
+ if (api.packet(ctx, serial, &packet)) {
+ if (packet.pkCursor == 2 || packet.pkCursor == 5)
+ m_device = Event::EraserDevice;
+ else
+ m_device = Event::StylusDevice;
+ }
+ else
+ m_device = Event::UnknownDevice;
+ }
+
+ case WT_PACKET: {
+ auto& api = static_cast<WindowSystem*>(she::instance())->penApi();
+ UINT serial = wparam;
+ HCTX ctx = (HCTX)lparam;
+ PACKET packet;
+
+ if (api.packet(ctx, serial, &packet)) {
+ m_pressure = packet.pkNormalPressure / 1000.0; // TODO get the maximum value
+
+ if (packet.pkCursor == 2 || packet.pkCursor == 5)
+ m_device = Event::EraserDevice;
+ else
+ m_device = Event::StylusDevice;
+ }
+ else
+ m_device = Event::UnknownDevice;
+ break;
+ }
+
}
LRESULT result = FALSE;
@@ -679,13 +740,17 @@ namespace she {
mutable HWND m_hwnd;
HCURSOR m_hcursor;
- HCTX m_hpenctx; // Wacom Pen context
gfx::Size m_clientSize;
gfx::Size m_restoredSize;
int m_scale;
bool m_isCreated;
bool m_hasMouse;
bool m_captureMouse;
+
+ // Wintab API data
+ HCTX m_hpenctx;
+ Event::InputDevice m_device;
+ double m_pressure;
};
} // namespace she
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/aseprite.git
More information about the Pkg-games-commits
mailing list