Fix pen tablet stuck on Windows for some non-Wacom tablets.
Differential Revision: https://developer.blender.org/D3573
This commit is contained in:

committed by
Brecht Van Lommel

parent
a7b853a037
commit
31c99c0c4e
@@ -1248,7 +1248,7 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
|
|||||||
* will not be dispatched to OUR active window if we minimize one of OUR windows. */
|
* will not be dispatched to OUR active window if we minimize one of OUR windows. */
|
||||||
if (LOWORD(wParam) == WA_INACTIVE)
|
if (LOWORD(wParam) == WA_INACTIVE)
|
||||||
window->lostMouseCapture();
|
window->lostMouseCapture();
|
||||||
|
window->processWin32TabletActivateEvent(GET_WM_ACTIVATE_STATE(wParam, lParam));
|
||||||
lResult = ::DefWindowProc(hwnd, msg, wParam, lParam);
|
lResult = ::DefWindowProc(hwnd, msg, wParam, lParam);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -265,23 +265,22 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system,
|
|||||||
GHOST_WIN32_WTInfo fpWTInfo = (GHOST_WIN32_WTInfo) ::GetProcAddress(m_wintab, "WTInfoA");
|
GHOST_WIN32_WTInfo fpWTInfo = (GHOST_WIN32_WTInfo) ::GetProcAddress(m_wintab, "WTInfoA");
|
||||||
GHOST_WIN32_WTOpen fpWTOpen = (GHOST_WIN32_WTOpen) ::GetProcAddress(m_wintab, "WTOpenA");
|
GHOST_WIN32_WTOpen fpWTOpen = (GHOST_WIN32_WTOpen) ::GetProcAddress(m_wintab, "WTOpenA");
|
||||||
|
|
||||||
// let's see if we can initialize tablet here
|
// Let's see if we can initialize tablet here.
|
||||||
/* check if WinTab available. */
|
// Check if WinTab available by getting system context info.
|
||||||
if (fpWTInfo && fpWTInfo(0, 0, NULL)) {
|
LOGCONTEXT lc = { 0 };
|
||||||
|
lc.lcOptions |= CXO_SYSTEM;
|
||||||
|
if (fpWTInfo && fpWTInfo(WTI_DEFSYSCTX, 0, &lc)) {
|
||||||
// Now init the tablet
|
// Now init the tablet
|
||||||
LOGCONTEXT lc;
|
|
||||||
/* The maximum tablet size, pressure and orientation (tilt) */
|
/* The maximum tablet size, pressure and orientation (tilt) */
|
||||||
AXIS TabletX, TabletY, Pressure, Orientation[3];
|
AXIS TabletX, TabletY, Pressure, Orientation[3];
|
||||||
|
|
||||||
// Open a Wintab context
|
// Open a Wintab context
|
||||||
|
|
||||||
// Get default context information
|
|
||||||
fpWTInfo(WTI_DEFCONTEXT, 0, &lc);
|
|
||||||
|
|
||||||
// Open the context
|
// Open the context
|
||||||
lc.lcPktData = PACKETDATA;
|
lc.lcPktData = PACKETDATA;
|
||||||
lc.lcPktMode = PACKETMODE;
|
lc.lcPktMode = PACKETMODE;
|
||||||
lc.lcOptions |= CXO_MESSAGES | CXO_SYSTEM;
|
lc.lcOptions |= CXO_MESSAGES;
|
||||||
|
lc.lcMoveMask = PACKETDATA;
|
||||||
|
|
||||||
/* Set the entire tablet as active */
|
/* Set the entire tablet as active */
|
||||||
fpWTInfo(WTI_DEVICES, DVC_X, &TabletX);
|
fpWTInfo(WTI_DEVICES, DVC_X, &TabletX);
|
||||||
@@ -309,11 +308,17 @@ GHOST_WindowWin32::GHOST_WindowWin32(GHOST_SystemWin32 *system,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fpWTOpen) {
|
if (fpWTOpen) {
|
||||||
m_tablet = fpWTOpen(m_hWnd, &lc, TRUE);
|
// The Wintab spec says we must open the context disabled if we are using cursor masks.
|
||||||
|
m_tablet = fpWTOpen(m_hWnd, &lc, FALSE);
|
||||||
if (m_tablet) {
|
if (m_tablet) {
|
||||||
m_tabletData = new GHOST_TabletData();
|
m_tabletData = new GHOST_TabletData();
|
||||||
m_tabletData->Active = GHOST_kTabletModeNone;
|
m_tabletData->Active = GHOST_kTabletModeNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GHOST_WIN32_WTEnable fpWTEnable = (GHOST_WIN32_WTEnable) ::GetProcAddress(m_wintab, "WTEnable");
|
||||||
|
if (fpWTEnable) {
|
||||||
|
fpWTEnable(m_tablet, TRUE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -857,6 +862,23 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorShape(GHOST_TStandardCursor cur
|
|||||||
return GHOST_kSuccess;
|
return GHOST_kSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GHOST_WindowWin32::processWin32TabletActivateEvent(WORD state)
|
||||||
|
{
|
||||||
|
if (!m_tablet) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GHOST_WIN32_WTEnable fpWTEnable = (GHOST_WIN32_WTEnable) ::GetProcAddress(m_wintab, "WTEnable");
|
||||||
|
GHOST_WIN32_WTOverlap fpWTOverlap = (GHOST_WIN32_WTOverlap) ::GetProcAddress(m_wintab, "WTOverlap");
|
||||||
|
|
||||||
|
if (fpWTEnable) {
|
||||||
|
fpWTEnable(m_tablet, state);
|
||||||
|
if (fpWTOverlap && state) {
|
||||||
|
fpWTOverlap(m_tablet, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GHOST_WindowWin32::processWin32TabletInitEvent()
|
void GHOST_WindowWin32::processWin32TabletInitEvent()
|
||||||
{
|
{
|
||||||
if (m_wintab && m_tabletData) {
|
if (m_wintab && m_tabletData) {
|
||||||
|
@@ -56,6 +56,7 @@ typedef UINT (API * GHOST_WIN32_WTInfo)(UINT, UINT, LPVOID);
|
|||||||
typedef HCTX (API * GHOST_WIN32_WTOpen)(HWND, LPLOGCONTEXTA, BOOL);
|
typedef HCTX (API * GHOST_WIN32_WTOpen)(HWND, LPLOGCONTEXTA, BOOL);
|
||||||
typedef BOOL (API * GHOST_WIN32_WTClose)(HCTX);
|
typedef BOOL (API * GHOST_WIN32_WTClose)(HCTX);
|
||||||
typedef BOOL (API * GHOST_WIN32_WTPacket)(HCTX, UINT, LPVOID);
|
typedef BOOL (API * GHOST_WIN32_WTPacket)(HCTX, UINT, LPVOID);
|
||||||
|
typedef BOOL (API * GHOST_WIN32_WTEnable)(HCTX, BOOL);
|
||||||
typedef BOOL (API * GHOST_WIN32_WTOverlap)(HCTX, BOOL);
|
typedef BOOL (API * GHOST_WIN32_WTOverlap)(HCTX, BOOL);
|
||||||
|
|
||||||
// typedefs for user32 functions to allow dynamic loading of Windows 10 DPI scaling functions
|
// typedefs for user32 functions to allow dynamic loading of Windows 10 DPI scaling functions
|
||||||
@@ -249,6 +250,7 @@ public:
|
|||||||
return m_tabletData;
|
return m_tabletData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void processWin32TabletActivateEvent(WORD state);
|
||||||
void processWin32TabletInitEvent();
|
void processWin32TabletInitEvent();
|
||||||
void processWin32TabletEvent(WPARAM wParam, LPARAM lParam);
|
void processWin32TabletEvent(WPARAM wParam, LPARAM lParam);
|
||||||
void bringTabletContextToFront();
|
void bringTabletContextToFront();
|
||||||
|
Reference in New Issue
Block a user