[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