Nyatakan kunci pengubah baru dengan XKB

12

Saya mencoba membuat tata letak keyboard satu tangan dan ingin digunakan Hyperuntuk menghasilkan tombol khusus ketika saya menekan beberapa tombol.

Misalnya, ketika saya menekan Hyper_Ldan B, saya ingin XKB memproduksi XF86AudioRaiseVolume.

Bagian yang relevan dari custom_2.kbd (kode lengkap di http://pastebin.com/gm8cggn3 ):

xkb_keycodes {
    <K_36> = 54;        // b B XF86AudioRaiseVolume
    <K_85> = 133;       // Hyper_L
};

xkb_symbols {
    key <K_36> { type = "HYPER_LEVEL", [ b, B, XF86AudioRaiseVolume ] };
    key <K_85> { type = "ONE_LEVEL", [ Hyper_L ] };
};

xkb_compatibility {
    interpret Hyper_L { action = SetMods(modifiers=Hyper); };
};


xkb_types {
type "HYPER_LEVEL" {
    modifiers= Shift+Hyper;
    map[Shift]= Level2;
    map[Hyper]= Level3;
    map[Shift+Hyper]= Level3;
};
};

Tampaknya baik-baik saja bagi saya, tetapi ketika saya mencobanya:

~$ xkbcomp custom_2.kbd $DISPLAY
Error:            Identifier "Hyper" of type int is unknown
Error:            Key type mask field must be a modifier mask
                  Key type definition ignored
Warning:          Map entry for unused modifiers in HYPER_LEVEL
                  Using none instead of Shift
Error:            Identifier "Hyper" of type int is unknown
Error:            The key type map entry field must be a modifier mask
                  Ignoring illegal assignment in HYPER_LEVEL
Error:            Identifier "Hyper" of type int is unknown
Error:            The key type map entry field must be a modifier mask
                  Ignoring illegal assignment in HYPER_LEVEL
 -> 1

(kode kesalahan adalah 1)

Dan sekarang saya terjebak. Adakah yang punya ide bagaimana membuat ini bekerja? Solusi tanpa Hyperadalah OK.

Edit

Dengan mengubah Superdan Hyperke Mod4dan Mod5, kesalahan itu hilang:

~$ xkbcomp custom_3.kbd
( no output )

~$ diff custom_{2,3}.kbd
188,190c188,190
<         interpret Super_L { action = SetMods(modifiers=Super); };
<         interpret Hyper_L { action = SetMods(modifiers=Hyper); };
<     }c;
---
>         interpret Super_L { action = SetMods(modifiers=Mod4); };
>         interpret Hyper_L { action = SetMods(modifiers=Mod5); };
>     };
204c204
<             modifiers= Shift+Hyper;
---
>             modifiers= Shift+Mod5;
206,207c206,207
<             map[Hyper]= Level3;
<             map[Shift+Hyper]= Level3;
---
>             map[Mod5]= Level3;
>             map[Shift+Mod5]= Level3;

Namun, itu masih tidak berfungsi:

~$ xkbcomp custom_3.kbd $DISPLAY 
Error:            success in unknown
                  Couldn't write keyboard description to :0.0
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  135 (XKEYBOARD)
  Minor opcode of failed request:  9 (XkbSetMap)
  Value in failed request:  0x8010202
  Serial number of failed request:  12
  Current serial number in output stream:  14
 -> 1 
Lennart_96
sumber

Jawaban:

9

Masih memiliki beberapa (saya pikir tidak terkait) masalah dengan XKB sendiri, tapi saya punya pengubah Hyper dipetakan, dan saya percaya pengaturan yang relevan adalah ini:

compat:

virtual_modifiers Shift,Control,Meta,Super,Hyper,AltGr;

interpret Hyper_R { action = SetMods(modifiers=Mod4); };

simbol:

modifier_map Mod4 { <DELE> }; // Hyper
key <DELE>  { type="UNMODIFIED", [ Hyper_R ], repeat=no  };

lalu sesuatu seperti

key <K_36> { type = "SHIFT+HYPER", [ b, B, 
                                XF86AudioRaiseVolume, XF86AudioRaiseVolume ] };

jenis

virtual_modifiers Meta,AltGr,Super,Hyper,Mod5;

tidak perlu Mod5 di sana kecuali Anda menggunakannya juga; tetapi juga, hilangkan Shift & Kontrol di sini ...

type "SHIFT+HYPER" {
    modifiers= Shift+Hyper;
    map[Shift]= Level2;
    map[Hyper]= Level3;
    map[Shift+Hyper]= Level4;
};

Untuk apa nilainya, saya telah jauh, kerepotan yang jauh lebih buruk mencoba mendefinisikan ulang geometri dan kode kunci daripada nilainya, dan akhirnya kembali ke pc105simbol kunci dalam <AE01>bentuk, meskipun banyak dari mereka yang salah nama. (mis. <DELE>untuk kunci Hyper saya)

PS. Untuk contoh kerja, lihat https://github.com/brpocock/spacey-cadet-keyboard ...

BRPocock
sumber
Terima kasih banyak. Masih mengerjakan beberapa hal, tetapi itu berhasil!
Lennart_96