[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31337] branches/soc-2010-merwin: continued Win32 tablet hackery

Mike Erwin significant.bit at gmail.com
Sat Aug 14 23:01:09 CEST 2010


Revision: 31337
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31337
Author:   merwin
Date:     2010-08-14 23:01:09 +0200 (Sat, 14 Aug 2010)

Log Message:
-----------
continued Win32 tablet hackery

Modified Paths:
--------------
    branches/soc-2010-merwin/intern/ghost/intern/GHOST_Buttons.cpp
    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/source/blender/windowmanager/intern/wm_event_system.c

Modified: branches/soc-2010-merwin/intern/ghost/intern/GHOST_Buttons.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_Buttons.cpp	2010-08-14 17:11:10 UTC (rev 31336)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_Buttons.cpp	2010-08-14 21:01:09 UTC (rev 31337)
@@ -35,6 +35,7 @@
 	clear();
 }
 
+GHOST_Buttons::~GHOST_Buttons() {}
 
 bool GHOST_Buttons::get(GHOST_TButtonMask mask) const
 {
@@ -73,7 +74,5 @@
 
 bool GHOST_Buttons::anyDown() const
 {
-	return m_ButtonLeft || m_ButtonMiddle || m_ButtonRight;	
+	return m_ButtonLeft || m_ButtonMiddle || m_ButtonRight;
 }
-
-GHOST_Buttons::~GHOST_Buttons() {}

Modified: branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp	2010-08-14 17:11:10 UTC (rev 31336)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_SystemWin32.cpp	2010-08-14 21:01:09 UTC (rev 31337)
@@ -247,6 +247,9 @@
 		}
 	} while (waitForEvent && !anyProcessed);
 
+	if (m_tabletManager->processPackets())
+		anyProcessed = true;
+
 	return anyProcessed;
 }
 
@@ -500,22 +503,37 @@
 
 bool eventIsFromTablet()
 	{
-	// bool IsFromPen = ((GetMessageExtraInfo() & 0xFF515700) == 0xFF515700); // this only works on TabletPCs
-	return GetMessageExtraInfo() & 0x7f; // true for tablet mouse, not just pen
+	// this (apparently) gives the packet serial number, which only tablet events have
+	return GetMessageExtraInfo() != 0;
+//	bool IsFromPen = ((GetMessageExtraInfo() & 0xFF515700) == 0xFF515700); // this only works on TabletPCs
+//	static int all_magic = 0;
+//	int magic = GetMessageExtraInfo();
+//	all_magic |= magic;
+//	printf("from tablet? %08x %08x\n", magic, all_magic);
+//	return magic & 0x7f; // true for tablet mouse, not just pen
 	}
 
 GHOST_EventButton* GHOST_SystemWin32::processButtonEvent(GHOST_TEventType type, GHOST_IWindow *window, GHOST_TButtonMask mask)
 {
-	puts("ghost button event");
-//	if (eventIsFromTablet())
-//		return NULL;
+	if (eventIsFromTablet())
+		return NULL;
 
+	static GHOST_Buttons buttons;
+	if (type == GHOST_kEventButtonUp && !buttons.get(mask))
+		// discard rogue button up events (probably from tablet)
+		return NULL;
+	buttons.set(mask, type == GHOST_kEventButtonDown);
+
+	printf("system button %d %s\n", mask, (type == GHOST_kEventButtonDown) ? "down" : (type == GHOST_kEventButtonUp) ? "up" : "???");
+
 	return new GHOST_EventButton (getSystem()->getMilliSeconds(), type, window, mask);
 }
 
 
 GHOST_EventCursor* GHOST_SystemWin32::processCursorEvent(GHOST_TEventType type, GHOST_IWindow *Iwindow, int x_screen, int y_screen)
 {
+	printf("system cursor (%d,%d)\n", x_screen, y_screen);
+
 	GHOST_SystemWin32 * system = ((GHOST_SystemWin32 * ) getSystem());
 	GHOST_WindowWin32 * window = ( GHOST_WindowWin32 * ) Iwindow;
 
@@ -933,10 +951,11 @@
 		// Tablet events, processed
 		////////////////////////////////////////////////////////////////////////
 		case WT_PACKET:
+			puts("WT_PACKET");
 			m_tabletManager->processPackets(window);
 			break;
 		case WT_CSRCHANGE:
-			m_tabletManager->changeTool((HCTX)lParam, wParam);
+			m_tabletManager->changeTool(window, wParam);
 			break;
 		case WT_PROXIMITY:
 			if (LOWORD(lParam) == 0)
@@ -1034,8 +1053,10 @@
          GetRawInputData((HRAWINPUT)lParam, RID_INPUT, raw_ptr, &rawSize, sizeof(RAWINPUTHEADER));
          eventSent |= processRawInput(raw, window);
 
-         // necessary?
-         // DefRawInputProc(&raw_ptr, 1, sizeof(RAWINPUTHEADER));
+			if (processRawInput(raw, window))
+				eventSent = true;
+//			else
+//				DefRawInputProc(&raw_ptr, 1, sizeof(RAWINPUTHEADER));
 
 #if 0
 			#define RAWCOUNT 10
@@ -1067,7 +1088,7 @@
 						}
 
 					// clear processed events from the queue
