[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