[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33871] branches/merwin-tablet: overhaul of Linux/X11 tablet handling (work in progress)

Mike Erwin significant.bit at gmail.com
Thu Dec 23 10:14:39 CET 2010


Revision: 33871
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33871
Author:   merwin
Date:     2010-12-23 10:14:38 +0100 (Thu, 23 Dec 2010)

Log Message:
-----------
overhaul of Linux/X11 tablet handling (work in progress)

Modified Paths:
--------------
    branches/merwin-tablet/intern/ghost/GHOST_C-api.h
    branches/merwin-tablet/intern/ghost/GHOST_IWindow.h
    branches/merwin-tablet/intern/ghost/GHOST_Types.h
    branches/merwin-tablet/intern/ghost/SConscript
    branches/merwin-tablet/intern/ghost/intern/GHOST_C-api.cpp
    branches/merwin-tablet/intern/ghost/intern/GHOST_EventButton.h
    branches/merwin-tablet/intern/ghost/intern/GHOST_EventCursor.h
    branches/merwin-tablet/intern/ghost/intern/GHOST_SystemX11.cpp
    branches/merwin-tablet/intern/ghost/intern/GHOST_SystemX11.h
    branches/merwin-tablet/intern/ghost/intern/GHOST_WindowX11.cpp
    branches/merwin-tablet/intern/ghost/intern/GHOST_WindowX11.h
    branches/merwin-tablet/source/blender/windowmanager/intern/wm_cursors.c
    branches/merwin-tablet/source/blender/windowmanager/intern/wm_event_system.c

Added Paths:
-----------
    branches/merwin-tablet/intern/ghost/intern/GHOST_TabletManager.cpp
    branches/merwin-tablet/intern/ghost/intern/GHOST_TabletManager.h
    branches/merwin-tablet/intern/ghost/intern/GHOST_TabletManagerX11.cpp
    branches/merwin-tablet/intern/ghost/intern/GHOST_TabletManagerX11.h

Modified: branches/merwin-tablet/intern/ghost/GHOST_C-api.h
===================================================================
--- branches/merwin-tablet/intern/ghost/GHOST_C-api.h	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/GHOST_C-api.h	2010-12-23 09:14:38 UTC (rev 33871)
@@ -672,13 +672,6 @@
 extern GHOST_TSuccess GHOST_InvalidateWindow(GHOST_WindowHandle windowhandle);
 
 /**
- * Returns the status of the tablet
- * @param windowhandle The handle to the window
- * @return Status of tablet
- */
-extern const GHOST_TabletData *GHOST_GetTabletData(GHOST_WindowHandle windowhandle);
-
-/**
  * Access to rectangle width.
  * @param rectanglehandle The handle to the rectangle
  * @return	width of the rectangle

Modified: branches/merwin-tablet/intern/ghost/GHOST_IWindow.h
===================================================================
--- branches/merwin-tablet/intern/ghost/GHOST_IWindow.h	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/GHOST_IWindow.h	2010-12-23 09:14:38 UTC (rev 33871)
@@ -228,12 +228,6 @@
 	 */
 	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;
-	
 	/***************************************************************************************
 	 ** Progress bar functionality
 	 ***************************************************************************************/

Modified: branches/merwin-tablet/intern/ghost/GHOST_Types.h
===================================================================
--- branches/merwin-tablet/intern/ghost/GHOST_Types.h	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/GHOST_Types.h	2010-12-23 09:14:38 UTC (rev 33871)
@@ -368,11 +368,15 @@
 	GHOST_TInt32 x;
 	/** The y-coordinate of the cursor position. */
 	GHOST_TInt32 y;
+	/** tablet-specific data (tablet.tool = None otherwise) */
+	GHOST_TabletData tablet;
 } GHOST_TEventCursorData;
 
 typedef struct {
 	/** The mask of the mouse button. */
 	GHOST_TButtonMask button;
+	/** tablet-specific data (tablet.tool = None otherwise) */
+	GHOST_TabletData tablet;
 } GHOST_TEventButtonData;
 
 typedef struct {

Modified: branches/merwin-tablet/intern/ghost/SConscript
===================================================================
--- branches/merwin-tablet/intern/ghost/SConscript	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/SConscript	2010-12-23 09:14:38 UTC (rev 33871)
@@ -11,7 +11,7 @@
     sources += env.Glob('intern/*.mm')
 
 
-pf = ['GHOST_DisplayManager', 'GHOST_System', 'GHOST_Window', 'GHOST_DropTarget']
+pf = ['GHOST_DisplayManager', 'GHOST_System', 'GHOST_Window', 'GHOST_DropTarget', 'GHOST_TabletManager']
 defs=['_USE_MATH_DEFINES']
 
 if window_system in ('linux2', 'openbsd3', 'sunos5', 'freebsd7', 'freebsd8', 'freebsd9', 'irix6', 'aix4', 'aix5'):
@@ -66,4 +66,5 @@
 if window_system in ('win32-vc', 'win64-vc'):
     env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15]) #, cc_compileflags=env['CCFLAGS'].append('/WX') ) 
 else:
