Fix pen tablet stuck on Windows for some non-Wacom tablets.

Differential Revision: https://developer.blender.org/D3573
This commit is contained in:
Colby Klein
2018-08-26 23:16:43 +02:00
committed by Brecht Van Lommel
parent a7b853a037
commit 31c99c0c4e
3 changed files with 34 additions and 10 deletions

View File

@@ -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;
} }

View File

@@ -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) {

View File

@@ -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();