web-dev-qa-db-fra.com

Les raccourcis clavier cessent de fonctionner par intermittence

edit: Comme on peut le voir dans la réponse, cela n'avait en réalité rien à voir avec la mise en veille ou l'hibernation, mais plutôt avec le fait que je fermais souvent la fenêtre de l'application (ce qui déclenchait le bogue) avant de partir. en veille la plupart du temps.

J'ai vu plusieurs personnes signaler cela à différents endroits sur le net, sans aucune solution, mais je pensais ajouter le mien dans tous les cas:

Très souvent, après être retourné à l'ordinateur après un certain temps (lorsqu'il s'est mis en veille), je remarque que certains raccourcis ont cessé de fonctionner. Cela se produit non seulement dans le terminal, mais également dans Chrome (Ctrl-L, Ctrl-R, F5 cesse de fonctionner) ). Cela n’affecte pas non plus tous les raccourcis Ctrl: Ctrl-C fonctionne toujours par exemple (Dieu merci!).

Y at-il un moyen de déboguer cela? Essayer xev plus tôt ne m'a pas amené nulle part, mais peut-être y a-t-il un moyen de savoir ce qui empêche mes touches de clavier d'atteindre les programmes?

edit: Je peux voir quelque chose de bizarre se passe avec Ctrl-R

Quelque chose prend le raccourci clavier!

Sortie capturée à partir de xev

KeyPress event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24547557, (-130,529), root:(0,633),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

FocusOut event, serial 37, synthetic NO, window 0x5200001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 37, synthetic NO, window 0x5200001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 37, synthetic NO, window 0x0,
    keys:  4294967278 0   0   0   0   0   0   0   0   0   0   0   0   2   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24548550, (-130,529), root:(0,633),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Comparez ceci à Ctrl-C

nous pouvons facilement voir quatre événements logiques se déroulant ici

KeyPress event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24724066, (572,852), root:(702,956),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24724818, (572,852), root:(702,956),
    state 0x14, keycode 54 (keysym 0x63, c), same_screen YES,
    XLookupString gives 1 bytes: (03) ""
    XmbLookupString gives 1 bytes: (03) ""
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24724966, (572,852), root:(702,956),
    state 0x14, keycode 54 (keysym 0x63, c), same_screen YES,
    XLookupString gives 1 bytes: (03) ""
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24725339, (572,852), root:(702,956),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
3
oligofren

J'ai réussi à trouver le coupable le plus invraisemblable: le application Caprine Messenger. ! Cela pourrait également se produire avec de nombreuses autres applications réalisées avec la structure Electron (Spotify, Atom, Code VS) jusqu'à ce que le bogue dans la bibliothèque de raccourcis soit corrigé.

Je sais maintenant comment reproduire le bogue de manière cohérente après avoir lu le rapport de bogue sur le suiveur de problèmes d'électrons : fermez simplement l'application pour qu'elle réside simplement dans la barre d'état système. Mais avant d’arriver là-bas, j’ai réussi à trouver des preuves concluantes que c’était Caprine qui capturait le raccourci et que le tuer était la solution. Voici comment j'ai découvert (peut être utilisé pour des situations similaires):

Un réponse quelque peu opaque à une question dupliquée à ce sujet expliquait qu'il était possible de détecter quelle application saisissait les clés en émettant des frappes magiques. Au début, je ne comprenais pas très bien comment tout configurer, pensant que je devais passer par toutes sortes de cerceaux (déconner avec la configuration de Xorg, désactiver la commutation de vty, ++) pour configurer une configuration de keymapping spéciale, jusqu'à ce que je me rende compte que la réponse a en fait également décrit comment déclencher ces combinaisons de touches par programme!

Donc, tout ce que j'avais à faire était d'ouvrir deux fenêtres de terminal. Dans la première fenêtre du terminal, j'ai commencé à enregistrer les événements sur le système Xorg:

tail -f /var/log/Xorg.0.log > out.txt

Dans l'autre fenêtre, j'ai déclenché des événements qui ont transmis les combinaisons de touches au système Xorg:

