[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34449] branches/merwin-tablet-2/intern/ ghost/intern: Mac gets a TabletManager, refactored the same on other platforms
Mike Erwin
significant.bit at gmail.com
Sat Jan 22 07:41:35 CET 2011
Revision: 34449
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34449
Author: merwin
Date: 2011-01-22 06:41:34 +0000 (Sat, 22 Jan 2011)
Log Message:
-----------
Mac gets a TabletManager, refactored the same on other platforms
Modified Paths:
--------------
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.cpp
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.h
Added Paths:
-----------
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h
branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm
Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp 2011-01-22 04:40:15 UTC (rev 34448)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.cpp 2011-01-22 06:41:34 UTC (rev 34449)
@@ -1,16 +1,28 @@
#include "GHOST_TabletManager.h"
-#include "GHOST_Window.h"
+void reset(TabletTool& tool) // to default state
+ {
+ tool.type = TABLET_NONE;
+ tool.hasPressure = false;
+ tool.hasTilt = false;
+ }
+
GHOST_TabletManager::GHOST_TabletManager()
: hasPressure(false)
, hasTilt(false)
, activeWindow(NULL)
{
- activeTool.type = TABLET_NONE;
+ reset(activeTool);
}
GHOST_TabletManager::~GHOST_TabletManager()
{
}
+void GHOST_TabletManager::dropTool()
+ {
+ puts("dropped tool");
+ reset(activeTool);
+ activeWindow = NULL;
+ }
Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h 2011-01-22 04:40:15 UTC (rev 34448)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManager.h 2011-01-22 06:41:34 UTC (rev 34449)
@@ -1,10 +1,9 @@
#ifndef GHOST_TABLET_MANAGER_H
#define GHOST_TABLET_MANAGER_H
-// #include <vector>
+#include "GHOST_Types.h"
+#include "GHOST_Window.h"
-class GHOST_Window;
-
// TabletToolData (and its components) are meant to replace GHOST_TabletData
// and its customdata analogue in the window manager. For now it's confined to the
// TabletManager.
@@ -21,6 +20,7 @@
} TabletTool;
+void reset(TabletTool&); // to default state
typedef struct
{
@@ -31,31 +31,26 @@
} TabletToolData;
-/*
-struct Tablet
- {
- bool hasPressure;
- float pressureScale;
- bool hasTilt;
- float azimuthScale;
- float altitudeScale;
- };
-*/
-
class GHOST_TabletManager
{
protected:
// tablet attributes
bool hasPressure;
float pressureScale;
+
bool hasTilt;
- float azimuthScale;
- float altitudeScale;
+ union {
+ struct {
+ float azimuthScale;
+ float altitudeScale;
+ };
+ struct {
+ float xTiltScale;
+ float yTiltScale;
+ };
+ };
-// std::vector<Tablet> tablets;
-// std::vector<TabletTool> tools;
-
GHOST_Window* activeWindow;
TabletTool activeTool;
@@ -64,6 +59,8 @@
virtual ~GHOST_TabletManager();
virtual bool available() = 0;
+
+ virtual void dropTool();
};
#endif
Added: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h (rev 0)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h 2011-01-22 06:41:34 UTC (rev 34449)
@@ -0,0 +1,22 @@
+#ifndef GHOST_TABLET_MANAGER_COCOA_H
+#define GHOST_TABLET_MANAGER_COCOA_H
+
+#include "GHOST_TabletManager.h"
+#include "GHOST_Event.h"
+
+class GHOST_TabletManagerCocoa : public GHOST_TabletManager
+ {
+ void fillTabletData(GHOST_TabletData&, void* nsevent);
+
+public:
+ GHOST_TabletManagerCocoa();
+ ~GHOST_TabletManagerCocoa();
+
+ bool available();
+
+ GHOST_Event* convertEvent(void* nsevent, GHOST_Window*); // send motion & button events here
+ void pickupTool(void* nsevent); // send proximity events here
+ };
+
+#endif
+
Property changes on: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.h
___________________________________________________________________
Added: svn:eol-style
+ native
Added: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm (rev 0)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerCocoa.mm 2011-01-22 06:41:34 UTC (rev 34449)
@@ -0,0 +1,186 @@
+
+#include "GHOST_TabletManagerCocoa.h"
+#include "GHOST_EventCursor.h"
+#include "GHOST_EventButton.h"
+#include <AppKit/AppKit.h>
+
+GHOST_TabletManagerCocoa::GHOST_TabletManagerCocoa()
+ : GHOST_TabletManager()
+ {
+ }
+
+GHOST_TabletManagerCocoa::~GHOST_TabletManagerCocoa()
+ {
+ }
+
+bool GHOST_TabletManagerCocoa::available()
+ {
+ // API is always available, whether or not hardware is present
+ return true;
+ }
+
+void GHOST_TabletManagerCocoa::fillTabletData(GHOST_TabletData& tablet, void* nsevent)
+ {
+ NSEvent* event = (NSEvent*) nsevent;
+
+ tablet.Active = (GHOST_TTabletMode) activeTool.type;
+ tablet.Pressure = [event pressure];
+ if (hasTilt)
+ {
+ NSPoint tilt = [event tilt];
+ tablet.Xtilt = tilt.x;
+ tablet.Ytilt = tilt.y;
+ }
+ else
+ tablet.Xtilt = tablet.Ytilt = 0;
+ }
+
+static GHOST_TButtonMask convert(NSEvent* event)
+ {
+ printf("tablet button %d\n", [event buttonNumber]);
+
+ switch ([event buttonNumber])
+ {
+ case 0: return GHOST_kButtonMaskLeft;
+ case 1: return GHOST_kButtonMaskRight;
+ case 2: return GHOST_kButtonMaskMiddle;
+ case 3: return GHOST_kButtonMaskButton4;
+ case 4: return GHOST_kButtonMaskButton5;
+ default:
+ printf("<!> strange tablet button: %d\n", [event buttonNumber]);
+ return GHOST_kButtonNumMasks; // this will never be used
+ }
+ }
+
+GHOST_Event* GHOST_TabletManagerCocoa::convertEvent(void* nsevent, GHOST_Window* window)
+ {
+ NSEvent* event = (NSEvent*) nsevent;
+ GHOST_Event* ghostEvent = NULL;
+
+ switch ([event type])
+ {
+ case NSLeftMouseDown:
+ case NSRightMouseDown:
+ case NSOtherMouseDown:
+ {
+ printf("tool button %d down\n", [event buttonNumber]);
+ GHOST_EventButton* e = new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonDown, window, convert(event));
+ GHOST_TEventButtonData* data = (GHOST_TEventButtonData*) e->getData();
+ fillTabletData(data->tablet, event);
+ ghostEvent = e;
+ break;
+ }
+ case NSLeftMouseUp:
+ case NSRightMouseUp:
+ case NSOtherMouseUp:
+ {
+ printf("tool button %d up\n", [event buttonNumber]);
+ GHOST_EventButton* e = new GHOST_EventButton([event timestamp]*1000, GHOST_kEventButtonUp, window, convert(event));
+ GHOST_TEventButtonData* data = (GHOST_TEventButtonData*) e->getData();
+ fillTabletData(data->tablet, event);
+ ghostEvent = e;
+ break;
+ }
+ default:
+ {
+ printf("tool move ");
+ NSPoint pos = [event locationInWindow];
+ if (true) { // display some useful info
+ float event_dx = [event deltaX];
+ float event_dy = [event deltaY];
+ printf("<%.2f,%.2f> to (%.2f,%.2f)\n", event_dx, event_dy, pos.x, pos.y);
+ }
+ GHOST_EventCursor* e = new GHOST_EventCursor([event timestamp]*1000, GHOST_kEventCursorMove, window, pos.x, pos.y);
+ GHOST_TEventCursorData* data = (GHOST_TEventCursorData*) e->getData();
+ fillTabletData(data->tablet, event);
+ ghostEvent = e;
+ break;
+ }
+ }
+
+ return ghostEvent;
+ }
+
+// these are from Wacom's Mac SDK
+// (no idea whether other vendors use them)
+#define kTransducerDeviceIdBitMask 0x0001
+#define kTransducerAbsXBitMask 0x0002
+#define kTransducerAbsYBitMask 0x0004
+#define kTransducerVendor1BitMask 0x0008
+#define kTransducerVendor2BitMask 0x0010
+#define kTransducerVendor3BitMask 0x0020
+#define kTransducerButtonsBitMask 0x0040
+#define kTransducerTiltXBitMask 0x0080
+#define kTransducerTiltYBitMask 0x0100
+#define kTransducerAbsZBitMask 0x0200
+#define kTransducerPressureBitMask 0x0400
+#define kTransducerTangentialPressureBitMask 0x0800
+#define kTransducerOrientInfoBitMask 0x1000
+#define kTransducerRotationBitMask 0x2000
+
+void GHOST_TabletManagerCocoa::pickupTool(void* nsevent)
+ {
+ NSEvent* event = (NSEvent*) nsevent;
+
+ reset(activeTool);
+
+ printf("picked up ");
+
+ switch ([event pointingDeviceType])
+ {
+ case NSPenPointingDevice:
+ printf("pen\n");
+ activeTool.type = TABLET_PEN;
+ break;
+ case NSEraserPointingDevice:
+ printf("eraser\n");
+ activeTool.type = TABLET_ERASER;
+ break;
+ case NSCursorPointingDevice:
+ printf("cursor\n");
+ activeTool.type = TABLET_MOUSE;
+ break;
+ default:
+ printf("<!> unknown device %d\n", [event pointingDeviceType]);
+ }
+
+ int cap = [event capabilityMask];
+ printf(" capabilities:\n");
+ if (cap & kTransducerDeviceIdBitMask)
+ printf(" - device id\n");
+ if (cap & kTransducerAbsXBitMask)
+ printf(" - abs x\n");
+ if (cap & kTransducerAbsYBitMask)
+ printf(" - abs y\n");
+ if (cap & kTransducerAbsZBitMask)
+ printf(" - abs z\n");
+ if (cap & kTransducerVendor1BitMask)
+ printf(" - vendor 1\n");
+ if (cap & kTransducerVendor2BitMask)
+ printf(" - vendor 2\n");
+ if (cap & kTransducerVendor3BitMask)
+ printf(" - vendor 3\n");
+ if (cap & kTransducerButtonsBitMask)
+ printf(" - buttons\n");
+ if (cap & kTransducerTiltXBitMask)
+ {
+ printf(" - tilt x\n");
+ activeTool.hasTilt = true;
+ }
+ if (cap & kTransducerTiltYBitMask)
+ {
+ printf(" - tilt y\n");
+ activeTool.hasTilt = true;
+ }
+ if (cap & kTransducerPressureBitMask)
+ {
+ printf(" - pressure\n");
+ activeTool.hasPressure = true;
+ }
+ if (cap & kTransducerTangentialPressureBitMask)
+ printf(" - tangential pressure\n");
+ if (cap & kTransducerOrientInfoBitMask)
+ printf(" - orientation\n");
+ if (cap & kTransducerRotationBitMask)
+ printf(" - rotation\n");
+ }
Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp 2011-01-22 04:40:15 UTC (rev 34448)
+++ branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerWin32.cpp 2011-01-22 06:41:34 UTC (rev 34449)
@@ -646,14 +646,9 @@
void GHOST_TabletManagerWin32::dropTool()
{
- activeTool.type = TABLET_NONE;
- activeTool.hasPressure = false;
- activeTool.hasTilt = false;
-
+ ::dropTool();
prevMouseX = prevMouseY = 0;
prevButtons = 0;
-
- activeWindow = NULL;
}
bool GHOST_TabletManagerWin32::anyButtonsDown()
Modified: branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.cpp
===================================================================
--- branches/merwin-tablet-2/intern/ghost/intern/GHOST_TabletManagerX11.cpp 2011-01-22 04:40:15 UTC (rev 34448)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list