-    env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15] ) 
+    env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15])
+

Modified: branches/merwin-tablet/intern/ghost/intern/GHOST_C-api.cpp
===================================================================
--- branches/merwin-tablet/intern/ghost/intern/GHOST_C-api.cpp	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/intern/GHOST_C-api.cpp	2010-12-23 09:14:38 UTC (rev 33871)
@@ -702,12 +702,7 @@
 }
 
 
-extern const GHOST_TabletData* GHOST_GetTabletData(GHOST_WindowHandle windowhandle)
-{
-	return ((GHOST_IWindow*)windowhandle)->GetTabletData();
-}
 
-
 GHOST_TInt32 GHOST_GetWidthRectangle(GHOST_RectangleHandle rectanglehandle)
 {
 	return ((GHOST_Rect*)rectanglehandle)->getWidth();

Modified: branches/merwin-tablet/intern/ghost/intern/GHOST_EventButton.h
===================================================================
--- branches/merwin-tablet/intern/ghost/intern/GHOST_EventButton.h	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/intern/GHOST_EventButton.h	2010-12-23 09:14:38 UTC (rev 33871)
@@ -55,6 +55,7 @@
 		: GHOST_Event(time, type, window)
 	{
 		m_buttonEventData.button = button;
+		m_buttonEventData.tablet.Active = GHOST_kTabletModeNone;
 		m_data = &m_buttonEventData;
 	}
 

Modified: branches/merwin-tablet/intern/ghost/intern/GHOST_EventCursor.h
===================================================================
--- branches/merwin-tablet/intern/ghost/intern/GHOST_EventCursor.h	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/intern/GHOST_EventCursor.h	2010-12-23 09:14:38 UTC (rev 33871)
@@ -55,6 +55,7 @@
 	{
 		m_cursorEventData.x = x;
 		m_cursorEventData.y = y;
+		m_cursorEventData.tablet.Active = GHOST_kTabletModeNone;
 		m_data = &m_cursorEventData;
 	}
 

Modified: branches/merwin-tablet/intern/ghost/intern/GHOST_SystemX11.cpp
===================================================================
--- branches/merwin-tablet/intern/ghost/intern/GHOST_SystemX11.cpp	2010-12-23 04:26:53 UTC (rev 33870)
+++ branches/merwin-tablet/intern/ghost/intern/GHOST_SystemX11.cpp	2010-12-23 09:14:38 UTC (rev 33871)
@@ -40,6 +40,7 @@
 #include "GHOST_EventNDOF.h"
 #include "GHOST_NDOFManager.h"
 #include "GHOST_DisplayManagerX11.h"
+#include "GHOST_TabletManagerX11.h"
 
 #include "GHOST_Debug.h"
 
@@ -94,7 +95,8 @@
 GHOST_SystemX11(
 ) : 
 	GHOST_System(),
-	m_start_time(0)
+	m_start_time(0),
+	m_tabletManager(NULL)
 {
 	m_display = XOpenDisplay(NULL);
 	
@@ -161,6 +163,9 @@
 GHOST_SystemX11::
 ~GHOST_SystemX11()
 {
+	if (m_tabletManager)
+		delete m_tabletManager;
+
 	XCloseDisplay(m_display);
 }
 
@@ -173,7 +178,7 @@
 
 	if (success) {
 		m_displayManager = new GHOST_DisplayManagerX11(this);
-
+		m_tabletManager = new GHOST_TabletManagerX11(this);
 		if (m_displayManager) {
 			return GHOST_kSuccess;
 		}
@@ -272,6 +277,8 @@
 			delete window;
 			window = 0;
 		}
+
+		m_tabletManager->becomeTabletAware(window->getXWindow());
 	}
 	return window;
 }
