[Bf-blender-cvs] [e230ccaf8c3] master: Fix Wintab button tracking logic.

Nicholas Rishel noreply at git.blender.org
Sat Jun 4 18:41:04 CEST 2022


Commit: e230ccaf8c3b62f8c1a322d525084226136578ba
Author: Nicholas Rishel
Date:   Fri May 6 23:33:59 2022 -0700
Branches: master
https://developer.blender.org/rBe230ccaf8c3b62f8c1a322d525084226136578ba

Fix Wintab button tracking logic.

Shifted flag for buttons changed was incorrectly compared with
unshifted packet flag to determine button press state.

Also fix button tracking storage; button flags are 32 bits whereas the
member variable was 8.

Differential Revision: https://developer.blender.org/D14915

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

M	intern/ghost/intern/GHOST_Wintab.cpp
M	intern/ghost/intern/GHOST_Wintab.h

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

diff --git a/intern/ghost/intern/GHOST_Wintab.cpp b/intern/ghost/intern/GHOST_Wintab.cpp
index 974a07db9c3..b136acbe098 100644
--- a/intern/ghost/intern/GHOST_Wintab.cpp
+++ b/intern/ghost/intern/GHOST_Wintab.cpp
@@ -310,7 +310,7 @@ void GHOST_Wintab::getInput(std::vector<GHOST_WintabInfoWin32> &outWintabInfo)
   outWintabInfo.reserve(numPackets);
 
   for (int i = 0; i < numPackets; i++) {
-    PACKET pkt = m_pkts[i];
+    const PACKET pkt = m_pkts[i];
     GHOST_WintabInfoWin32 out;
 
     /* % 3 for multiple devices ("DualTrack"). */
@@ -367,11 +367,12 @@ void GHOST_Wintab::getInput(std::vector<GHOST_WintabInfoWin32> &outWintabInfo)
     /* Some Wintab libraries don't handle relative button input, so we track button presses
      * manually. */
     DWORD buttonsChanged = m_buttons ^ pkt.pkButtons;
-    WORD buttonIndex = 0;
+    /* We only needed the prior button state to compare to current, so we can overwrite it now. */
+    m_buttons = pkt.pkButtons;
 
-    while (buttonsChanged) {
+    /* Iterate over button flag indices until all flags are clear. */
+    for (WORD buttonIndex = 0; buttonsChanged; buttonIndex++, buttonsChanged >>= 1) {
       if (buttonsChanged & 1) {
-        /* Find the index for the changed button from the button map. */
         GHOST_TButtonMask button = mapWintabToGhostButton(pkt.pkCursor, buttonIndex);
 
         if (button != GHOST_kButtonMaskNone) {
@@ -381,15 +382,11 @@ void GHOST_Wintab::getInput(std::vector<GHOST_WintabInfoWin32> &outWintabInfo)
           }
 
           out.button = button;
-          out.type = buttonsChanged & pkt.pkButtons ? GHOST_kEventButtonDown :
-                                                      GHOST_kEventButtonUp;
-        }
 
-        m_buttons ^= 1 << buttonIndex;
+          DWORD buttonFlag = 1 << buttonIndex;
+          out.type = pkt.pkButtons & buttonFlag ? GHOST_kEventButtonDown : GHOST_kEventButtonUp;
+        }
       }
-
-      buttonsChanged >>= 1;
-      buttonIndex++;
     }
 
     outWintabInfo.push_back(out);
diff --git a/intern/ghost/intern/GHOST_Wintab.h b/intern/ghost/intern/GHOST_Wintab.h
index 86a0143ecc0..80eacf1f3fa 100644
--- a/intern/ghost/intern/GHOST_Wintab.h
+++ b/intern/ghost/intern/GHOST_Wintab.h
@@ -187,7 +187,7 @@ class GHOST_Wintab {
   bool m_focused = false;
 
   /** Pressed button map. */
-  uint8_t m_buttons = 0;
+  DWORD m_buttons = 0;
 
   /** Range of a coordinate space. */
   struct Range {



More information about the Bf-blender-cvs mailing list