ประกาศคีย์ตัวปรับแต่งใหม่ด้วย XKB


12

ฉันพยายามสร้างเค้าโครงแป้นพิมพ์มือเดียวและต้องการใช้Hyperเพื่อสร้างคีย์พิเศษเมื่อฉันกดแป้นบางปุ่ม

ตัวอย่างเช่นเมื่อผมกดHyper_Lและผมต้องการที่จะผลิตB XKBXF86AudioRaiseVolume

ชิ้นส่วนที่เกี่ยวข้องจากcustom_2.kbd (รหัสเต็มที่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;
};
};

ดูเหมือนจะดีสำหรับฉัน แต่เมื่อฉันลอง:

~$ 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

(รหัสข้อผิดพลาดคือ 1)

และตอนนี้ฉันติดอยู่ ใครบ้างมีความคิดวิธีการทำงานนี้ ทางออกที่ไม่มีHyperก็โอเค

แก้ไข

โดยการเปลี่ยนSuperและHyperไปMod4และMod5ว่าข้อผิดพลาดออกไป:

~$ 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;

อย่างไรก็ตามมันยังใช้งานไม่ได้:

~$ 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 

คำตอบ:


9

ยังคงมีปัญหาบางอย่าง (ฉันคิดว่าไม่เกี่ยวข้อง) กับ XKB แต่ฉันมีการทำแผนที่ตัวดัดแปลงไฮเปอร์และฉันเชื่อว่าการตั้งค่าที่เกี่ยวข้องคือ:

compat:

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

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

สัญลักษณ์:

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

ถ้าอย่างนั้น

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

ประเภท

virtual_modifiers Meta,AltGr,Super,Hyper,Mod5;

ไม่จำเป็นต้องมี Mod5 เว้นแต่คุณจะใช้ด้วย; แต่ในทำนองเดียวกันละเว้น Shift & Control ที่นี่ ...

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

สำหรับสิ่งที่คุ้มค่าฉันมีความยุ่งยากที่แย่กว่านั้นคือพยายามกำหนดรูปทรงเรขาคณิตและรหัสคีย์ใหม่มากกว่าที่คุ้มค่าและจบลงด้วยการย้อนกลับไปสู่pc105สัญลักษณ์สำคัญใน<AE01>รูปแบบแม้ว่าจะมีหลายคนที่ตั้งชื่อผิดอย่างน่าหัวเราะ (เช่น<DELE>สำหรับรหัสไฮเปอร์ของฉัน)

PS สำหรับตัวอย่างการใช้งานดูhttps://github.com/brpocock/spacey-cadet-keyboard ...


ขอบคุณมาก. ยังคงทำงานบางอย่างออกมา แต่มันใช้งานได้ดี!
Lennart_96
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.