KEY="ctrl+r"                  # the combination that was "grabbed"
xdotool keydown ${KEY};       # start pressing the key combo
xdotool key XF86LogGrabInfo;  # the keysym that when emitted asks X to print info on the grabber of the current keys
xdotool keyup ${KEY}          # stop pressing the key combo

Faire ceci par programme comme cela était beaucoup plus facile que de le faire manuellement comme une pieuvre digitale :-) Dans le journal des événements capturé dans l’autre fenêtre (13'000 lignes!), Les bits intéressants étaient évidents dans premières lignes:

[ 24264.517]     detail 71 (mask 0), modifiersDetail 128 (mask 0)
[ 24264.517]     device 'Virtual core keyboard' (3), modifierDevice 'Virtual core keyboard' (3)
[ 24264.517]     core event mask 0x3
[ 24264.517]     owner-events false, kb 1 ptr 1, confine 0x0, cursor 0x0
[ 24264.517]   Printing all registered grabs of client pid 5643 /opt/Caprine/caprine --type=gpu-process --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=1,7,23,59,71 --gpu-vendor-id=0x8086 --gpu-device-id=0x5916 --gpu-driver-vendor --gpu-driver-version --gpu-driver-date --service-request-channel-token=B68A5099B5760C39675F51019B3D4F7A --v8-natives-passed-by-fd --v8-snapshot-passed-by-f 
[ 24264.517]   Printing all registered grabs of client pid 5643 /opt/Caprine/caprine --type=gpu-process --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=1,7,23,59,71 --gpu-vendor-id=0x8086 --gpu-device-id=0x5916 --gpu-driver-vendor --gpu-driver-version --gpu-driver-date --service-request-channel-token=B68A5099B5760C39675F51019B3D4F7A --v8-natives-passed-by-fd --v8-snapshot-passed-by-f 
[ 24264.517]   Printing all registered grabs of client pid 5684 /usr/lib/slack/slack --disable-gp 
[ 24264.517]   Printing all registered grabs of client pid 5684 /usr/lib/slack/slack --disable-gp 
[ 24264.517]   Printing all registered grabs of client pid 18336 xdotool key XF86LogGrabInfo
[ 24264.517] End list of registered passive grabs
[ 24308.177] (II) Printing all currently active device grabs:
[ 24308.177] Active grab 0x44800160 (core) on device 'Virtual core keyboard' (3):
[ 24308.177]       client pid 5614 /opt/Caprine/caprine 
[ 24308.177]       at 24308139 (from passive grab) (device thawed, state 1)
[ 24308.177]         core event mask 0x3
[ 24308.177]       passive grab type 2, detail 0x1b, activating key 27
[ 24308.177]       owner-events false, kb 1 ptr 1, confine 0, cursor 0x0
[ 24308.177] (II) End list of active device grabs

Après avoir tué Caprine, je pouvais enfin commencer à utiliser Ctrl-R dans le terminal pour faire des recherches d’historique inversées, ainsi que pour actualiser Chrome! xev produit aussi quelque chose d'assez différent de ce que j'ai détaillé dans la question, maintenant très similaire au résultat de Ctrl-L:

KeyPress event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25356738, (917,877), root:(1047,981),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25357181, (917,877), root:(1047,981),
    state 0x14, keycode 27 (keysym 0x72, r), same_screen YES,
    XLookupString gives 1 bytes: (12) ""
    XmbLookupString gives 1 bytes: (12) ""
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25357315, (917,877), root:(1047,981),
    state 0x14, keycode 27 (keysym 0x72, r), same_screen YES,
    XLookupString gives 1 bytes: (12) ""
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25357710, (917,877), root:(1047,981),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

edit: s'avère le bogue est conn

Le problème de bogue montre également comment reproduire de manière cohérente (réduire). Cela était dû à un bogue dans la bibliothèque electron-localshortcut .


Fait un petit util pour envoyer facilement ces raccourcis par programme.

4
oligofren