Opened 5 years ago

Closed 5 years ago

#3374 closed defect (fixed)

Touch event key modifiers

Reported by: Tristan Croll Owned by: Tristan Croll
Priority: normal Milestone:
Component: UI Version:
Keywords: Cc: Tom Goddard
Blocked By: Blocking:
Notify when closed: Platform: all
Project: ChimeraX

Description

The following bug report has been submitted:
Platform:        Darwin-18.7.0-x86_64-i386-64bit
ChimeraX Version: 1.0rc202005292300 (2020-05-29 23:00:06 UTC)
Description
Sorry for the long, repetitive log. Added a logging line to the key_modifiers method in mousemodes.py to probe why modifier keys weren't working. The upshot is that QTouchEvent.modifiers() always reports no modifier keys, no matter what keys are pressed.

Found a bug report (unresolved since 2017): https://bugreports.qt.io/browse/QTBUG-60389
This could be worked around fairly trivially with the `keyboard` or `pynput` modules, but neither of these are currently installed in ChimeraX. Somewhat surprisingly, so far I haven't found any "pure Python" solution for detecting which keys are currently pressed. 

Log:
UCSF ChimeraX version: 1.0rc202005292300 (2020-05-29)  
© 2016-2020 Regents of the University of California. All rights reserved.  
How to cite UCSF ChimeraX  
Successfully installed 'ChimeraX_MouseModes-1.0-py3-none-any.whl'  
Looking in indexes: https://pypi.org/simple,
https://cxtoolshed.rbvi.ucsf.edu/pypi/  
Processing
/Users/tic20/Library/Caches/ChimeraX/1.0/installers/ChimeraX_MouseModes-1.0-py3-none-
any.whl  
Requirement already satisfied, skipping upgrade: ChimeraX-Core~=1.0rc1 in
/Applications/ChimeraX.app/Contents/lib/python3.7/site-packages (from
ChimeraX-MouseModes==1.0) (1.0rc202005292300)  
Requirement already satisfied, skipping upgrade: ChimeraX-Geometry~=1.0 in
/Applications/ChimeraX.app/Contents/lib/python3.7/site-packages (from
ChimeraX-MouseModes==1.0) (1.0)  
Requirement already satisfied, skipping upgrade: ChimeraX-Graphics~=1.0 in
/Applications/ChimeraX.app/Contents/lib/python3.7/site-packages (from
ChimeraX-MouseModes==1.0) (1.0)  
Requirement already satisfied, skipping upgrade: ChimeraX-Arrays~=1.0 in
/Applications/ChimeraX.app/Contents/lib/python3.7/site-packages (from
ChimeraX-Geometry~=1.0->ChimeraX-MouseModes==1.0) (1.0)  
Installing collected packages: ChimeraX-MouseModes  
Attempting uninstall: ChimeraX-MouseModes  
Found existing installation: ChimeraX-MouseModes 1.0  
Uninstalling ChimeraX-MouseModes-1.0:  
Successfully uninstalled ChimeraX-MouseModes-1.0  
Successfully installed ChimeraX-MouseModes-1.0  
Lock 4654277456 acquired on
/Users/tic20/Library/Caches/ChimeraX/1.0/toolshed/bundle_info.cache.lock  
Lock 4654277456 released on
/Users/tic20/Library/Caches/ChimeraX/1.0/toolshed/bundle_info.cache.lock  
  

WARNING: You are using pip version 20.1; however, version 20.1.1 is available.  
You should consider upgrading via the
'/Applications/ChimeraX.app/Contents/MacOS/ChimeraX -m pip install --upgrade
pip' command.  
  

> open /Users/tic20/Documents/Refine_1/1a0m_refine_1.cif format mmcif

Summary of feedback from opening
/Users/tic20/Documents/Refine_1/1a0m_refine_1.cif  
---  
warnings | Skipping chem_comp category: Missing column 'type' near line 211  
Missing entity information. Treating each chain as a separate entity.  
Missing second residue in struct_conn "C00001"  
Missing second residue in struct_conn "C00002"  
Missing second residue in struct_conn "C00003"  
Missing second residue in struct_conn "C00004"  
Invalid residue range for struct_conf "3": invalid entity "B", near line 143  
Missing or incomplete entity_poly_seq table. Inferred polymer connectivity.  
Skipping chem_comp category: Missing column 'type' near line 576  
  
Chain information for 1a0m_refine_1.cif #1  
---  
Chain | Description  
A | No description available  
B | No description available  
  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QWheelEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
Registered touch event:  
modifer keys pressed:  
wheel_value: -0.3422024965286255  
two_finger_trans: (-0.0031776407912925443, -0.010060119689614686)  
two_finger_scale: None  
two_finger_twist: None  
three_finger_trans: None  
four_finger_trans: None  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>: shift  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>: shift  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
Registered touch event:  
modifer keys pressed:  
wheel_value: -0.23372330665588378  
two_finger_trans: (0.0026435852809636685, -0.006871032394744733)  
two_finger_scale: None  
two_finger_twist: None  
three_finger_trans: None  
four_finger_trans: None  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
Registered touch event:  
modifer keys pressed:  
wheel_value: -0.0542396068572998  
two_finger_trans: (0.0, -0.001594543997888212)  
two_finger_scale: None  
two_finger_twist: None  
three_finger_trans: None  
four_finger_trans: None  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QTouchEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x12836ded0>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e9ab0f0>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  
<PyQt5.QtGui.QMouseEvent object at 0x11e8f4550>,
<PyQt5.QtCore.Qt.KeyboardModifiers object at 0x11e9db050>:  