-					DefRawInputProc((RAWINPUT**)&rawBuffer, n, sizeof(RAWINPUTHEADER));
+					// DefRawInputProc((RAWINPUT**)&rawBuffer, n, sizeof(RAWINPUTHEADER));
 					}
 				}
 #endif

Modified: branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
===================================================================
--- branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp	2010-08-14 17:11:10 UTC (rev 31336)
+++ branches/soc-2010-merwin/intern/ghost/intern/GHOST_TabletManagerWin32.cpp	2010-08-14 21:01:09 UTC (rev 31337)
@@ -1,430 +1,507 @@
-// safe & friendly WinTab wrapper
-// by Mike Erwin, July 2010
-
-#include "GHOST_TabletManagerWin32.h"
-#include "GHOST_WindowWin32.h"
-#include "GHOST_System.h"
-#include "GHOST_EventCursor.h"
-#include "GHOST_EventButton.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#define PACKETDATA PK_CURSOR | PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_ORIENTATION
-#define PACKETMODE PK_BUTTONS
-// #define PACKETTILT PKEXT_ABSOLUTE
-
-#include "pktdef.h"
-
-#define MAX_QUEUE_SIZE 100
-
-GHOST_TabletManagerWin32::GHOST_TabletManagerWin32()
-	{
-	dropTool();
-
-	// open WinTab
-	lib_Wintab = LoadLibrary("wintab32.dll");
-
-	if (lib_Wintab)
-		{
-		// connect function pointers
-		func_Open = (WTOPENA) GetProcAddress(lib_Wintab,"WTOpenA");
-		func_Close = (WTCLOSE) GetProcAddress(lib_Wintab,"WTClose");
-		func_Info = (WTINFOA) GetProcAddress(lib_Wintab,"WTInfoA");
-		func_QueueSizeSet = (WTQUEUESIZESET) GetProcAddress(lib_Wintab,"WTQueueSizeSet");
-		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);
-
-		AXIS xRange, yRange;
-		func_Info(WTI_DEVICES, DVC_X, &xRange);
-		func_Info(WTI_DEVICES, DVC_Y, &yRange);
-
-		printf("active area: %dx%d\n", xRange.axMax, yRange.axMax);
-
-		func_Info(WTI_DEVICES, DVC_NCSRTYPES, &cursorCount);
-		func_Info(WTI_DEVICES, DVC_FIRSTCSR, &cursorBase);
-
-		AXIS pressureRange;
-		hasPressure = func_Info(WTI_DEVICES, DVC_NPRESSURE, &pressureRange);// && pressureRange.axMax != 0;
-
-		printf("pressure sensitivity: ");
-		if (hasPressure)
-			{
-			printf("%d to %d\n", pressureRange.axMin, pressureRange.axMax);
-			pressureScale = 1.f / pressureRange.axMax;
-			}
-		else
-			{
-			printf("none\n");
-			pressureScale = 0.f;
-			}
-
-		printf("tilt sensitivity:\n");
-		AXIS tiltRange[3];
-		hasTilt = func_Info(WTI_DEVICES, DVC_ORIENTATION, tiltRange);
-
-		if (hasTilt)
-			{
-			// cheat by using available data from Intuos4. test on other tablets!!!
-			azimuthScale = 1.f / HIWORD(tiltRange[1].axResolution);
-			altitudeScale = 1.f / tiltRange[1].axMax;
-
-			// leave this code in place to help support tablets I haven't tested
-			const char* axisName[] = {"azimuth","altitude","twist"};
-			const char* unitName[] = {NULL,"inch","cm","circle"};
-			for (int i = 0; i < 3; ++i)
-				{
-				AXIS const& t = tiltRange[i];
-				if (t.axResolution)
-					printf("%s: %d to %d values per %d.%d %s\n",
-						axisName[i], t.axMin, t.axMax,
-						HIWORD(t.axResolution), LOWORD(t.axResolution),
-						unitName[t.axUnits]);
-				}
-			}
-		else
-			{
-			printf("none\n");
-			}
-
-#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");
-		hasTilt = false;
-		UINT tag = 0;
-		UINT extensionCount;
-		func_Info(WTI_INTERFACE, IFC_NEXTENSIONS, &extensionCount);
-		for (UINT i = 0; i < extensionCount; ++i)
-//		for (UINT i = 0; func_Info(WTI_EXTENSIONS + i, EXT_TAG, &tag); ++i)
-			{
-			printf("trying extension %d\n", i);
-			func_Info(WTI_EXTENSIONS + i, EXT_TAG, &tag);
-			if (tag == WTX_TILT)
-				{
-				hasTilt = true;
-				break;
-				}
-			}
-
-		if (hasTilt)
-			{
-			func_Info(WTI_EXTENSIONS + tag, EXT_MASK, &tiltMask);
-			AXIS tiltRange[2];
-			func_Info(WTI_EXTENSIONS + tag, EXT_AXES, tiltRange);
-			printf("%d to %d along x\n", tiltRange[0].axMin, tiltRange[0].axMax);
-			printf("%d to %d along y\n", tiltRange[1].axMin, tiltRange[1].axMax);
-			tiltScaleX = 1.f / tiltRange[0].axMax;
-			tiltScaleY = 1.f / tiltRange[1].axMax;
-			}
-		else
-			{
-			printf("none\n");
-			tiltScaleX = tiltScaleY = 0.f;
-			}
-#endif // WTX_TILT
-		}
-	}
-
-GHOST_TabletManagerWin32::~GHOST_TabletManagerWin32()
-	{
-	// close WinTab
-	FreeLibrary(lib_Wintab);
-	}
-
-bool GHOST_TabletManagerWin32::available()
-	{
-	return lib_Wintab // driver installed
-		&& func_Info(0,0,NULL); // tablet plugged in
-	}
-
-HCTX GHOST_TabletManagerWin32::contextForWindow(GHOST_WindowWin32* window)
-	{
-	std::map<GHOST_WindowWin32*,HCTX>::iterator i = contexts.find(window);
-	if (i == contexts.end())
-		return 0; // not found
-	else
-		return i->second;
-	}
-
-void GHOST_TabletManagerWin32::openForWindow(GHOST_WindowWin32* window)
-	{
-	if (contextForWindow(window) != 0)
-		// this window already has a tablet context
-		return;
-
-	// set up context
-	LOGCONTEXT archetype;
-//	func_Info(WTI_DEFSYSCTX, 0, &archetype);
-	func_Info(WTI_DEFCONTEXT, 0, &archetype);
-
-	strcpy(archetype.lcName, "blender special");
-	archetype.lcPktData = PACKETDATA;
-	archetype.lcPktMode = PACKETMODE;
-//	archetype.lcOptions |= CXO_MESSAGES | CXO_CSRMESSAGES;
-	archetype.lcOptions |= CXO_SYSTEM | CXO_MESSAGES | CXO_CSRMESSAGES;
-
-	// we want first 5 buttons
-	archetype.lcBtnDnMask = 0x1f;
-	archetype.lcBtnUpMask = 0x1f;
-
-// BEGIN derived from Wacom's TILTTEST.C:
-	AXIS TabletX, TabletY;
-	func_Info(WTI_DEVICES,DVC_X,&TabletX);
-	func_Info(WTI_DEVICES,DVC_Y,&TabletY);
-	archetype.lcInOrgX = 0;
-	archetype.lcInOrgY = 0;
-	archetype.lcInExtX = TabletX.axMax;
-	archetype.lcInExtY = TabletY.axMax;
-    /* output the data in screen coords */
-	archetype.lcOutOrgX = archetype.lcOutOrgY = 0;
-	archetype.lcOutExtX = GetSystemMetrics(SM_CXSCREEN);
-    /* move origin to upper left */
-	archetype.lcOutExtY = -GetSystemMetrics(SM_CYSCREEN);
-// END
-
-/*	if (hasTilt)
-		{
-		archetype.lcPktData |= tiltMask;
-		archetype.lcMoveMask |= tiltMask;
-		} */
-
-	// open the context
-	HCTX context = func_Open(window->getHWND(), &archetype, TRUE);
-
-	// request a deep packet queue
-	int tabletQueueSize = MAX_QUEUE_SIZE;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list