8000 FIX: port the key handling changes from mpl · matplotlib/ipympl@b38e8aa · GitHub
[go: up one dir, main page]

Skip to content

Commit b38e8aa

Browse files
committed
FIX: port the key handling changes from mpl
ports changes from matplotlib/matplotlib#19146 closes #309
1 parent 7301e67 commit b38e8aa

File tree

2 files changed

+72
-10
lines changed

2 files changed

+72
-10
lines changed

ipympl/backend_nbagg.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
default
1313
)
1414

15+
import matplotlib
1516
from matplotlib import rcParams
1617
from matplotlib.figure import Figure
1718
from matplotlib import is_interactive
@@ -241,6 +242,69 @@ def send_binary(self, data):
241242
def new_timer(self, *args, **kwargs):
242243
return TimerTornado(*args, **kwargs)
243244

245+
if matplotlib.__version__ < '3.4':
246+
# backport the Python side changes to match the js changes
247+
def _handle_key(self, event):
248+
_SPECIAL_KEYS_LUT = {'Alt': 'alt',
249+
'AltGraph': 'alt',
250+
'CapsLock': 'caps_lock',
251+
'Control': 'control',
252+
'Meta': 'meta',
253+
'NumLock': 'num_lock',
254+
'ScrollLock': 'scroll_lock',
255+
'Shift': 'shift',
256+
'Super': 'super',
257+
'Enter': 'enter',
258+
'Tab': 'tab',
259+
'ArrowDown': 'down',
260+
'ArrowLeft': 'left',
261+
'ArrowRight': 'right',
262+
'ArrowUp': 'up',
263+
'End': 'end',
264+
'Home': 'home',
265+
'PageDown': 'pagedown',
266+
'PageUp': 'pageup',
267+
'Backspace': 'backspace',
268+
'Delete': 'delete',
269+
'Insert': 'insert',
270+
'Escape': 'escape',
271+
'Pause': 'pause',
272+
'Select': 'select',
273+
'Dead': 'dead',
274+
'F1': 'f1',
275+
'F2': 'f2',
276+
'F3': 'f3',
277+
'F4': 'f4',
278+
'F5': 'f5',
279+
'F6': 'f6',
280+
'F7': 'f7',
281+
'F8': 'f8',
282+
'F9': 'f9',
283+
'F10': 'f10',
284+
'F11': 'f11',
285+
'F12': 'f12'}
286+
287+
288+
def handle_key(key):
289+
"""Handle key values"""
290+
value = key[key.index('k') + 1:]
291+
if 'shift+' in key:
292+
if len(value) == 1:
293+
key = key.replace('shift+', '')
294+
if value in _SPECIAL_KEYS_LUT:
295+
value = _SPECIAL_KEYS_LUT[value]
296+
key = key[:key.index('k')] + value
297+
return key
298+
299+
key = handle_key(event['key'])
300+
e_type = event['type']
301+
guiEvent = event.get('guiEvent', None)
302+
if e_type == 'key_press':
303+
self.key_press_event(key, guiEvent=guiEvent)
304+
elif e_type == 'key_release':
305+
self.key_release_event(key, guiEvent=guiEvent)
306+
handle_key_press = handle_key_release = _handle_key
307+
244308

245309
class FigureManager(FigureManagerWebAgg):
246310
ToolbarCls = Toolbar

js/src/mpl_widget.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -644,31 +644,29 @@ export class MPLCanvasView extends widgets.DOMWidgetView {
644644
event.preventDefault();
645645

646646
// Prevent repeat events
647-
if (name == 'key_press') {
648-
if (event.which === this._key) {
647+
if (name === 'key_press') {
648+
if (event.key === this._key) {
649649
return;
650650
} else {
651-
this._key = event.which;
651+
this._key = event.key;
652652
}
653653
}
654-
if (name == 'key_release') {
654+
if (name === 'key_release') {
655655
this._key = null;
656656
}
657657

658658
var value = '';
659-
if (event.ctrlKey && event.which != 17) {
659+
if (event.ctrlKey && event.key !== 'Control') {
660660
value += 'ctrl+';
661661
}
662-
if (event.altKey && event.which != 18) {
662+
else if (event.altKey && event.key !== 'Alt') {
663663
value += 'alt+';
664664
}
665-
if (event.shiftKey && event.which != 16) {
665+
else if (event.shiftKey && event.key !== 'Shift') {
666666
value += 'shift+';
667667
}
668668

669-
value += 'k';
670-
value += event.which.toString();
671-
669+
value += 'k' + event.key;
672670
this.model.send_message(name, {
673671
key: value,
674672
guiEvent: utils.get_simple_keys(event),

0 commit comments

Comments
 (0)
0