OpenGL version: 4.1 INTEL-12.10.12
OpenGL renderer: Intel(R) HD Graphics 6000
OpenGL vendor: Intel Inc.Hardware:

    Hardware Overview:

      Model Name: MacBook Air
      Model Identifier: MacBookAir7,2
      Processor Name: Intel Core i5
      Processor Speed: 1.6 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 3 MB
      Hyper-Threading Technology: Enabled
      Memory: 8 GB
      Boot ROM Version: 188.0.0.0.0
      SMC Version (system): 2.27f2

Software:

    System Software Overview:

      System Version: macOS 10.14.6 (18G95)
      Kernel Version: Darwin 18.7.0
      Time since boot: 73 days 23:56

Graphics/Displays:

    Intel HD Graphics 6000:

      Chipset Model: Intel HD Graphics 6000
      Type: GPU
      Bus: Built-In
      VRAM (Dynamic, Max): 1536 MB
      Vendor: Intel
      Device ID: 0x1626
      Revision ID: 0x0009
      Metal: Supported, feature set macOS GPUFamily1 v4
      Displays:
        Color LCD:
          Display Type: LCD
          Resolution: 1440 x 900 (Widescreen eXtended Graphics Array Plus)
          UI Looks like: 1440 x 900
          Framebuffer Depth: 24-Bit Color (ARGB8888)
          Main Display: Yes
          Mirror: Off
          Online: Yes
          Rotation: Supported
          Automatically Adjust Brightness: No
          Connection Type: DisplayPort

PyQt version: 5.12.3
Compiled Qt version: 5.12.4
Runtime Qt version: 5.12.8

Attachments (1)

mousemodes.diff (32.5 KB ) - added by Tristan Croll 5 years ago.
Added by email2trac

Download all attachments as: .zip

Change History (12)

in reply to:  1 ; comment:1 by Tristan Croll, 5 years ago

... or not. The `keyboard` module has to be run as administrator to do 
anything useful, which is just ridiculous.

On 2020-06-08 12:14, ChimeraX wrote:

in reply to:  2 ; comment:2 by Tristan Croll, 5 years ago

... and while pynput "works", it's clearly doing something that Apple 
considers illegal. While the below snippet correctly reports the 
currently-pressed function keys to the log:

{{{
class FunctionKeyCombo:
     def __init__(self):
         self._current_keys = set()
         import pynput
         self._listener = 
pynput.keyboard.Listener(on_press=self._on_press, 
on_release=self._on_release)
         self._listener.start()
     def _on_press(self, key):
         self._current_keys.add(key)
         self.print_current_keys()
     def _on_release(self, key):
         self._current_keys.discard(key)
         self.print_current_keys()
     def print_current_keys(self):
         print('Currently pressed: {}'.format(
             ', '.join(str(k) for k in self._current_keys)))


fc = FunctionKeyCombo()
}}}

... the following message gets printed to stderr when it starts:

{{{
ChimeraX[11511:10724218] pid(11511)/euid(501) is calling TIS/TSM in 
non-main thread environment, ERROR : This is NOT allowed. Please call 
TIS/TSM in main thread!!!
}}}

So I can't see a simple solution to this. What a pain.


On 2020-06-08 12:23, ChimeraX wrote:

comment:3 by pett, 5 years ago

Cc: Tom Goddard added
Component: UnassignedUI
Owner: set to Tristan Croll
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionTouch event key modifiers

comment:4 by Tom Goddard, 5 years ago

There is a Qt API that tells you the keyboard modifiers that are down right now, independent of any Event. That could be used as a work-around. I don't remember the API, maybe part of QApplication.

comment:5 by pett, 5 years ago

It may not be good enough if event processing is slow, but it might be good enough. The API is Qt::KeyboardModifiers QGuiApplication::keyboardModifiers()

https://doc.qt.io/qt-5/qguiapplication.html#keyboardModifiers

in reply to:  6 ; comment:6 by Tristan Croll, 5 years ago

So believe it or not, `session.ui.keyboardModifiers` *also* lies (always 
returns 0) when used during processing of a multitouch event (but not a 
standard mouse event). Heaven only knows why... The good news is that 
`session.ui.queryKeyboardModifiers` does tell the truth (the difference 
between the two is that `keyboardModifiers` queries the state of a 
running tally that's updated in response to `KeyPress` and `KeyRelease` 
events, whereas `queryKeyboardModifiers` actually queries the state of 
the keyboard from scratch.

Anyway, back in business...

On 2020-06-08 17:06, ChimeraX wrote:

comment:7 by pett, 5 years ago

Well there you go, easy peasy. What's with all the complaining? ;-)

in reply to:  8 ; comment:8 by Tristan Croll, 5 years ago

Heh. I get a bit twitchy when things that *should* be trivial turn out 
to be... not so much.

On 2020-06-09 17:17, ChimeraX wrote:

in reply to:  9 ; comment:9 by Tristan Croll, 5 years ago

OK, this replicates all the two- and three-finger behaviour of the 
original implementation, and my logging says it's correctly applying the 
modifier keys (although I haven't tried actually registering a 
multitouch+modifier mode yet). I haven't yet done the 4-finger swipe 
(which in the original triggered whatever MouseMode was currently mapped 
to the mouse wheel). If you want to keep that behaviour, I think the 
simplest way to do so would be to create a minimal MouseMode to catch 
the 4-finger swipe event and pass it on.

On 2020-06-09 17:22, ChimeraX wrote:

mousemodes.diff

by Tristan Croll, 5 years ago

Attachment: mousemodes.diff added

Added by email2trac

in reply to:  11 comment:10 by Tristan Croll, 5 years ago

Sorry... just realised I sent this to the wrong ticket. Will repost to 
the older one.

On 2020-06-09 18:11, ChimeraX wrote:

comment:11 by Tristan Croll, 5 years ago

Resolution: fixed
Status: assignedclosed

All seems to be working now.

Note: See TracTickets for help on using tickets.