[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31344] branches/soc-2010-merwin/intern/ ghost: Further hacking on Windows tablet code.
Mike Erwin
significant.bit at gmail.com
Sun Aug 15 13:02:03 CEST 2010
Revision: 31344
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31344
Author: merwin
Date: 2010-08-15 13:02:03 +0200 (Sun, 15 Aug 2010)
Log Message:
-----------
Further hacking on Windows tablet code. More accurate detection of certain tablet tools (mice, etc.). Made tablet mouse/pen buttons play nice with GHOST. Removed old code from WindowWin32.
Modified Paths:
--------------
branches/soc-2010-merwin/intern/ghost/GHOST_IWindow.h
branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp
branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.h
branches/soc-2010-merwin/intern/ghost/intern/GHOST_WindowWin32.cpp
branches/soc-2010-merwin/intern/ghost/intern/GHOST_WindowWin32.h
Modified: branches/soc-2010-merwin/intern/ghost/GHOST_IWindow.h
===================================================================
--- branches/soc-2010-merwin/intern/ghost/GHOST_IWindow.h 2010-08-15 10:58:59 UTC (rev 31343)
+++ branches/soc-2010-merwin/intern/ghost/GHOST_IWindow.h 2010-08-15 11:02:03 UTC (rev 31344)
@@ -227,13 +227,15 @@
* @param data The window user data.
*/
virtual void setUserData(const GHOST_TUserDataPtr userData) = 0;
-
+
/**
* Returns the tablet data (pressure etc).
* @return The tablet data (pressure etc).
*/
- virtual const GHOST_TabletData* GetTabletData() = 0;
-
+ virtual const GHOST_TabletData* GetTabletData()
+ { return NULL; }
+ /* this function is targeted for removal by significant-bit */
+
/***************************************************************************************
** Progress bar functionality
***************************************************************************************/
@@ -304,8 +306,6 @@
* @return Indication of success.
*/
virtual GHOST_TSuccess setCursorGrab(GHOST_TGrabCursorMode mode, GHOST_Rect *bounds) { return GHOST_kSuccess; };
-
};
#endif // _GHOST_IWINDOW_H_
-
Modified: branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp 2010-08-15 10:58:59 UTC (rev 31343)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp 2010-08-15 11:02:03 UTC (rev 31344)
@@ -247,9 +247,13 @@
}
} while (waitForEvent && !anyProcessed);
- if (m_tabletManager->processPackets())
- anyProcessed = true;
+// Handle tablet input either here (polling)
+// or after WT_PACKET messages (event driven)
+// -- not both!
+// if (m_tabletManager->processPackets())
+// anyProcessed = true;
+
return anyProcessed;
}
@@ -951,7 +955,6 @@
// Tablet events, processed
////////////////////////////////////////////////////////////////////////
case WT_PACKET:
- puts("WT_PACKET");
m_tabletManager->processPackets(window);
break;
case WT_CSRCHANGE:
@@ -1011,7 +1014,9 @@
case WM_MOUSEMOVE:
{
- if (!eventIsFromTablet())
+ if (!eventIsFromTablet() && !m_tabletManager->anyButtonsDown())
+ // Even with careful checking, a stray cursor event sneaks through just before each
+ // tablet mouse/pen button up event. Keep clean separation between tablet and mouse!
{
int xPrev = mousePosX;
int yPrev = mousePosY;
Modified: branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp 2010-08-15 10:58:59 UTC (rev 31343)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp 2010-08-15 11:02:03 UTC (rev 31344)
@@ -10,8 +10,8 @@
#include <stdlib.h>
#include <math.h>
-#define PACKETDATA PK_CURSOR | PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION
-#define PACKETMODE 0 /*PK_BUTTONS*/
+#define PACKETDATA (PK_CURSOR | PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION)
+#define PACKETMODE (0 /*PK_BUTTONS*/)
// #define PACKETTILT PKEXT_ABSOLUTE
#include "pktdef.h"
@@ -31,6 +31,29 @@
unitName[t.axUnits]);
}
+static void print(WTPKT packet)
+ {
+ if (packet == 0)
+ puts("- nothing special");
+ else
+ {
+ if (packet & PK_CONTEXT) puts("- reporting context");
+ if (packet & PK_STATUS) puts("- status bits");
+ if (packet & PK_TIME) puts("- time stamp");
+ if (packet & PK_CHANGED) puts("- change bit vector");
+ if (packet & PK_SERIAL_NUMBER) puts("- packet serial number");
+ if (packet & PK_CURSOR) puts("- reporting cursor");
+ if (packet & PK_BUTTONS) puts("- buttons");
+ if (packet & PK_X) puts("- x axis");
+ if (packet & PK_Y) puts("- y axis");
+ if (packet & PK_Z) puts("- z axis");
+ if (packet & PK_NORMAL_PRESSURE) puts("- tip pressure");
+ if (packet & PK_TANGENT_PRESSURE) puts("- barrel pressure");
+ if (packet & PK_ORIENTATION) puts("- orientation/tilt");
+ if (packet & PK_ROTATION) puts("- rotation");
+ }
+ }
+
GHOST_TabletManagerWin32::GHOST_TabletManagerWin32()
: activeWindow(NULL)
{
@@ -49,40 +72,32 @@
func_PacketsGet = (WTPACKETSGET) GetProcAddress(lib_Wintab,"WTPacketsGet");
func_Packet = (WTPACKET) GetProcAddress(lib_Wintab,"WTPacket");
- WORD specV, implV;
- func_Info(WTI_INTERFACE, IFC_SPECVERSION, &specV);
- func_Info(WTI_INTERFACE, IFC_IMPLVERSION, &implV);
- printf("WinTab version %d.%d (%d.%d)\n",
- HIBYTE(specV), LOBYTE(specV), HIBYTE(implV), LOBYTE(implV));
-
- // query for overall capabilities and ranges
- char tabletName[LC_NAMELEN];
- if (func_Info(WTI_DEVICES, DVC_NAME, tabletName))
- puts(tabletName);
-
- puts("active tablet area");
- AXIS xRange, yRange;
- func_Info(WTI_DEVICES, DVC_X, &xRange);
- func_Info(WTI_DEVICES, DVC_Y, &yRange);
- print(xRange,"x"); print(yRange,"y");
-
-
+ puts("\n-- essential tablet info --");
func_Info(WTI_DEVICES, DVC_NCSRTYPES, &cursorCount);
func_Info(WTI_DEVICES, DVC_FIRSTCSR, &cursorBase);
- puts("pressure sensitivity");
+ func_Info(WTI_DEVICES, DVC_PKTDATA, &allTools);
+ puts("\nall tools have"); print(allTools);
+ func_Info(WTI_DEVICES, DVC_CSRDATA, &someTools);
+ puts("some tools also have"); print(someTools);
+
+ puts("\npressure sensitivity");
AXIS pressureRange;
- hasPressure = func_Info(WTI_DEVICES, DVC_NPRESSURE, &pressureRange);// && pressureRange.axMax != 0;
- print(pressureRange);
+ hasPressure = (allTools|someTools) & PK_NORMAL_PRESSURE
+ && func_Info(WTI_DEVICES, DVC_NPRESSURE, &pressureRange);
if (hasPressure)
+ {
+ print(pressureRange);
pressureScale = 1.f / pressureRange.axMax;
+ }
else
pressureScale = 0.f;
- puts("tilt sensitivity");
+ puts("\ntilt sensitivity");
AXIS tiltRange[3];
- hasTilt = func_Info(WTI_DEVICES, DVC_ORIENTATION, tiltRange);
+ hasTilt = (allTools|someTools) & PK_ORIENTATION
+ && func_Info(WTI_DEVICES, DVC_ORIENTATION, &tiltRange);
if (hasTilt)
{
@@ -103,7 +118,7 @@
#if 0 // WTX_TILT -- cartesian tilt extension, no conversion needed
// this isn't working for [mce], so let it rest for now
- printf("raw tilt sensitivity:\n");
+ puts("\nraw tilt sensitivity");
hasTilt = false;
UINT tag = 0;
UINT extensionCount;
@@ -135,6 +150,8 @@
tiltScaleX = tiltScaleY = 0.f;
}
#endif // WTX_TILT
+
+ getExtraInfo();
}
}
@@ -144,6 +161,83 @@
FreeLibrary(lib_Wintab);
}
+void GHOST_TabletManagerWin32::getExtraInfo()
+ {
+ puts("\n-- extra tablet info --");
+
+ WORD specV, implV;
+ func_Info(WTI_INTERFACE, IFC_SPECVERSION, &specV);
+ func_Info(WTI_INTERFACE, IFC_IMPLVERSION, &implV);
+ printf("WinTab version %d.%d (%d.%d)\n",
+ HIBYTE(specV), LOBYTE(specV), HIBYTE(implV), LOBYTE(implV));
+
+ UINT ndevices, ncursors;
+ func_Info(WTI_INTERFACE, IFC_NDEVICES, &ndevices);
+ func_Info(WTI_INTERFACE, IFC_NCURSORS, &ncursors);
+
+ printf("%d tablets, %d tools\n", ndevices, ncursors);
+ if (ndevices > 1)
+ ; // support this?
+
+ // query for overall capabilities and ranges
+ char tabletName[LC_NAMELEN];
+ if (func_Info(WTI_DEVICES, DVC_NAME, tabletName))
+ puts(tabletName);
+
+ puts("\nactive tablet area");
+ AXIS xRange, yRange;
+ func_Info(WTI_DEVICES, DVC_X, &xRange);
+ func_Info(WTI_DEVICES, DVC_Y, &yRange);
+ print(xRange,"x"); print(yRange,"y");
+
+ putchar('\n');
+
+ UINT extensionCount;
+ func_Info(WTI_INTERFACE, IFC_NEXTENSIONS, &extensionCount);
+ for (UINT i = 0; i < extensionCount; ++i)
+ {
+ TCHAR name[40];
+ func_Info(WTI_EXTENSIONS + i, EXT_NAME, name);
+ printf("extension %d: %s\n", i, name);
+ }
+
+// for (int i = cursorBase; i < cursorBase + cursorCount; ++i)
+ for (UINT i = 0; i < ncursors; ++i)
+ {
+ // what can each cursor do?
+
+ UINT physID;
+ func_Info(WTI_CURSORS + i, CSR_PHYSID, &physID);
+ if (physID == 0)
+ // each 'real' cursor has a physical ID
+ // (on Intuos at least, test on Graphire also)
+ continue;
+
+ TCHAR name[40];
+ func_Info(WTI_CURSORS + i, CSR_NAME, name);
+ printf("\ncursor %d: %s\n", i, name);
+
+ BOOL active;
+ func_Info(WTI_CURSORS + i, CSR_ACTIVE, &active);
+ printf("active: %s\n", active ? "yes" : "no");
+
+ WTPKT packet;
+ func_Info(WTI_CURSORS + i, CSR_PKTDATA, &packet);
+ // only report the 'special' bits that distinguish this cursor from the rest
+ puts("packet support"); print(packet & someTools);
+
+ puts("buttons:");
+ BYTE buttons;
+ BYTE sysButtonMap[32];
+ func_Info(WTI_CURSORS + i, CSR_BUTTONS, &buttons);
+ func_Info(WTI_CURSORS + i, CSR_SYSBTNMAP, sysButtonMap);
+ for (int i = 0; i < buttons; ++i)
+ printf(" %d -> %d\n", i, sysButtonMap[i]);
+ }
+
+ putchar('\n');
+ }
+
bool GHOST_TabletManagerWin32::available()
{
return lib_Wintab // driver installed
@@ -169,6 +263,7 @@
LOGCONTEXT archetype;
func_Info(WTI_DEFSYSCTX, 0, &archetype);
// func_Info(WTI_DEFCONTEXT, 0, &archetype);
+// func_Info(WTI_DSCTXS, 0, &archetype);
strcpy(archetype.lcName, "blender special");
@@ -180,8 +275,8 @@
archetype.lcPktData = packetData;
archetype.lcPktMode = PACKETMODE;
- archetype.lcOptions |= /*CXO_MESSAGES |*/ CXO_CSRMESSAGES;
-// archetype.lcOptions |= CXO_SYSTEM | CXO_MESSAGES | CXO_CSRMESSAGES;
+// archetype.lcOptions |= CXO_CSRMESSAGES; // <-- lean mean version
+ archetype.lcOptions |= CXO_SYSTEM | CXO_MESSAGES | CXO_CSRMESSAGES;
#if PACKETMODE & PK_BUTTONS
// we want first 5 buttons
@@ -220,6 +315,7 @@
printf("tablet queue size: %d\n", tabletQueueSize);
contexts[window] = context;
+ activeWindow = window;
}
void GHOST_TabletManagerWin32::closeForWindow(GHOST_WindowWin32* window)
@@ -231,6 +327,8 @@
func_Close(context);
// also remove it from our books:
contexts.erase(contexts.find(window));
+ if (activeWindow == window)
+ activeWindow = NULL;
}
}
@@ -270,6 +368,28 @@
data.tilt_y = sin(M_PI/2.0 - azmRad) * vecLen;
}
+bool GHOST_TabletManagerWin32::convertButton(const UINT button, GHOST_TButtonMask& ghost)
+ {
+ switch (sysButtonMap[button])
+ {
+ case 1:
+ ghost = GHOST_kButtonMaskLeft;
+ break;
+ case 4:
+ ghost = GHOST_kButtonMaskRight;
+ break;
+ case 7:
+ ghost = GHOST_kButtonMaskMiddle;
+ break;
+ // sorry, no Button4 or Button5
+ // they each map to 0 (unused)
+ default:
+ return false;
+ };
+
+ return true;
+ }
+
bool GHOST_TabletManagerWin32::processPackets(GHOST_WindowWin32* window)
{
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list