@@ -255,33 +255,36 @@ def maybe_make_numpad_key(candidate: str) -> Optional[Key]:
255
255
256
256
def maybe_make_shifted_key (candidate : str ) -> Optional [Key ]:
257
257
codes = (
258
- (30 , ('EXCLAIM' , 'EXLM' , '!' )),
259
- (31 , ('AT' , '@' )),
260
- (32 , ('HASH' , 'POUND' , '#' )),
261
- (33 , ('DOLLAR' , 'DLR' , '$' )),
262
- (34 , ('PERCENT' , 'PERC' , '%' )),
263
- (35 , ('CIRCUMFLEX' , 'CIRC' , '^' )),
264
- (36 , ('AMPERSAND' , 'AMPR' , '&' )),
265
- (37 , ('ASTERISK' , 'ASTR' , '*' )),
266
- (38 , ('LEFT_PAREN' , 'LPRN' , '(' )),
267
- (39 , ('RIGHT_PAREN' , 'RPRN' , ')' )),
268
- (45 , ('UNDERSCORE' , 'UNDS' , '_' )),
269
- (46 , ('PLUS' , '+' )),
270
- (47 , ('LEFT_CURLY_BRACE' , 'LCBR' , '{' )),
271
- (48 , ('RIGHT_CURLY_BRACE' , 'RCBR' , '}' )),
272
- (49 , ('PIPE' , '|' )),
273
- (51 , ('COLON' , 'COLN' , ':' )),
274
- (52 , ('DOUBLE_QUOTE' , 'DQUO' , 'DQT' , '"' )),
275
- (53 , ('TILDE' , 'TILD' , '~' )),
276
- (54 , ('LEFT_ANGLE_BRACKET' , 'LABK' , '<' )),
277
- (55 , ('RIGHT_ANGLE_BRACKET' , 'RABK' , '>' )),
278
- (56 , ('QUESTION' , 'QUES' , '?' )),
258
+ ('1' , ('EXCLAIM' , 'EXLM' , '!' )),
259
+ ('2' , ('AT' , '@' )),
260
+ ('3' , ('HASH' , 'POUND' , '#' )),
261
+ ('4' , ('DOLLAR' , 'DLR' , '$' )),
262
+ ('5' , ('PERCENT' , 'PERC' , '%' )),
263
+ ('6' , ('CIRCUMFLEX' , 'CIRC' , '^' )),
264
+ ('7' , ('AMPERSAND' , 'AMPR' , '&' )),
265
+ ('8' , ('ASTERISK' , 'ASTR' , '*' )),
266
+ ('9' , ('LEFT_PAREN' , 'LPRN' , '(' )),
267
+ ('0' , ('RIGHT_PAREN' , 'RPRN' , ')' )),
268
+ ('-' , ('UNDERSCORE' , 'UNDS' , '_' )),
269
+ ('=' , ('PLUS' , '+' )),
270
+ ('[' , ('LEFT_CURLY_BRACE' , 'LCBR' , '{' )),
271
+ (']' , ('RIGHT_CURLY_BRACE' , 'RCBR' , '}' )),
272
+ (' \\ ' , ('PIPE' , '|' )),
273
+ (';' , ('COLON' , 'COLN' , ':' )),
274
+ ("'" , ('DOUBLE_QUOTE' , 'DQUO' , 'DQT' , '"' )),
275
+ ('`' , ('TILDE' , 'TILD' , '~' )),
276
+ (',' , ('LEFT_ANGLE_BRACKET' , 'LABK' , '<' )),
277
+ ('.' , ('RIGHT_ANGLE_BRACKET' , 'RABK' , '>' )),
278
+ ('/' , ('QUESTION' , 'QUES' , '?' )),
279
279
)
280
280
281
- for code , names in codes :
281
+ for unshifted , names in codes :
282
282
if candidate in names :
283
283
return make_key (
284
- names = names , constructor = ModifiedKey , code = code , modifier = KC .LSFT
284
+ names = names ,
285
+ constructor = ModifiedKey ,
286
+ code = KC [unshifted ],
287
+ modifier = KC .LSFT ,
285
288
)
286
289
287
290
@@ -430,15 +433,19 @@ def __repr__(self):
430
433
return super ().__repr__ () + '(code=' + str (self .code ) + ')'
431
434
432
435
def on_press (self , keyboard : Keyboard , coord_int : Optional [int ] = None ) -> None :
433
- keyboard .hid_pending = True
434
- keyboard .keys_pressed .add (self )
435
436
if keyboard .implicit_modifier is not None :
436
437
keyboard .keys_pressed .discard (keyboard .implicit_modifier )
437
438
keyboard .implicit_modifier = None
439
+ if self in keyboard .keys_pressed :
440
+ keyboard .keys_pressed .discard (self )
441
+ keyboard .hid_pending = True
442
+ keyboard ._send_hid ()
443
+ keyboard .keys_pressed .add (self )
444
+ keyboard .hid_pending = True
438
445
439
446
def on_release (self , keyboard : Keyboard , coord_int : Optional [int ] = None ) -> None :
440
- keyboard .hid_pending = True
441
447
keyboard .keys_pressed .discard (self )
448
+ keyboard .hid_pending = True
442
449
443
450
444
451
class KeyboardKey (_DefaultKey ):
@@ -483,19 +490,24 @@ def __init__(self, code: [Key, int], modifier: [ModifierKey]):
483
490
self .modifier = modifier
484
491
485
492
def on_press (self , keyboard : Keyboard , coord_int : Optional [int ] = None ) -> None :
486
- self .modifier .on_press (keyboard , coord_int )
493
+ if self .key in keyboard .keys_pressed :
494
+ self .key .on_release (keyboard , coord_int )
495
+ keyboard ._send_hid ()
496
+ keyboard .keys_pressed .add (self .modifier )
487
497
if self .key is not None :
488
498
self .key .on_press (keyboard , coord_int )
489
499
if keyboard .implicit_modifier is not None :
490
- keyboard .implicit_modifier . on_release (keyboard , coord_int )
500
+ keyboard .keys_pressed . discard (keyboard . implicit_modifier )
491
501
keyboard .implicit_modifier = self .modifier
502
+ keyboard .hid_pending = True
492
503
493
504
def on_release (self , keyboard : Keyboard , coord_int : Optional [int ] = None ) -> None :
494
- self . modifier . on_release ( keyboard , coord_int )
505
+ keyboard . keys_pressed . discard ( self . modifier )
495
506
if self .key is not None :
496
507
self .key .on_release (keyboard , coord_int )
497
508
if keyboard .implicit_modifier == self .modifier :
498
509
keyboard .implicit_modifier = None
510
+ keyboard .hid_pending = True
499
511
500
512
def __repr__ (self ):
501
513
return (
0 commit comments