@@ -455,6 +462,7 @@
 		case MotionNotify:
 		{
 			XMotionEvent &xme = xe->xmotion;
+			printf("MotionNotify (state = hex:%x, send_event = %s)\n", xme.state, xme.send_event ? "true" : "false");
 			
 			if(window->getCursorGrabMode() != GHOST_kGrabDisable && window->getCursorGrabMode() != GHOST_kGrabNormal)
 			{
@@ -538,6 +546,7 @@
 		case ButtonPress:
 		case ButtonRelease:
 		{
+			puts("ButtonPress/Release");
 			XButtonEvent & xbe = xe->xbutton;
 			GHOST_TButtonMask gbmask = GHOST_kButtonMaskLeft;
 			GHOST_TEventType type = (xbe.type == ButtonPress) ? 
@@ -619,6 +628,7 @@
 		}
 		case ClientMessage:
 		{
+			puts("ClientMessage");
 			XClientMessageEvent & xcme = xe->xclient;
 
 #ifndef __sgi			
@@ -784,8 +794,17 @@
 			break;
 		}
 		
-		default: {
-			if(xe->type == window->GetXTablet().MotionEvent) 
+		default:
+			// is this a tablet event?
+			if (xe->type == GHOST_TabletManagerX11::MotionEvent)
+				g_event = m_tabletManager->convertEvent(xe);
+			else if (xe->type == GHOST_TabletManagerX11::ProxInEvent)
+				m_tabletManager->pickupTool(xe);
+			else if (xe->type == GHOST_TabletManagerX11::ProxOutEvent)
+				m_tabletManager->dropTool();
+
+#if 0
+			if (xe->type == TabletManagerX11::MotionEvent)
 			{
 				XDeviceMotionEvent* data = (XDeviceMotionEvent*)xe;
 				window->GetXTablet().CommonData.Pressure= 
@@ -798,7 +817,7 @@
 				window->GetXTablet().CommonData.Ytilt= 
 					(short)(data->axis_data[4]&0xffff)/((float)window->GetXTablet().YtiltLevels);
 			}
-			else if(xe->type == window->GetXTablet().ProxInEvent) 
+			else if (xe->type == TabletManagerX11::ProxInEvent)
 			{
 				XProximityNotifyEvent* data = (XProximityNotifyEvent*)xe;
 				if(data->deviceid == window->GetXTablet().StylusID)
@@ -806,11 +825,9 @@
 				else if(data->deviceid == window->GetXTablet().EraserID)
 					window->GetXTablet().CommonData.Active= GHOST_kTabletModeEraser;
 			}
-			else if(xe->type == window->GetXTablet().ProxOutEvent)
+			else if (xe->type == TabletManagerX11::ProxOutEvent)
 				window->GetXTablet().CommonData.Active= GHOST_kTabletModeNone;
-
-			break;
-		}
+#endif
 	}
 
 	if (g_event) {
@@ -1496,3 +1513,98 @@
 	return NULL;
 }
 
+#if 0
+void GHOST_SystemX11::initXInputDevices()
+{
+	static XErrorHandler old_handler = (XErrorHandler) 0 ;
+	XExtensionVersion *version = XGetExtensionVersion(m_display, INAME);
+
+	if(version && (version != (XExtensionVersion*)NoSuchExtension)) {
+		if(version->present) {
+			int device_count;
+			XDeviceInfo* device_info = XListInputDevices(m_display, &device_count);
+			m_xtablet.StylusDevice = NULL;
+			m_xtablet.EraserDevice = NULL;
+			m_xtablet.CommonData.Active= GHOST_kTabletModeNone;
+
+			/* Install our error handler to override Xlib's termination behavior */
+			old_handler = XSetErrorHandler(ApplicationErrorHandler) ;
+
+			for(int i=0; i<device_count; ++i) {
+				char *device_type = device_info[i].type ? XGetAtomName(m_display, device_info[i].type) : NULL;
+				
+				printf("Tablet type:'%s', name:'%s', index:%d\n", device_type, device_info[i].name, i);
+
+
+				if(m_xtablet.StylusDevice==NULL && is_stylus(device_info[i].name, device_type)) {
+					printf("\tfound stylus\n");
+					m_xtablet.StylusID= device_info[i].id;
+					m_xtablet.StylusDevice = XOpenDevice(m_display, m_xtablet.StylusID);
+
+					if (m_xtablet.StylusDevice != NULL) {
+						/* Find how many pressure levels tablet has */
+						XAnyClassPtr ici = device_info[i].inputclassinfo;
+						for(int j=0; j<m_xtablet.StylusDevice->num_classes; ++j) {
+							if(ici->c_class==ValuatorClass) {
+								printf("\t\tfound ValuatorClass\n");
+								XValuatorInfo* xvi = (XValuatorInfo*)ici;
+								m_xtablet.PressureLevels = xvi->axes[2].max_value;
+							
+								/* this is assuming that the tablet has the same tilt resolution in both
+								 * positive and negative directions. It would be rather weird if it didn't.. */
+								m_xtablet.XtiltLevels = xvi->axes[3].max_value;
+								m_xtablet.YtiltLevels = xvi->axes[4].max_value;
+								break;
+							}
+						
+							ici = (XAnyClassPtr)(((char *)ici) + ici->length);
+						}

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list