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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to