Puncte:0

Soluție pentru Linux și XKB pentru un eveniment Control_L suplimentar atunci când apăsați AltGr pe desktopul Linux peste VMWare Horizon

drapel de

Încerc să găsesc o remediere pentru o problemă de tastatură când mă conectez la un desktop Linux folosind VMWare Horizon View. Problema pare să fie cunoscută și a fost descrisă în 2012 Baza de cunoștințe VMWare, disponibilă pe archive.org. Trebuie să adaug că nu știu prea multe despre cum funcționează XKB, așa că săpat în acest lucru a fost o experiență de învățare.

Soluțiile enumerate în VMWware KB nu sunt satisfăcătoare. Pot confirma descrierea dată, că există un nedorit suplimentar Control_L personaj când am lovit AltGr. Când apăs pe AltGr+7 mă aștept la a {, dar în schimb primesc un caracter de evadare 0x1b. Așa arată când rulați xev și apăsați AltGr+7 (ISO_Level3_Shift este apăsarea de taste așteptată când apăsați AltGr).

Eveniment KeyPress, seria 37, NU sintetic, fereastra 0x3000001,
    root 0x521, subw 0x0, time 2444939915, (157,43), root:(388,257),
    stare 0x0, cod cheie 37 (keysym 0xffe3, Control_L), același_ecran DA,
    XLookupString oferă 0 octeți: 
    XmbLookupString oferă 0 octeți: 
    XFilterEvent returnează: False

Eveniment KeyPress, seria 37, NU sintetic, fereastra 0x3000001,
    root 0x521, subw 0x0, time 2444939920, (157,43), root:(388,257),
    stare 0x4, cod cheie 108 (keysym 0xfe03, ISO_Level3_Shift), același_ecran DA,
    XKeysymToKeycode returnează codul cheie: 92
    XLookupString oferă 0 octeți: 
    XmbLookupString oferă 0 octeți: 
    XFilterEvent returnează: False

Eveniment KeyPress, seria 37, NU sintetic, fereastra 0x3000001,
    root 0x521, subw 0x0, time 2444944595, (157,43), root:(388,257),
    stare 0x84, cod cheie 16 (keysym 0x7b, brațela stânga), același_ecran DA,
    XLookupString oferă 1 octeți: (1b) "
mbLookupString oferă 1 octeți: (1b) "
FilterEvent returnează: False

Eveniment KeyRelease, seria 37, NU sintetic, fereastra 0x3000001,
    root 0x521, subw 0x0, time 2444944763, (157,43), root:(388,257),
    stare 0x84, cod cheie 16 (keysym 0x7b, brațela stânga), același_ecran DA,
    XLookupString oferă 1 octeți: (1b) "
FilterEvent returnează: False

Eveniment KeyRelease, seria 37, NU sintetic, fereastra 0x3000001,
    root 0x521, subw 0x0, time 2444951582, (157,43), root:(388,257),
    stare 0x84, cod cheie 37 (keysym 0xffe3, Control_L), același_ecran DA,
    XLookupString oferă 0 octeți: 
    XFilterEvent returnează: False

Eveniment KeyRelease, seria 37, NU sintetic, fereastra 0x3000001,
    root 0x521, subw 0x0, time 2444951586, (157,43), root:(388,257),
    stare 0x80, cod cheie 108 (keysym 0xfe03, ISO_Level3_Shift), același_ecran DA,
    XKeysymToKeycode returnează codul cheie: 92
    XLookupString oferă 0 octeți: 
    XFilterEvent returnează: False

Există o sugestie pe VMWare KB de apăsat AltGr, apoi apăsați și eliberați stânga Ctrl pentru a declanșa un eveniment KeyRelease pentru Control_L, după care pot apăsa 7 și obțineți rezultatul pe care îl caut: XLookupString/XmbLookupString în acest caz returnează 7b, care este { cum era de așteptat.

Deci, după ce am confirmat problema, am căutat soluții alternative în Linux. am fugit xkbcomp pentru a obține definiția hartă de taste live rulând:

xkbcomp $DISPLAY out.xkb

După ce se uită la generat afară.xkb, m-am gândit că ar putea fi posibil să-mi redefini mapările de taste pentru a aștepta Control_L în plus față de celelalte taste. Deci, pentru a selecta unele părți relevante, out.xkb meu conținea:

xkb_types „complet” {
...
  tastați „FOUR_LEVEL” {
    modificatori= Shift+LevelThree;
    harta[Shift]= Nivel2;
    harta[LevelThree]= Nivel3;
    harta[Shift+LevelThree]= Nivel4;
  };
};
...
xkb_symbols „pc+no+inet(evdev)” {
...
  tasta <AE07> {
    tip= „FOUR_LEVEL”,
    simboluri[Grup1]= [ 7, bară oblică, brățară stânga, diviziune ]
  };
...
}

Brățara din definiția de mai sus este ceea ce încerc să pun la treabă chiar acum.Ideea mea a fost să redefinim pur și simplu FOUR_LEVEL pentru a aștepta Control_L în cazurile adecvate, ca acesta:

  tastați „FOUR_LEVEL” {
    modificatori= Shift+LevelThree+LControl;
    harta[Shift]= Nivel2;
    map[LevelThree+LControl]= Level3;
    harta[Shift+LevelThree+LControl]= Level4;
  };

Am creat o mapare cu această configurare și apoi am încercat să compilez și să încărc fișierul meu modificat:

xkbcomp ctrl-hack.xkb
xkbcomp ctrl-hack.xkm $DISPLAY

Din păcate, modificările mele nu par să funcționeze așa cum am sperat. Nu primesc erori, dar încă primesc 0x1b în loc de { caracter când apăsez AltGr+7. Ce ar putea merge prost?

Alternativ, văd că alte personaje (cum ar fi ⬠și $) par să funcționeze în ciuda faptului că necesită și AltGr modificator și primirea unui Control_L suplimentar neașteptat. Dar testând în timp ce apăsați manual Control_L, văd asta ⬠funcționează atât cu cât și fără apăsarea Control_L, așa că pare să existe o definiție alternativă pentru acest simbol care nu este explicită în xkbcomp ieșire. Nu mi-am dat seama încă cum funcționează asta. Este posibil să definesc alternative similare pentru simbolurile care îmi lipsesc? Poate un fel de moștenire din configurația tastaturii consolei, de exemplu? Acesta ar veni probabil din același loc ca și 0x1b caracter pe care îl primesc când apăsați Ctrl-AltGr-7. Nu îl găsesc în XKB-config, așa că trebuie definit în altă parte.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.