[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