[Bf-blender-cvs] [2e9d5ba2115] master: GHOST: bundle tablet data with GHOST event

Brecht Van Lommel noreply at git.blender.org
Tue Jan 21 12:30:27 CET 2020


Commit: 2e9d5ba2115ceabdc0e8cb2eaa148c81d7b04667
Author: Brecht Van Lommel
Date:   Thu Oct 31 15:56:56 2019 +0100
Branches: master
https://developer.blender.org/rB2e9d5ba2115ceabdc0e8cb2eaa148c81d7b04667

GHOST: bundle tablet data with GHOST event

Previously the window manager would receive the GHOST event and then query the
latest tablet data from the window to go along with it. If multiple events were
queued, it would then use too new tablet data for handling older events.

Fixes T62565: tablet pressure not working on macOS with some devices

===================================================================

M	intern/ghost/GHOST_IWindow.h
M	intern/ghost/GHOST_Types.h
M	intern/ghost/intern/GHOST_C-api.cpp
M	intern/ghost/intern/GHOST_EventButton.h
M	intern/ghost/intern/GHOST_EventCursor.h
M	intern/ghost/intern/GHOST_SystemCocoa.mm
M	intern/ghost/intern/GHOST_SystemWin32.cpp
M	intern/ghost/intern/GHOST_SystemX11.cpp
M	intern/ghost/intern/GHOST_WindowCocoa.h
M	intern/ghost/intern/GHOST_WindowCocoa.mm
M	intern/ghost/intern/GHOST_WindowNULL.h
M	intern/ghost/intern/GHOST_WindowSDL.h
M	intern/ghost/intern/GHOST_WindowWin32.cpp
M	intern/ghost/intern/GHOST_WindowWin32.h
M	intern/ghost/intern/GHOST_WindowX11.cpp
M	intern/ghost/intern/GHOST_WindowX11.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/wm_event_system.h

===================================================================

diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h
index c19d4bdf6bd..07133d86ce4 100644
--- a/intern/ghost/GHOST_IWindow.h
+++ b/intern/ghost/GHOST_IWindow.h
@@ -247,7 +247,11 @@ class GHOST_IWindow {
    * Returns the tablet data (pressure etc).
    * \return The tablet data (pressure etc).
    */
-  virtual const GHOST_TabletData *GetTabletData() = 0;
+  virtual const GHOST_TabletData &GetTabletData()
+  {
+    /* Default state when no tablet is used, for systems without tablet support. */
+    return GHOST_TABLET_DATA_DEFAULT;
+  }
 
   /***************************************************************************************
    * Progress bar functionality
diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index fab315e5f13..c7c9f91a361 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -101,6 +101,12 @@ typedef struct GHOST_TabletData {
   float Ytilt; /* as above */
 } GHOST_TabletData;
 
