// Extend layer symbols by DreymaR, for the XKeyboardConfig xkb-data package. // 2014- OEystein "DreymaR" Bech-Aase (Bech Gadmar until 2021) // See "DreymaR's Big Bag of Keyboard Tricks": https://dreymar.colemak.org/layers-extend.html // A modular Extend mapping layer like the one I have in Portable Keyboard Layout for Windows // - Key names are in /usr/include/X11/keysymdef.h and XF86keysym.h (Removing the XK_ prefix) // - mapped as XF86 Multimedia keys; shifted versions are implemented (unlike in EPKL for Windows) // // These keys are modified/transposed by holding down the 'extend key' (CapsLock by default): // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |Esc + |F1 <> |F2 << |F3 >> |F4 <> |F5 <> |F6 << |F7 >> |F8 <> |F9 <> |F10<> |F11<> |F12<> | // | | Pause | Rew | Fwd | Eject | Refr | Bri- | Bri+ | Sleep | WWW | Mail | App1 | App2 | // | Caps | Play | Prev | Next | Stop | Mute | Vol- | Vol+ | Media | Home | Srch | File | Calc | // +=======+=======+=======+=======+=======+=======+=======+=======+=======+=======+=======+=======+=======+ // |` *** |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= | // | *MOn | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |Tab |Q €€€ |W *** |F <<> |P <>> |G *** |J ### |L ### |U ### |Y ### |; €€€ |[ €€€ |] €€€ | // | | Esc | *WhUp | BrBck | BrFwd | *MUp | PgUp | Home | Up | End | Del | Esc | Ins | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |Caps+ |A +++ |R *** |S +++ |T +++ |D *** |H ### |N ### |E ### |I ### |O €€€ |' €€€ |\ ><> | // | ++++ | Alt | *WhDn | Shift | Ctrl | *MDn | PgDn | Left | Down | Right | Back | Menu | BrFav | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |_ €€€ |Z €€€ |X === |C === |V === |B *** |K *** |M *** |, *** |. *** |/ €€€ |Spc € |Entr€ | // | Cust | Undo | Cut | Copy | Paste | *Bt1 | *Bt2 | *Bt3 | *MLe | *MRi | Multi | Enter | PrtSc | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // Legend: # Movement; + Modifiers; = GUI edit; * Mouse; <> MultiMedia; € Various commands. // // KeyPad overlay with nav block to the left (lv7-8): // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |` *** |1 |2 |3 |4 £ |5 € |6 |7 ⇖ |8 ⇑ |9 ⇗ |0 |- |= | // | *MOn | ! | @ | # | $ | % | ^ | KP_7 | KP_8 | KP_9 | KP_* | KP_- | KP_= | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |Tab |Q ### |W ### |F ### |P €€€ |G €€€ |J ### |L ⇐ |U ⇔ |Y ⇒ |; |[ { |] } | // | | Home | Up | End | Del | Esc | PgUp | KP_4 | KP_5 | KP_6 | KP_+ | ( | ) | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |Caps+ |A ### |R ### |S ### |T €€€ |D |H ### |N ⇙ |E ⇓ |I ⇘ |O |' " |\ | | // | ++++ | Left | Down | Right | Back | K_Lck | PgDn | KP_1 | KP_2 | KP_3 | K_Ent | ' | : | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // |_ €€€ |Z €€€ |X === |C === |V === |B *** |K |M |, ⇕ |. |/ |Spc |Entr | // | Cust | Undo | Cut | Copy | Paste | *Bt1 | , | KP_0 | KP_0 | KP_. | KP_/ | Spc | K_Ent | // +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+ // // TODO: A lv7 modifier to reach the second Extend layer directly. // Test out this: // key { [ ISO_Level5_Shift ], actions[Group1] = [ SetMods(mods=LevelThree+LevelFive) ] }; // // NOTE: A lv7 (Level5+Level3) modifier might be necessary to use the KeyPad level sensibly // - One idea is to use AltGr+Caps as a lv7_lock (Caps+AltGr is already lv7_switch) // NOTE: If a hex pad is needed, the lv7(8?)+KBHDJG -> ABCDEF mappings are one solution // NOTE: There's a KP key named KP_BEGIN; it seems like a hack? Ignored for now. // NOTE: I've duplicated KP_0 to make it easy to hit. Useful for bigrams with 0. // // NOTE: The Big Bag image has the PointerEnable key on LSGT, but ANSI users don't have that key. Moved it to TLDE. // NOTE: Autorepeat is lost for keys with actions set. This is probably an XKB bug? // - One fix is to run xset afterwards: 'seq -s " r " 8 255 | xargs xset r' supposedly does the trick. // - Added the following to each key's symbols[Group1] definition: `repeat=true` // NOTE: The lv5 mod should be eaten up by xkb but isn't. Must manually clearmod it from all necessary keys. // +=======+==============================+=======+ // |=======| Main Extend Def. |=======| // +=======+==============================+=======+ default partial xkb_symbols "basic" { // name[Group1]= "Extend layer"; // include "extend(lv5_fk)" // The F# key block. Some may want to exclude this as it affects TTY shortcuts. include "extend(lv5)" // Extend mappings for all other keys }; partial alphanumeric_keys modifier_keys xkb_symbols "lv5_fk" { key.type[group1]="EIGHT_LEVEL"; // (Caps)Lock state not used on these keys // +=======+==============================+=======+ // |=======| F1-F12 |=======| // +=======+==============================+=======+ // NOTE: Many use Ctrl+Alt+ for TTY server control keys. With Extend, you may use Ext+AltGr+ instead. key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F01 XF86AudioPlay , XF86AudioPause , // Audio Play/Pause XF86_Switch_VT_1 , NoSymbol ] , // Virtual Terminal 1 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=1,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F02 XF86AudioPrev , XF86AudioRewind , // Audio Previous/Rewind XF86_Switch_VT_2 , NoSymbol ] , // Virtual Terminal 2 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=2,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F03 XF86AudioNext , XF86AudioForward , // Audio Next/Forward XF86_Switch_VT_3 , NoSymbol ] , // Virtual Terminal 3 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=3,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F04 XF86AudioStop , XF86Eject , // Audio Stop/Eject XF86_Switch_VT_4 , NoSymbol ] , // Virtual Terminal 4 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=4,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F05 XF86AudioMute , XF86Reload , // Audio Mute/Reload XF86_Switch_VT_5 , NoSymbol ] , // Virtual Terminal 5 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=5,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F06 XF86AudioLowerVolume , XF86MonBrightnessDown , // Audio Vol- / Brightness- XF86_Switch_VT_6 , NoSymbol ] , // Virtual Terminal 6 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=6,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F07 XF86AudioRaiseVolume , XF86MonBrightnessUp , // Audio Vol+ / Brightness+ XF86_Switch_VT_7 , NoSymbol ] , // Virtual Terminal 7 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=7,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F08 XF86AudioMedia , XF86Sleep , // MediaPlayer / Sleep XF86_Switch_VT_8 , NoSymbol ] , // Virtual Terminal 8 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=8,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F09 XF86HomePage , XF86WWW , // HomePage / Web XF86_Switch_VT_9 , NoSymbol ] , // Virtual Terminal 9 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=9,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F10 XF86Search , XF86Mail , // Search / Mail XF86_Switch_VT_10 , NoSymbol ] , // Virtual Terminal 10 actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=10,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F11 XF86Explorer , XF86Launch1 , // Explorer / App1 XF86_Switch_VT_11 , XF86LogGrabInfo ] , // Virtual Terminal 11 / Debug actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), // (in inet, XF86Launch3 is ) Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=11,!same) , NoAction() ] , repeat=yes }; key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F12 XF86Calculator , XF86Launch2 , // Calculator / App2 XF86_Switch_VT_12 , XF86LogWindowTree ] , // Virtual Terminal 12 / Debug actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), // (in inet, XF86Launch4 is ) Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) SwitchScreen(screen=12,!same) , NoAction() ] , repeat=yes }; }; partial alphanumeric_keys modifier_keys xkb_symbols "lv5" { // name[Group1]= "Extend layer"; key.type[group1]="EIGHT_LEVEL_SEMIALPHABETIC"; // Lock affects lv1/5 but not lv3/7 - a bit inflexible but OK I guess // +=======+==============================+=======+ // |=======| Number Row |=======| // +=======+==============================+=======+ // NOTE: Earlier, if I set lv5-6 of Esc to Caps_Lock, lv1-4 would be CapsLock PLUS Esc! Is this fixed now? // - If not, I might not have to send the Caps_Lock keysymbol as long as the LockMods action is there? key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Esc Caps_Lock , Caps_Lock , // Caps_Lock Caps_Lock , Caps_Lock ] , actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), LockMods(mods=Lock) , LockMods(mods=Lock) , // Lock mod for LockMods(mods=Lock) , LockMods(mods=Lock) ] , repeat=yes }; // Esc key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Tilde/Grave (` ~) Pointer_EnableKeys , Pointer_EnableKeys , // Ptr_On Pointer_EnableKeys , Pointer_EnableKeys ] , // (Enable MouseKeys) repeat=yes }; // ` ~ key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 1 F1 , F1 , exclam , exclam ] , // F1 / ! actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 1 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 2 F2 , F2 , at , at ] , // F2 / @ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 2 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 3 F3 , F3 , numbersign , numbersign ] , // F3 / # actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 3 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 4 F4 , F4 , dollar , sterling ] , // F4 / $ £ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 4 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 5 F5 , F5 , percent , EuroSign ] , // F5 / % € actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 5 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 6 F6 , F6 , asciicircum , asciicircum ] , // F6 / ^ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 6 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 7 F7 , F7 , KP_7 , U21D6 ] , // F7 / KP_7 ↖ ⇖ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 7 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 8 F8 , F8 , KP_8 , U21D1 ] , // F8 / KP_8 ↑ ⇑ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 8 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 9 F9 , F9 , KP_9 , U21D7 ] , // F9 / KP_9 ↗ ⇗ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 9 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // 0 F10 , F10 , KP_Multiply , KP_Multiply ] , // F10 / KP_* actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // 0 key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // - _ F11 , F11 , KP_Subtract , KP_Subtract ] , // F11 / KP_- actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // - _ key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // = + F12 , F12 , KP_Equal , KP_Equal ] , // F12 / KP_= actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // = + key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // BackSpace Pause , Pause , // Pause/Break Pause , Pause ] , // ( is special) actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive) , NoAction() , NoAction() ] , repeat=yes }; // BackSpace // +=======+==============================+=======+ // |=======| Upper Row |=======| // +=======+==============================+=======+ key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Q Escape , Escape , // Esc Home , KP_Home ] , // Home actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive) , Redirect(key=,clearmods=LevelFive) , Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive) ] , repeat=yes }; // Q key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // W XF86ScrollUp , XF86ScrollUp , // ScrollUp(††) Up , KP_Up ] , // ↑ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), PtrBtn(button=4) , PtrBtn(button=4) , // PtrWhBtUp/Ri NoAction() , NoAction() ] , repeat=yes }; // W // (ScrlR/L & Btn 6/7 may cause crashes now?!) key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // E XF86Back , XF86Back , // BrBck End , KP_End ] , // End actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), // (‡‡) NoAction() , NoAction() ] , repeat=yes }; // QWE E, Cmk F key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // R XF86Forward , XF86Forward , // BrFwd Delete , KP_Delete ] , // Del actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive), // (‡‡) NoAction() , NoAction() ] , repeat=yes }; // QWE R, Cmk P key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // T Pointer_Up , Pointer_Up , // PtrUp(††) Escape , Escape ] , // Esc actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), MovePtr(x=+0,y=-8) , MovePtr(x=+0,y=-8) , // PtrUp(††) Redirect(key=,clearmods=LevelFive) , Redirect(key=,clearmods=LevelFive) ] , repeat=yes }; // QWE T, Cmk G key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Y Page_Up , Page_Up , // PgUp Page_Up , KP_Prior ] , // PgUp / KP_PgUp actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // Redirect(key=) , NoAction() ] , repeat=yes }; // QWE Y, Cmk J key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // U Home , Home , // Home KP_4 , U21D0 ] , // KP_4 / ← ⇐ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE U, Cmk L key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // I Up , Up , // ↑ KP_5 , U21D4 ] , // KP_5 / ↔ ⇔ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE I, Cmk U key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // O End , End , // End KP_6 , U21D2 ] , // KP_6 / → ⇒ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE O, Cmk Y key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // P Delete , Delete , // Del KP_Add , KP_Add ] , // KP_+ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE P, Cmk ; : key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // [ { Escape , Escape , // Esc parenleft , braceleft ] , // ( actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive) , Redirect(key=,clearmods=LevelFive), NoAction() , NoAction() ] , repeat=yes }; // [ { key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // ] } Insert , Insert , // Ins parenright , braceright ] , // ) actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // ] } key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // \ | XF86Favorites , XF86MyComputer , // BrFav colon , bar ] , // : actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=all), Redirect(key=,clearmods=all), // /(‡‡) NoAction() , NoAction() ] , repeat=yes }; // \ | // +=======+==============================+=======+ // |=======| Middle Row |=======| // +=======+==============================+=======+ key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // A Alt_L , Alt_L , // Left , KP_Left ] , // ← actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), SetMods(mods=Alt) , SetMods(mods=Alt) , // Alt mod NoAction() , NoAction() ] , repeat=yes }; // QWE A, Cmk A key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // S XF86ScrollDown , XF86ScrollDown , // ScrlDown(††) Down , KP_Down ] , // ↓ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), PtrBtn(button=5) , PtrBtn(button=5) , // PtrWhBtDn/Le NoAction() , NoAction() ] , repeat=yes }; // QWE S, Cmk R // (ScrlR/L & Btn 6/7 may cause crashes now?!) key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // D Shift_L , Shift_L , // Right , KP_Right ], // → actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), SetMods(mods=Shift) , SetMods(mods=Shift) , // Shift mod NoAction() , NoAction() ] , repeat=yes }; // QWE D, Cmk S key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // F Control_L , Control_L , // BackSpace , BackSpace ] , // Back actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), SetMods(mods=Control) , SetMods(mods=Shift+Control) , // Ctrl mod NoAction() , NoAction() ] , repeat=yes }; // QWE F, Cmk T key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // G Pointer_Down , Pointer_Down , // PtrDn(††) Num_Lock , Num_Lock ] , // NumLock actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), MovePtr(x=+0,y=+8) , MovePtr(x=+0,y=+8) , // PtrDn(††) NoAction() , NoAction() ] , repeat=yes }; // QWE G, Cmk D key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // H Page_Down , Page_Down , // PgDn Page_Down , KP_Next ] , // PgDn / KP_PgDn actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // Redirect(key=) , NoAction() ] , repeat=yes }; // H key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // J Left , Left , // ← KP_1 , U21D9 ] , // KP_1 / ↙ ⇙ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE J, Cmk N key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // K Down , Down , // ↓ KP_2 , U21D3 ] , // KP_2 / ↓ ⇓ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE K, Cmk E key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // L Right , Right , // → KP_3 , U21D8 ] , // KP_3 / ↘ ⇘ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE L, Cmk I key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // ; : BackSpace , BackSpace , // Back KP_Enter , KP_Enter ] , // KP_Enter actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // QWE ;, Cmk O key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // ' " Menu , Menu , // Menu apostrophe , quotedbl ] , // ' " actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive) , // / NoAction() , NoAction() ] , repeat=yes }; // ' " // key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Return // Print , Print , // PrtScr // Print , Print ] , // PrtScr // actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), // Redirect(key=,clearmods=LevelFive), Redirect(key=,clearmods=LevelFive) , // // NoAction() , NoAction() ] , // repeat=yes }; // Return // This mapping breaks the Enter key for some users? // +=======+==============================+=======+ // |=======| Lower Row |=======| // +=======+==============================+=======+ key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // < > Delete , Delete , // User's choice (Del for now) Delete , Delete ] , // --"-- actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=) , Redirect(key=) , Redirect(key=) , Redirect(key=) ] , repeat=yes }; // < > key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Z Undo , Redo , // Undo/Redo Undo , Redo ] , // Undo/Redo actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive), // Ctrl+Z Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive)], // Ctrl+Z // Redirect(key=) , Redirect(key=) ] , // (‡‡) (not working?) repeat=yes }; // Z key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // X XF86Cut , XF86Cut , // Cut(§§) XF86Cut , XF86Cut ] , // Cut(§§) actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive), // Ctrl+X Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive)], // Ctrl+X // Redirect(key=) , Redirect(key=) ] , // (‡‡) (not working since Ub14.04?) repeat=yes }; // X key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // C XF86Copy , XF86Copy , // Copy(§§) XF86Copy , XF86Copy ] , // Copy(§§) actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive), // Ctrl+C Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive)], // Ctrl+C // Redirect(key=) , Redirect(key=) ] , // (‡‡) (not working since Ub14.04?) repeat=yes }; // C key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // V XF86Paste , XF86Paste , // Paste(§§) XF86Paste , XF86Paste ] , // Paste(§§) actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive), // Ctrl+V Redirect(key=,mods=Control,clearmods=LevelFive), Redirect(key=,mods=Shift+Control,clearmods=LevelFive)], // Ctrl+V // Redirect(key=) , Redirect(key=) ] , // (‡‡) (not working since Ub14.04?) repeat=yes }; // V key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // B Pointer_Button1 , Pointer_Button1 , // LBt(††) Pointer_Button1 , Pointer_Button1 ] , // LBt actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), PtrBtn(button=1) , PtrBtn(button=1) , // PtrLBt NoAction() , NoAction() ] , repeat=yes }; // B key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // N Pointer_Button2 , Pointer_Button2 , // MBt(††) comma , semicolon ] , // , ; actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), PtrBtn(button=2) , PtrBtn(button=2) , // PtrMBt NoAction() , NoAction() ] , repeat=yes }; // QWE N, Cmk K key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // M Pointer_Button3 , Pointer_Button3 , // RBt(††) KP_0 , U21D5 ] , // KP_0 / ↕ ⇕ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), PtrBtn(button=3) , PtrBtn(button=3) , // PtrRBt NoAction() , NoAction() ] , repeat=yes }; // M key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // , < Pointer_Left , Pointer_Left , // PtrLe(††) KP_0 , U21D5 ] , // KP_0 / ↕ ⇕ actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), MovePtr(x=-8,y=+0) , MovePtr(x=-8,y=+0) , // PtrLe(††) NoAction() , NoAction() ] , repeat=yes }; // , < key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // . > Pointer_Right , Pointer_Right , // PtrRi(††) KP_Decimal , colon ] , // KP_. : actions[Group1]=[NoAction(), NoAction(), NoAction(), NoAction(), MovePtr(x=+8,y=+0) , MovePtr(x=+8,y=+0) , // PtrRi(††) NoAction() , NoAction() ] , repeat=yes }; // . > key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // / ? Multi_key , Multi_key , // Compose KP_Divide , KP_Divide ] , // KP_/ repeat=yes }; // / ? // NOTE: The Space key should preserve the Shift state; it's special because both levels have the same symbol. // - One might use a key type that has the 'preserve[Shift] = Shift;' property. However, I fix it directly. key { symbols[Group1]=[NoSymbol , NoSymbol , NoSymbol , NoSymbol , // Space Return , Return , // Enter space , nobreakspace ] , // Space actions[Group1]=[NoAction(),SetMods(mods=Shift),NoAction(),SetMods(mods=Shift), Redirect(key=) , Redirect(key=) , // NoAction() , NoAction() ] , repeat=yes }; // Space // key { [ NoSymbol,NoSymbol,NoSymbol,NoSymbol ] }; // CapsLock (Ext key def. is in the level5 file) // §§: XCV Cut/Copy/Paste seem OK in Firefox but not Gedit!? This seems to be a GTK weakness. // - Some bind fiddling in ~/.gtkrc-2.0 and ~/.config/gtk-3.0/gtk.css can get this working // ††: 'Pointer_'mousing needs enabling! Real KP_ keys work but not the Pointer_ mousing symbols // (In the Settings GUI there's a Shift+NumLock option for this, but Pointer_EnableKeys works too) // ‡‡: Multimedia keys are in symbols/inet(evdev); this should be enabled (base rules usually handle it) // NOTE: RedirectKey alone doesn't work for the #->FK keys; they then act as the remapped FK## (Multimedia) // NOTE: I'm not mapping the CAPS key to lv5_switch here, as that should be done separately. // - Leave it to the layout/options to decide which key(s) to use as switches. // key { [ ISO_Level5_Shift , BackSpace , Caps_Lock , Caps_Lock , NoSymbol ] }; // modifier_map Mod3 { ISO_Level5_Shift }; // include "level3(ralt_switch)" // include "level5(caps_switch)" }; // NOTE: Alt worked with just the symbol, Shift/Ctrl not. Shift/Control are "real" mods; Alt a "virtual" one. // - Adding SetMods() actions to the Shift/Ctrl keys, they now work as they should. // NOTE: Lv5+S+T+N (Shift+Ctrl+Left) is too much at once; letting go of S but not T lets the arrows work. // - Using one physical modifier and the other Extend mapped (Lv5+S++N) functions as expected! // - It's the same for Lv5+A+T+ for tab switching; works only with physical either Ctrl or Alt.