[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