+static const GHOST_TabletData GHOST_TABLET_DATA_DEFAULT = {
+    GHOST_kTabletModeNone, /* No tablet connected. */
+    1.0f,                  /* Pressure */
+    0.0f,                  /* Xtilt */
+    0.0f};                 /* Ytilt */
+
 typedef enum {
   GHOST_kNotVisible = 0,
   GHOST_kPartiallyVisible,
@@ -409,11 +415,15 @@ typedef struct {
   GHOST_TInt32 x;
   /** The y-coordinate of the cursor position. */
   GHOST_TInt32 y;
+  /** Associated tablet data. */
+  GHOST_TabletData tablet;
 } GHOST_TEventCursorData;
 
 typedef struct {
   /** The mask of the mouse button. */
   GHOST_TButtonMask button;
+  /** Associated tablet data. */
+  GHOST_TabletData tablet;
 } GHOST_TEventButtonData;
 
 typedef struct {
diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 1bed7afdfc4..3c3860bd2c0 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -708,7 +708,7 @@ void GHOST_SetTabletAPI(GHOST_SystemHandle systemhandle, GHOST_TTabletAPI api)
 
 const GHOST_TabletData *GHOST_GetTabletData(GHOST_WindowHandle windowhandle)
 {
-  return ((GHOST_IWindow *)windowhandle)->GetTabletData();
+  return &((GHOST_IWindow *)windowhandle)->GetTabletData();
 }
 
 GHOST_TInt32 GHOST_GetWidthRectangle(GHOST_RectangleHandle rectanglehandle)
diff --git a/intern/ghost/intern/GHOST_EventButton.h b/intern/ghost/intern/GHOST_EventButton.h
index da1dc929f4f..0f9d3b7e6bc 100644
--- a/intern/ghost/intern/GHOST_EventButton.h
+++ b/intern/ghost/intern/GHOST_EventButton.h
@@ -46,6 +46,7 @@ class GHOST_EventButton : public GHOST_Event {
       : GHOST_Event(time, type, window)
   {
     m_buttonEventData.button = button;
+    m_buttonEventData.tablet = window->GetTabletData();
     m_data = &m_buttonEventData;
   }
 
diff --git a/intern/ghost/intern/GHOST_EventCursor.h b/intern/ghost/intern/GHOST_EventCursor.h
index ac40f78569d..41597db216a 100644
--- a/intern/ghost/intern/GHOST_EventCursor.h
+++ b/intern/ghost/intern/GHOST_EventCursor.h
@@ -48,6 +48,7 @@ class GHOST_EventCursor : public GHOST_Event {
   {
     m_cursorEventData.x = x;
     m_cursorEventData.y = y;
+    m_cursorEventData.tablet = window->GetTabletData();
     m_data = &m_cursorEventData;
   }
 
diff --git a/intern/ghost/intern/GHOST_SystemCocoa.mm b/intern/ghost/intern/GHOST_SystemCocoa.mm
index 2f597aee476..e50e478b9fc 100644
--- a/intern/ghost/intern/GHOST_SystemCocoa.mm
+++ b/intern/ghost/intern/GHOST_SystemCocoa.mm
@@ -1451,11 +1451,10 @@ GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventT
       break;
 
     case NSEventTypeTabletProximity:
-      ct.Pressure = 0;
-      ct.Xtilt = 0;
-      ct.Ytilt = 0;
+      /* Reset tablet data when device enters proximity or leaves. */
+      ct = GHOST_TABLET_DATA_DEFAULT;
       if ([event isEnteringProximity]) {
-        // pointer is entering tablet area proximity
+        /* Pointer is entering tablet area proximity. */
         switch ([event pointingDeviceType]) {
           case NSPointingDeviceTypePen:
             ct.Active = GHOST_kTabletModeStylus;
@@ -1466,14 +1465,9 @@ GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventT
           case NSPointingDeviceTypeCursor:
           case NSPointingDeviceTypeUnknown:
           default:
-            ct.Active = GHOST_kTabletModeNone;
             break;
         }
       }
-      else {
-        // pointer is leaving - return to mouse
-        ct.Active = GHOST_kTabletModeNone;
-      }
       break;
 
     default:
@@ -1524,46 +1518,45 @@ GHOST_TSuccess GHOST_SystemCocoa::handleMouseEvent(void *eventPtr)
 
   switch ([event type]) {
     case NSEventTypeLeftMouseDown:
+      handleTabletEvent(event);  // Update window tablet state to be included in event.
       pushEvent(new GHOST_EventButton(
           [event timestamp] * 1000, GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft));
-      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       break;
     case NSEventTypeRightMouseDown:
+      handleTabletEvent(event);  // Update window tablet state to be included in event.
       pushEvent(new GHOST_EventButton(
           [event timestamp] * 1000, GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight));
-      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       break;
     case NSEventTypeOtherMouseDown:
+      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       pushEvent(new GHOST_EventButton([event timestamp] * 1000,
                                       GHOST_kEventButtonDown,
                                       window,
                                       convertButton([event buttonNumber])));
-      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       break;
 
     case NSEventTypeLeftMouseUp:
+      handleTabletEvent(event);  // Update window tablet state to be included in event.
       pushEvent(new GHOST_EventButton(
           [event timestamp] * 1000, GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft));
-      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       break;
     case NSEventTypeRightMouseUp:
+      handleTabletEvent(event);  // Update window tablet state to be included in event.
       pushEvent(new GHOST_EventButton(
           [event timestamp] * 1000, GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight));
-      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       break;
     case NSEventTypeOtherMouseUp:
+      handleTabletEvent(event);  // Update window tablet state to be included in event.
       pushEvent(new GHOST_EventButton([event timestamp] * 1000,
                                       GHOST_kEventButtonUp,
                                       window,
                                       convertButton([event buttonNumber])));
-      handleTabletEvent(event);  // Handle tablet events combined with mouse events
       break;
 
     case NSEventTypeLeftMouseDragged:
     case NSEventTypeRightMouseDragged:
     case NSEventTypeOtherMouseDragged:
-      // Handle tablet events combined with mouse events
-      handleTabletEvent(event);
+      handleTabletEvent(event);  // Update window tablet state to be included in event.
 
     case NSEventTypeMouseMoved: {
       GHOST_TGrabCursorMode grab_mode = window->getCursorGrabMode();
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index fa2fc9fff37..31a6ea96bc3 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -894,6 +894,7 @@ GHOST_Event *GHOST_SystemWin32::processPointerEvent(GHOST_TEventType type,
 
   switch (type) {
     case GHOST_kEventButtonDown:
+      /* Update window tablet data to be included in event. */
       window->setTabletData(&pointerInfo.tabletData);
       eventHandled = true;
       return new GHOST_EventButton(
@@ -903,6 +904,7 @@ GHOST_Event *GHOST_SystemWin32::processPointerEvent(GHOST_TEventType type,
       return new GHOST_EventButton(
           system->getMilliSeconds(), GHOST_kEventButtonUp, window, pointerInfo.buttonMask);
     case GHOST_kEventCursorMove:
+      /* Update window tablet data to be included in event. */
       window->setTabletData(&pointerInfo.tabletData);
       eventHandled = true;
       return new GHOST_EventCursor(system->getMilliSeconds(),
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index c50ff8e7426..f15641352e0 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -823,7 +823,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
    * in the future we could have a ghost call window->CheckTabletProximity()
    * but for now enough parts of the code are checking 'Active'
    * - campbell */
-  if (window->GetTabletData()->Active != GHOST_kTabletModeNone) {
+  if (window->GetTabletData().Active != GHOST_kTabletModeNone) {
     bool any_proximity = false;
 
     for (GHOST_TabletX11 &xtablet : m_xtablets) {
@@ -834,7 +834,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
 
     if (!any_proximity) {
       // printf("proximity disable\n");
-      window->GetTabletData()->Active = GHOST_kTabletModeNone;
+      window->GetTabletData().Active = GHOST_kTabletModeNone;
     }
   }
 #endif /* WITH_X11_XINPUT */
@@ -855,7 +855,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
       XMotionEvent &xme = xe->xmotion;
 
 #ifdef WITH_X11_XINPUT
-      bool is_tablet = window->GetTabletData()->Active != GHOST_kTabletModeNone;
+      bool is_tablet = window->GetTabletData().Active != GHOST_kTabletModeNone;
 #else
       bool is_tablet = false;
 #endif
@@ -1395,7 +1395,7 @@ void GHOST_SystemX11::processEvent(XEvent *xe)
           /* stroke might begin without leading ProxyIn event,
            * this happens when window is opened when stylus is already hovering
            * around tablet surface */
-          window->GetTabletData()->Active = xtablet.mode;
+          window->GetTabletData().Active = xtablet.mode;
 
           /* Note: This event might be generated with incomplete dataset
       

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list