diff --git a/linux/xkb/.xkb/symbols/chromebook b/linux/xkb/.xkb/symbols/chromebook new file mode 100644 index 0000000..34585ce --- /dev/null +++ b/linux/xkb/.xkb/symbols/chromebook @@ -0,0 +1,5 @@ +partial modifier_keys +xkb_symbols "swap_lalt_lctrl" { + replace key { [ Control_L, Control_L ] }; + replace key { [ Alt_L, Meta_L ] }; +}; diff --git a/linux/xkb/.xkb/symbols/mac_gui b/linux/xkb/.xkb/symbols/mac_gui new file mode 100644 index 0000000..8c19c53 --- /dev/null +++ b/linux/xkb/.xkb/symbols/mac_gui @@ -0,0 +1,781 @@ +// Template +// +// ONE_LEVEL_CTRL +// Base +// Shift +// Alt +// Shift Alt +// Control +// Shift Control +// Super +// Shift Super +// Control Alt +// Super Control +// Super Alt +// Super Control Alt +// +// replace key { +// type[Group1]= "ONE_LEVEL_CTRL", +// symbols[Group1]= [ +// Base, +// Alt, +// Shift Alt, +// Control, +// Shift Control, +// Super, +// Shift Super, +// Control Alt, +// Super Control", +// Super Alt, +// Super Control Alt +// ], +// actions[Group1]= [ +// NoAction(), +// RedirectKey(key=,modifiers=NewMod,clearmods=Mod1), +// RedirectKey(key=,modifiers=NewMod,clearmods=Mod1+Shift), +// RedirectKey(key=,modifiers=NewMod,clearmods=Control), +// RedirectKey(key=,modifiers=NewMod,clearmods=Control+Shift), +// RedirectKey(key=,modifiers=NewMod,clearmods=Super), +// RedirectKey(key=,modifiers=NewMod,clearmods=Super+Shift), +// RedirectKey(key=,modifiers=NewMod,clearmods=Control+Alt), +// RedirectKey(key=,modifiers=NewMod,clearmods=Super+Control), +// RedirectKey(key=,modifiers=NewMod,clearmods=Super+Mod1), +// RedirectKey(key=,modifiers=NewMod,clearmods=Control+Mod1) +// ] +// }; +hidden partial modifier_keys +xkb_symbols "swapescape" { + key { [ Escape ] }; + key { [ Caps_Lock ] }; +}; +hidden partial modifier_keys +xkb_symbols "caps_escape" { + key { [ Escape ] }; +}; +hidden partial modifier_keys +xkb_symbols "caps_shiftlock" { + replace key { [ Shift_Lock ] }; + modifier_map Shift { Shift_Lock }; +}; +hidden partial modifier_keys +xkb_symbols "caps_none" { + key { [ VoidSymbol ] }; +}; +default partial xkb_symbols "mac_levelssym" { + // // Minimize window Cmd + H = Alt + F9 + // // 2 caveats + // // 1 Cmd + H may not pass through on VMs + // // 2 may cause conflicts with apps + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ + // h, + // H, + // h, + // H, + // h + // ], + // actions[Group1]= [ + // NoAction(), + // NoAction(), + // NoAction(), + // NoAction(), + // RedirectKey(key=,modifiers=Super,clearmods=Control) + // ] + // }; + // Maximize Window Ctrl + Cmd + F = Alt+F10 + // Also maps Option + Cmd + F to Control+H for Replace - Sublime + // AD03=e,E + // AC01=a,A + // Ctrl + A - Beginning of Line + replace key { + type[Group1]= "ONE_LEVEL_SUPER", + symbols[Group1]= [ + // Base + a, + // Shift + A, + // Super + NoSymbol, + // Shift Super + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Super), + RedirectKey(key=,clearmods=Super) + ] + }; + // Ctrl + E - End of Line + replace key { + type[Group1]= "ONE_LEVEL_SUPER", + symbols[Group1]= [ + // Base + e, + // Shift + E, + // Super + NoSymbol, + // Shift Super + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Super), + RedirectKey(key=,clearmods=Super) + ] + }; + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + f, + // Shift + F, + // Alt + f, + // Shift Alt + F, + // Control + f, + // Shift Control + F, + // Super + f, + // Shift Super + F, + // Control Alt + h + // Super Control + // ,F10 // Default maximize + // // Nothing // KDE maximize + // Super Alt + // Super Control Alt + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt + NoAction(), + // Shift Alt + NoAction(), + // Control + NoAction(), + // Shift Control + NoAction(), + // Super + NoAction(), + // Shift Super + NoAction(), + // Control Alt + RedirectKey(key=,clearmods=Mod1) + // Super Control - Fullscreen + // ,RedirectKey(key=,modifiers=Mod1,clearmods=Super+Control) // Default maximize + // // Nothing // KDE maximize + // Super Alt + // Super Control Alt + ] + }; + // Close App Cmd + Q = Alt + F4 + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + q, + // Shift + Q, + // Alt + q, + // Shift Alt + Q, + // Control + F4 + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt + NoAction(), + // Shift Alt + NoAction(), + // Control + RedirectKey(key=,modifiers=Mod1,clearmods=Control) + ] + }; + // Show Desktop Cmd + F3 = Super + D + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + F3, + // Shift + F3, + // Alt + F3, + // Shift Alt + F3, + // Control + d + ], + actions[Group1]= [ + NoAction(), + NoAction(), + NoAction(), + NoAction(), + RedirectKey(key=,modifiers=Super,clearmods=Control) + ] + }; + // Fix the G key for Sublime Text + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + g, + // Shift + G, + // Alt + g, + // Shift Alt + G, + // Control + g, + // Shift Control + G, + // Super + NoSymbol, + // Shift Super + NoSymbol, + // Control Alt + g, + // Super Control + g, + // Super Alt + g, + // Super Control Alt + g + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Pass G Normally + RedirectKey(key=), + RedirectKey(key=), + // Find Next + RedirectKey(key=,clearmods=Control), + // Find Previous + RedirectKey(key=,clearmods=Control), + // Sublime Goto Line + RedirectKey(key=,modifiers=Control,clearmods=Super), + NoAction(), + // Sublime Quick Find + RedirectKey(key=,clearmods=Mod1), + // Sublime Select All Matches + RedirectKey(key=,modifiers=Mod1,clearmods=Super+Control), + NoAction(), + NoAction() + ] + }; + // LEFT to Begin Line or Beginning of word + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + Left, + // Shift + Left, + // Alt + Left, + // Shift Alt + Left, + // Control + NoSymbol, + // Shift Control + NoSymbol, + // Super + Left + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt - Wordwise + RedirectKey(key=,mods=Control,clearmods=Mod1), + // Shift Alt + RedirectKey(key=,mods=Control,clearmods=Mod1), + // Control + RedirectKey(key=,clearmods=Control), + // Shift Control + RedirectKey(key=,clearmods=Control), + // Super - Change workspace + NoAction() + ] + }; + + // Right to End of Line or end of word + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + Right, + // Shift + Right, + // Alt + Right, + // Shift Alt + Right, + // Control + NoSymbol, + // Shift Control + NoSymbol, + // Super + Right + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt - Wordwise + RedirectKey(key=,mods=Control,clearmods=Mod1), + // Shift Alt + RedirectKey(key=,mods=Control,clearmods=Mod1), + // Control + RedirectKey(key=,clearmods=Control), + // Shift Control + RedirectKey(key=,clearmods=Control), + // Super - Change workspace + NoAction() + ] + }; + + //Up to Mac Home + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + Up, + // Shift + Up, + // Alt + Up, + // Shift Alt + Up, + // Control + NoSymbol, + // Shift Control + NoSymbol, + // Super + Up, + // Shift Super + Up + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt - Wordwise + RedirectKey(key=,clearmods=Mod1), + // Shift Alt + // RedirectKey(key=), // Chromebook multicursor + RedirectKey(key=,clearmods=Mod1), // Default multicursor + // Control + RedirectKey(key=), + // Shift Control + RedirectKey(key=), + // Super - Wordwise - Sublime? + RedirectKey(key=,clearmods=Super), + // Shift Super + RedirectKey(key=,modifiers=Mod1,clearmods=Super) + ] + }; + + // Down to Mac End + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + Down, + // Shift + Down, + // Alt + Down, + // Shift Alt + Down, + // Control + NoSymbol, + // Shift Control + NoSymbol, + // Super + Down, + // Shift Super + Down + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt - Wordwise + RedirectKey(key=,clearmods=Mod1), + // Shift Alt + RedirectKey(key=,clearmods=Mod1), + // Control + RedirectKey(key=), + // Shift Control + RedirectKey(key=), + // Super - Wordwise - Sublime? + RedirectKey(key=,clearmods=Super), + // Shift Super + RedirectKey(key=,modifiers=Mod1,clearmods=Super) + ] + }; + // Alt BKSP to DELETE + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + BackSpace, + BackSpace, + BackSpace + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Mod1) + ] + }; + // // Full Print Screen + // // GalliumOS + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ 3, 3, 3, F5 ], + // actions[Group1]= [ NoAction(), NoAction(), NoAction(), RedirectKey(key=,clearmods=Shift) ] + // }; + // // Region Print Screen + // // GalliumOS + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ 4, 4, 4, F5 ], + // actions[Group1]= [ NoAction(), NoAction(), NoAction(), RedirectKey(key=) ] + // }; + // // Full Print Screen + // // Standard Ubuntu + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ 3, 3, 3, F5 ], + // actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,clearmods=Shift+Control) ] + // }; + // // Region Print Screen + // // Standard Ubuntu + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ 4, 4, 4, F5 ], + // actions[Group1]= [ NoAction(), NoAction(), RedirectKey(key=,clearmods=Control) ] + // }; +}; +partial xkb_symbols "mac_appcycle_chromebook" { + // Cycle App and In App Tab Switching + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Tab, + Tab, + Tab, + Tab, + backslash, + backslash, + NoSymbol, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Alt + Redirect(key=,mods=Control,clearmods=Mod1), + // Alt + Shift + Redirect(key=,mods=Control,clearmods=Mod1), + // Control + Redirect(key=), + // Control+Shift + Redirect(key=), + // Super + NoAction(), + // Super + Shift + NoAction() + ] + }; +}; +partial xkb_symbols "mac_appcycle" { + // Cycle App and In App Tab Switching + key { [ F13 ] }; + key { [ F14 ] }; + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + Tab, + Tab, + F14, + F13, + NoSymbol, + NoSymbol + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Control + Shift + Redirect(key=), + // Control + Redirect(key=), + // Super + Redirect(key=,mods=Control,clearmods=Mod4+Super), + // Super + Shift + Redirect(key=,mods=Control,clearmods=Mod4+Super) + ] + }; +}; +partial xkb_symbols "mac_browsers_chromebook" { + // Cycle App and In App Tab Switching + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Tab, + Tab, + NoSymbol, + NoSymbol, + backslash, + backslash, + NoSymbol, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Alt + Redirect(key=,mods=Control,clearmods=Mod1), + // Alt + Shift + Redirect(key=,mods=Control,clearmods=Mod1+Shift), + // Control + Redirect(key=), + // Control+Shift + Redirect(key=), + // Super + NoAction(), + // Super + Shift + NoAction() + ] + }; + //Up to Mac Home + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Up, + Up, + Up, + Up, + NoSymbol, + NoSymbol, + Up + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Wordwise + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=), + RedirectKey(key=), + // Wordwise - Sublime? + RedirectKey(key=,clearmods=Super), + RedirectKey(key=,modifiers=Mod1,clearmods=Super) + ] + }; + // Down to Mac End + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Down, + Down, + Down, + Down, + NoSymbol, + NoSymbol, + Down + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Wordwise + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=), + RedirectKey(key=), + // Wordwise - Sublime? + RedirectKey(key=,clearmods=Super), + RedirectKey(key=,modifiers=Mod1,clearmods=Super) + ] + }; + // Alt BKSP to DELETE + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + BackSpace, + BackSpace, + BackSpace + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Mod1) + ] + }; +}; +partial xkb_symbols "mac_browsers" { + // Cycle App and In App Tab Switching + key { [ F13 ] }; + key { [ F14 ] }; + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + Tab, + Tab, + F14, + F13, + NoSymbol, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + Redirect(key=), + Redirect(key=), + Redirect(key=,mods=Control,clearmods=Mod4+Super), + Redirect(key=,mods=Control,clearmods=Mod4+Super+Shift) + ] + }; + //Up to Mac Home + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Up, + Up, + Up, + Up, + NoSymbol, + NoSymbol, + Up + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Wordwise + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=), + RedirectKey(key=), + // Wordwise - Sublime? + RedirectKey(key=,clearmods=Super), + RedirectKey(key=,modifiers=Mod1,clearmods=Super) + ] + }; + // Down to Mac End + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Down, + Down, + Down, + Down, + NoSymbol, + NoSymbol, + Down + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Wordwise + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=,clearmods=Mod1), + RedirectKey(key=), + RedirectKey(key=), + // Wordwise - Sublime? + RedirectKey(key=,clearmods=Super), + RedirectKey(key=,modifiers=Mod1,clearmods=Super) + ] + }; + // Alt BKSP to DELETE + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + BackSpace, + BackSpace, + BackSpace + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Mod1) + ] + }; +}; +partial xkb_symbols "mac_chrome" { + // Back Button + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Left, + Left, + NoSymbol, + NoSymbol, + Left + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt + RedirectKey(key=), + // Alt + RedirectKey(key=), + // Control + RedirectKey(key=,modifiers=Mod1,clearmods=Control) + ] + }; + // Forwards Button + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + // Base + Right, + // Shift + Right, + // Alt + NoSymbol, + // Shift Alt + NoSymbol, + // Control + Right + ], + actions[Group1]= [ + // Base + NoAction(), + // Shift + NoAction(), + // Alt + RedirectKey(key=), + // Shift Alt + RedirectKey(key=), + // Control + RedirectKey(key=,modifiers=Mod1,clearmods=Control) + ] + }; +}; \ No newline at end of file diff --git a/linux/xkb/.xkb/symbols/mac_term b/linux/xkb/.xkb/symbols/mac_term new file mode 100644 index 0000000..6a57a0c --- /dev/null +++ b/linux/xkb/.xkb/symbols/mac_term @@ -0,0 +1,210 @@ +default partial xkb_symbols "mac_apple" { + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Control_L ], + actions[group1]=[ SetMods(modifiers=Control+Shift) ] + }; + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Control_R ], + actions[group1]=[ SetMods(modifiers=Control+Shift) ] + }; +}; +partial xkb_symbols "mac_win" { + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Hyper_L ], + actions[group1]=[ SetMods(modifiers=Shift+Control) ] + }; + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Hyper_R ], + actions[group1]=[ SetMods(modifiers=Shift+Control) ] + }; +}; +partial xkb_symbols "mac_global" { + // // Minimize Window Cmd + H = Alt+F9 + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ + // h, + // H, + // H + // ], + // actions[Group1]= [ + // NoAction(), + // NoAction(), + // RedirectKey(key=,modifiers=Super,clearmods=Control+Shift) + // ] + // }; + + // + // Some sort of glitch occurs on shifting F while this segment is active + // it is like the Control key is being held down when it isn't. + // + // // Maximize Window Ctrl + Cmd + F = Alt+F10 + // replace key { + // type[Group1]= "ONE_LEVEL_CTRL", + // symbols[Group1]= [ + // f, + // F, + // F + // ], + // actions[Group1]= [ + // // Base + // NoAction(), + // // Shift + // NoAction(), + // // Ctrl + Shift + // RedirectKey(key=,modifiers=Mod1,clearmods=Control+Shift) + // ] + // }; + + // Close App Cmd + Q = Alt + F4 + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + q, + Q, + F4 + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,modifiers=Mod1,clearmods=Control+Shift) + ] + }; + + // Show Desktop Cmd + F3 = Super + D + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + F3, + F3, + D + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,modifiers=Super,clearmods=Control+Shift) + ] + }; + + // Cycle App and In App Tab Switching + key { [ F13 ] }; + key { [ F14 ] }; + + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + Tab, + Tab, + // F13 // Default cmdtab + // F13 // KDE cmdtab + // Right // Elementary ecmdtab + ], + actions[Group1]= [ + NoAction(), + NoAction(), + // Redirect(key=) // Default cmdtab + // Redirect(key=,clearmods=Shift) // KDE cmdtab + // Redirect(key=,mods=Control+Shift,clearmods=Mod4+Super) // Elementary cmdtab + ] + }; + + // Page Up + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Up, + Up, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + + // Page Down + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Down, + Down, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + // HOME + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + Left, + Left, + NoSymbol, + Left + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control), + RedirectKey(key=,mods=Super,clearmods=Control) + ] + }; + // END + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + Right, + Right, + NoSymbol, + Right + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control), + RedirectKey(key=,mods=Super,clearmods=Control) + ] + }; + // Full Print Screen + // Standard Ubuntu + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + 3, + numbersign, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + // Region Print Screen + // Standard Ubuntu + replace key { + type[Group1]= "ONE_LEVEL_CMD", + symbols[Group1]= [ + 4, + dollar, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Control) + ] + }; +}; \ No newline at end of file diff --git a/linux/xkb/.xkb/symbols/mac_term_chromebook b/linux/xkb/.xkb/symbols/mac_term_chromebook new file mode 100644 index 0000000..93e1d70 --- /dev/null +++ b/linux/xkb/.xkb/symbols/mac_term_chromebook @@ -0,0 +1,100 @@ +default partial xkb_symbols "mac_levelssym" { + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Hyper_L ], + actions[group1]=[ SetMods(modifiers=Shift+Control) ] + }; + key { + repeat= no, + type= "ONE_LEVEL", + symbols[Group1]= [ Hyper_R ], + actions[group1]=[ SetMods(modifiers=Shift+Control) ] + }; + // Page Up + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Up, + Up, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + // Page Down + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Down, + Down, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + // HOME + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Left, + Left, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + // END + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + Right, + Right, + NoSymbol + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift+Control) + ] + }; + // Full Print Screen + // GalliumOS + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + 3, + numbersign, + F5 + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=,clearmods=Shift) + ] + }; + // Region Print Screen + // GalliumOS + replace key { + type[Group1]= "ONE_LEVEL_CTRL", + symbols[Group1]= [ + 4, + dollar, + F5 + ], + actions[Group1]= [ + NoAction(), + NoAction(), + RedirectKey(key=) + ] + }; +}; diff --git a/linux/xkb/.xkb/types/mac_gui b/linux/xkb/.xkb/types/mac_gui new file mode 100644 index 0000000..9c747d0 --- /dev/null +++ b/linux/xkb/.xkb/types/mac_gui @@ -0,0 +1,53 @@ +default partial xkb_types "addmac_levels" { + Virtual_modifiers Super; + type "ONE_LEVEL_CTRL" { + modifiers = Shift+Mod1+Super+Control; + map[Shift] = Level2; + map[Mod1] = Level3; + map[Shift+Mod1] = Level4; + map[Control] = Level5; + map[Shift+Control] = Level6; + map[Super] = Level7; + map[Shift+Super] = Level8; + map[Mod1+Control] = 9; + map[Super+Control] = 10; + map[Super+Mod1] = 11; + map[Super+Mod1+Control] = 12; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Alt"; + level_name[Level4] = "Shift Alt"; + level_name[Level5] = "Control"; + level_name[Level6] = "Shift Control"; + level_name[Level7] = "Super"; + level_name[Level8] = "Shift Super"; + level_name[9] = "Control Alt"; + level_name[10] = "Super Control"; + level_name[11] = "Super Alt"; + level_name[12] = "Super Control Alt"; + }; + type "ONE_LEVEL_CMD" { + modifiers = Shift+Control+Super; + map[Shift] = Level2; + map[Shift+Control] = Level3; + map[Control] = Level4; + map[Super] = Level5; + map[Shift+Super] = Level6; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Control Shift"; + level_name[Level4] = "Control"; + level_name[Level5] = "Super"; + level_name[Level6] = "Super Shift"; + }; + type "ONE_LEVEL_SUPER" { + modifiers = Shift+Super; + map[Shift] = Level2; + map[Super] = Level3; + map[Shift+Super] = Level4; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Super"; + level_name[Level4] = "Super Shift"; + }; +}; diff --git a/linux/xkb/.xkb/types/mac_term b/linux/xkb/.xkb/types/mac_term new file mode 100644 index 0000000..10fa367 --- /dev/null +++ b/linux/xkb/.xkb/types/mac_term @@ -0,0 +1,53 @@ +default partial xkb_types "addmac_levels" { + Virtual_modifiers Super; + type "ONE_LEVEL_CTRL" { + modifiers = Shift+Mod1+Super+Control; + map[Shift] = Level2; + map[Shift+Control] = Level3; + // map[Mod1] = Level4; + map[Shift+Mod1] = Level5; + map[Control] = Level6; + map[Super] = Level7; + map[Shift+Super] = Level8; + map[Mod1+Control] = 9; + map[Super+Control] = 10; + map[Super+Mod1] = 11; + map[Super+Mod1+Control] = 12; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Shift Control"; + // level_name[Level4] = "Alt"; + level_name[Level5] = "Shift Alt"; + level_name[Level6] = "Control"; + level_name[Level7] = "Super"; + level_name[Level8] = "Shift Super"; + level_name[9] = "Control Alt"; + level_name[10] = "Super Control"; + level_name[11] = "Super Alt"; + level_name[12] = "Super Control Alt"; + }; + type "ONE_LEVEL_CMD" { + modifiers = Shift+Control+Super; + map[Shift] = Level2; + map[Shift+Control] = Level3; + map[Control] = Level4; + map[Super] = Level5; + map[Shift+Super] = Level6; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Control Shift"; + level_name[Level4] = "Control"; + level_name[Level5] = "Super"; + level_name[Level6] = "Super Shift"; + }; + type "ONE_LEVEL_SUPER" { + modifiers = Shift+Super; + map[Shift] = Level2; + map[Super] = Level3; + map[Shift+Super] = Level4; + level_name[Level1] = "Base"; + level_name[Level2] = "Shift"; + level_name[Level3] = "Super"; + level_name[Level4] = "Super Shift"; + }; +}; diff --git a/linux/xkb/config/.chrome-nw b/linux/xkb/config/.chrome-nw new file mode 100644 index 0000000..7fd0b99 --- /dev/null +++ b/linux/xkb/config/.chrome-nw @@ -0,0 +1,7 @@ +"xdotool key --delay 0 --clearmodifiers Alt+Left" + Control + Left + Release + #Home + release + +"xdotool key --delay 0 --clearmodifiers Alt+Right" + Control + Right + Release + #End + release diff --git a/linux/xkb/config/.chrome-ww b/linux/xkb/config/.chrome-ww new file mode 100644 index 0000000..9717ad1 --- /dev/null +++ b/linux/xkb/config/.chrome-ww @@ -0,0 +1,5 @@ +"xdotool key --delay 0 --clearmodifiers Home" + Control + Left + Release + +"xdotool key --delay 0 --clearmodifiers End" + Control + Right + Release diff --git a/linux/xkb/config/.firefox-nw b/linux/xkb/config/.firefox-nw new file mode 100644 index 0000000..a2f2578 --- /dev/null +++ b/linux/xkb/config/.firefox-nw @@ -0,0 +1,7 @@ +#"xte 'keydown Control_L' 'key bracketleft' 'keyup Control_L'" +"xdotool key --delay 0 --clearmodifiers Control_L+bracketleft" + Home + Release + +#"xte 'keydown Control_R' 'key bracketright' 'keyup Control_R'" +"xdotool key --delay 0 --clearmodifiers Control_L+bracketright" + End + Release \ No newline at end of file diff --git a/linux/xkb/config/caret_status.sh b/linux/xkb/config/caret_status.sh new file mode 100755 index 0000000..375208b --- /dev/null +++ b/linux/xkb/config/caret_status.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +mkdir -p /tmp/kinto + +IBUSADD=$(cat ~/.config/ibus/bus/`ls ~/.config/ibus/bus -1rt | tail -n1` | awk -F'IBUS_ADDRESS=' '{print $2}' | xargs) +dbus-monitor --address $IBUSADD "path='/org/freedesktop/IBus/Panel',interface='org.freedesktop.IBus.Panel',member='FocusOut'" 2> /dev/null | grep --line-buffered -o -P '(?<=object path \"/org/freedesktop/IBus/InputContext_).*(?=[\"])' | +while read ln +do + printf '%s\n' "$ln" > /tmp/kinto/caret +done diff --git a/linux/xkb/config/cleanup.sh b/linux/xkb/config/cleanup.sh new file mode 100755 index 0000000..7165543 --- /dev/null +++ b/linux/xkb/config/cleanup.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +setxkbmap -option +# force command to run silently and report true +killall xbindkeys > /dev/null 2>&1 || : +# rm /tmp/kinto/caret + +gsettings set org.gnome.desktop.wm.keybindings switch-applications "['Tab']" +gsettings set org.gnome.desktop.wm.keybindings switch-applications-backward "['Tab']" +pkill -f /.config/kinto/xactive.sh \ No newline at end of file diff --git a/linux/xkb/config/defaults.json b/linux/xkb/config/defaults.json new file mode 100644 index 0000000..386c6c0 --- /dev/null +++ b/linux/xkb/config/defaults.json @@ -0,0 +1,86 @@ +{"defaultapps":[{ + "name":"term", + "appnames":[ "Gnome-terminal","konsole","io.elementary.terminal","xfce4-terminal","terminator","sakura","guake","tilda","xterm","eterm","kitty" ] + }], + "defaulttypes":["windows","mac","chromebook"], + "defaults":[{ + "id": 1, + "name":"Windows", + "type":"windows", + "active": false, + "description":"Standard Windows 104 Keyboards", + "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", + "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", + "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_win)+mac_term(mac_global)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"+mac_term(addmac_levels)" + }, + { + "id": 2, + "name":"Mac - hid driver (Recommended - Also supports Windows keyboards)", + "type":"mac", + "active": false, + "description":"Standard Mac Keyboards with Apple driver", + "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", + "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", + "xkb_symbols_gui":"+altwin(ctrl_alt_win)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term(mac_win)+mac_term(mac_global)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"+mac_term(addmac_levels)", + "hack": "echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd;echo 'options hid_apple swap_opt_cmd=1' | sudo tee -a /etc/modprobe.d/hid_apple.conf;sudo update-initramfs -u -k all" + }, + { + "id": 3, + "name":"Mac Only (VMs & non-official Apple keyboards)", + "type":"mac", + "active": true, + "description":"Standard Mac Keyboards", + "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", + "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", + "xkb_symbols_gui":"+ctrl(swap_lwin_lctl)+ctrl(swap_rwin_rctl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle)", + "xkb_symbols_term":"+altwin(alt_super_win)+mac_term(mac_apple)+mac_term(mac_global)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"+mac_term(addmac_levels)" + }, + { + "id": 4, + "name":"Chromebook (xfce)", + "type":"chromebook", + "active": false, + "description":"Standard Chromebook Keyboards", + "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", + "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term_chromebook(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"+mac_term(addmac_levels)" + }, + { + "id": 5, + "name":"Chromebook (xfce) - Windows", + "type":"chromebook", + "active": false, + "description":"Chromebook with Windows 104 Keyboard", + "gui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen; setxkbmap -device $usbid -option altwin:ctrl_alt_win", + "term":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", + "fallbackgui":"xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term_chromebook(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"+mac_term(addmac_levels)" + }, + { + "id": 6, + "name":"Chromebook (xfce) - Mac", + "type":"chromebook", + "active": false, + "description":"Chromebook with Mac Keyboard", + "gui":"setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY 2>&1 | grep -v XF86FullScreen", + "term":"setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.term $DISPLAY 2>&1 | grep -v XF86FullScreen", + "xkb_symbols_gui":"+chromebook(swap_lalt_lctrl)+mac_gui(mac_levelssym)+mac_gui(mac_appcycle_chromebook)", + "xkb_symbols_term":"+altwin(swap_alt_win)+mac_term_chromebook(mac_levelssym)", + "xkb_types_gui":"+mac_gui(addmac_levels)", + "xkb_types_term":"+mac_term(addmac_levels)" + }] +} \ No newline at end of file diff --git a/linux/xkb/config/dename.sh b/linux/xkb/config/dename.sh new file mode 100755 index 0000000..ae2392c --- /dev/null +++ b/linux/xkb/config/dename.sh @@ -0,0 +1,167 @@ +#!/bin/bash + +function detect_gnome() +{ + ps -e | grep -E '^.* gnome-session' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + fi + VERSION=`gnome-session --version | awk '{print $2}'` + DESKTOP="gnome" + return 1 +} + +function detect_kde4() +{ + ps -e | grep -E '^.* kded4$' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + else + VERSION=`kded4 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'` + DESKTOP="KDE" + return 1 + fi +} + +function detect_kde() +{ + ps -e | grep -E '^.* kded5$' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + else + VERSION=`kded5 --version | grep -m 1 'KDE' | awk -F ':' '{print $2}' | awk '{print $1}'` + DESKTOP="KDE" + return 1 + fi +} + +function detect_unity() +{ + ps -e | grep -E 'unity-panel' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + fi + VERSION=`unity --version | awk '{print $2}'` + DESKTOP="unity" + return 1 +} + +function detect_xfce() +{ + ps -e | grep -E '^.* xfce4-session$' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + fi + VERSION=`xfce4-session --version | grep xfce4-session | awk '{print $2}'` + DESKTOP="xfce" + return 1 +} + +function detect_cinnamon() +{ + ps -e | grep -E '^.* cinnamon$' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + fi + VERSION=`cinnamon --version | awk '{print $2}'` + DESKTOP="cinnamon" + return 1 +} + +function detect_mate() +{ + ps -e | grep -E '^.* mate-panel$' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + fi + VERSION=`mate-about --version | awk '{print $4}'` + DESKTOP="mate" + return 1 +} + +function detect_lxde() +{ + ps -e | grep -E '^.* lxsession$' > /dev/null + if [ $? -ne 0 ]; + then + return 0 + fi + + # We can detect LXDE version only thru package manager + which apt-cache > /dev/null 2> /dev/null + if [ $? -ne 0 ]; + then + which yum > /dev/null 2> /dev/null + if [ $? -ne 0 ]; + then + VERSION='unknown' + else + # For Fedora + VERSION=`yum list lxde-common | grep lxde-common | awk '{print $2}' | awk -F '-' '{print $1}'` + fi + else + # For Lubuntu and Knoppix + VERSION=`apt-cache show lxde-common /| grep 'Version:' | awk '{print $2}' | awk -F '-' '{print $1}'` + fi + DESKTOP="lxde" + return 1 +} + +function detect_sugar() +{ + if [ "$DESKTOP_SESSION" == "sugar" ]; + then + VERSION=`python -c "from jarabe import config; print config.version"` + DESKTOP="sugar" + else + return 0 + fi +} + + +DESKTOP="unknown" +if detect_unity; +then + if detect_kde; + then + if detect_kde4; + then + if detect_gnome; + then + if detect_xfce; + then + if detect_cinnamon; + then + if detect_mate; + then + if detect_lxde; + then + detect_sugar + fi + fi + fi + fi + fi + fi + fi +fi + + +if [ "$1" == '-v' ]; +then + echo $VERSION +else + if [ "$1" == '-n' ]; + then + echo $DESKTOP + else + echo $DESKTOP $VERSION + fi +fi \ No newline at end of file diff --git a/linux/xkb/config/keyswap_toggle.sh b/linux/xkb/config/keyswap_toggle.sh new file mode 100755 index 0000000..4e2bb8a --- /dev/null +++ b/linux/xkb/config/keyswap_toggle.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# Manual keyswap +systemtype=$1 +internalid=$2 +usbid=$3 +swapbehavior=$4 + +swapcmd_term="setxkbmap -option;setxkbmap -option altwin:swap_alt_win" +fallbackcmd_gui="" +if [[ "$systemtype" == "windows" || "$systemtype" == "mac" ]]; then + swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" +elif [[ "$systemtype" == "mac_only" ]]; then + swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY" +# Chromebook keyboard options +elif [[ "$swapbehavior" == "both_mac" ]]; then + swapcmd_gui="setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl; xkbcomp -w0 -i $internalid -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" + swapcmd_term="setxkbmap -option;setxkbmap -device $internalid -option 'altwin:swap_alt_win'" +elif [[ "$swapbehavior" == "both_win" ]]; then + swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY; setxkbmap -device $usbid -option altwin:ctrl_alt_win" + fallbackcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" +elif [[ "$swapbehavior" == "none" ]]; then + swapcmd_gui="setxkbmap -option;xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.chromebook.gui $DISPLAY" +fi + +if [[ "$systemtype" == "mac_only" ]]; then + check=`setxkbmap -query | grep -c 'alt_super_win'` +elif [[ "$swapbehavior" == "both_win" ]]; then + check=`setxkbmap -query | grep -q 'ctrl_alt_win'; echo $?` +else + check=`setxkbmap -query | grep -c 'swap_alt_win'` +fi + +echo $check +if [ $check -eq 0 ]; then + echo "internal gui to term" + eval "$swapcmd_term" +else + echo "internal term to gui" + eval "$swapcmd_gui" +fi \ No newline at end of file diff --git a/linux/xkb/config/kinto.desktop b/linux/xkb/config/kinto.desktop new file mode 100644 index 0000000..9bb45fb --- /dev/null +++ b/linux/xkb/config/kinto.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Kinto +GenericName=Kinto +Comment=Make Linux Type Like it's a Mac +Exec=/bin/bash -c "/bin/sleep 5 && /usr/bin/systemctl --user start keyswap" +Terminal=false +Type=Application +X-GNOME-Autostart-enabled=true \ No newline at end of file diff --git a/linux/xkb/config/user_config.json b/linux/xkb/config/user_config.json new file mode 100644 index 0000000..f2a8933 --- /dev/null +++ b/linux/xkb/config/user_config.json @@ -0,0 +1,76 @@ +{"config":[{ + "name":"gui", + "run":"", + "run_onInput":"", + "run_offInput": "killall xbindkeys > /dev/null 2>&1", + "symbols":"", + "types":"", + "de":[], + "appnames":[ "" ] + }, + { + "name":"term", + "run":"", + "run_onInput":"", + "run_offInput": "killall xbindkeys > /dev/null 2>&1", + "symbols":"", + "types":"", + "de":[], + "appnames":[ "alacritty","deepin-terminal","eterm","gnome-terminal","guake","hyper","io.elementary.terminal","kinto-gui.py","kitty","konsole","lxterminal","mate-terminal","qterminal","st","sakura","station","terminator","termite","tilda","tilix","urxvt","xfce4-terminal","xterm" ] + }, + { + "name": "firefox", + "run": "", + "run_onInput": "pkill -f ~/.config/kinto/.firefox-nw", + "run_offInput": "xbindkeys -f $HOME/.config/kinto/.firefox-nw", + "symbols": "", + "types": "", + "de": [], + "appnames": [ "Firefox" ] + }, + { + "name": "chrome", + "run": "", + "run_onInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "run_offInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui.chrome $DISPLAY", + "symbols": "", + "types": "", + "de": [], + "appnames": [ "Chromium","Chromium-browser","Google-chrome","Epiphany" ] + }], + "init": [], + "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], + "de":[{ + "id": 1, + "type": ["gnome3"], + "active": false, + "intent":"init", + "name":"gnome-init", + "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", + "run":"gsettings set org.gnome.mutter overlay-key ''", + "run_term":"", + "run_gui":"" + }, + { + "id": 2, + "type": ["gnome3"], + "active": false, + "intent":"gui_term", + "name":"Gnome Activities Overview", + "description":"Cmd+Space activates Activities Overview", + "run":"", + "run_term":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"", + "run_gui":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 3, + "type": ["kde5"], + "active": false, + "intent":"init", + "name":"kde-init", + "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", + "run":"kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure", + "run_term":"", + "run_gui":"" + }] +} \ No newline at end of file diff --git a/linux/xkb/config/xactive.sh b/linux/xkb/config/xactive.sh new file mode 100755 index 0000000..bf6de8f --- /dev/null +++ b/linux/xkb/config/xactive.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ $# -eq 0 ] + then + # No arguments + ./kintox11 +else + ./caret_status.sh & + ./kintox11 +fi diff --git a/linux/xkb/kintox11/binary/kintox11 b/linux/xkb/kintox11/binary/kintox11 new file mode 100755 index 0000000..ebeb40c Binary files /dev/null and b/linux/xkb/kintox11/binary/kintox11 differ diff --git a/linux/xkb/kintox11/src/Makefile b/linux/xkb/kintox11/src/Makefile new file mode 100644 index 0000000..e941cff --- /dev/null +++ b/linux/xkb/kintox11/src/Makefile @@ -0,0 +1,5 @@ +CFLAGS=-g $(shell pkg-config --cflags json-c xmu) +LDFLAGS=-g $(shell pkg-config --libs json-c xmu) + +all: + $(CC) kintox11.c $(CFLAGS) $(LDFLAGS) -lm -lpthread -o kintox11 diff --git a/linux/xkb/kintox11/src/kintox11.c b/linux/xkb/kintox11/src/kintox11.c new file mode 100644 index 0000000..2b0ac82 --- /dev/null +++ b/linux/xkb/kintox11/src/kintox11.c @@ -0,0 +1,694 @@ +// -*- coding:utf-8-unix; mode:c; -*- +// Kinto x11 command line +/* + Reference material + get the active window on X window system + http://k-ui.jp/blog/2012/05/07/get-active-window-on-x-window-system/ + */ +// To compile without static libraries +// gcc kintox11.c -lX11 -lXmu -ljson-c +// +// To compile with static library json-c +// Make sure archive with object files exist ar -t /usr/local/lib/libjson-c.a +// gcc -L/usr/local/lib/ kintox11.c -ljson-c -lXmu -lXt -lX11 -O2 -o kintox11 +// + +#define _GNU_SOURCE 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include // `apt-get install libx11-dev` +#include // `apt-get install libxmu-dev` +#include // `apt install libjson-c-dev` +#include +#include +#include +#ifdef WIN32 +#include +#elif _POSIX_C_SOURCE >= 199309L +#include // for nanosleep +#else +#include // for usleep +#endif + +const char *eventNames[34] = {"None","KeyPress","KeyRelease","ButtonPress","ButtonRelease","MotionNotify","EnterNotify","LeaveNotify","FocusIn","FocusOut","KeymapNotify","Expose","GraphicsExpose","NoExpose","VisibilityNotify","CreateNotify","DestroyNotify","UnmapNotify","MapNotify","MapRequest","ReparentNotify","ConfigureNotify","ConfigureRequest","ResizeRequest","CirculateNotify","CirculateRequest","PropertyNotify","SelectionClear","SelectionRequest","SelectionNotify","ColormapNotify","ClientMessage","MappingNotify"}; + +#define NUM_THREADS 2 +typedef struct threadArgs * ThreadArgs; +struct threadArgs{ + char *run_onInput; + char *run_offInput; +}; + +long long timeInMilliseconds(void) { + struct timeval tv; + + gettimeofday(&tv,NULL); + return (((long long)tv.tv_sec)*1000)+(tv.tv_usec/1000); +} + +bool debug; +bool input_check = 0; +long long int event_ts; +int last_event; + +Display* d; +Window w; +XEvent e; + +// cross-platform sleep function +void sleep_ms(int milliseconds) { + #ifdef WIN32 + Sleep(milliseconds); + #elif _POSIX_C_SOURCE >= 199309L + struct timespec ts; + ts.tv_sec = milliseconds / 1000; + ts.tv_nsec = (milliseconds % 1000) * 1000000; + nanosleep(&ts, NULL); + #else + usleep(milliseconds * 1000); + #endif +} + +char *trimwhitespace(char *str){ + char *end; + // Trim leading space + while(isspace((unsigned char)*str)) str++; + if(*str == 0) // All spaces? + return str; + // Trim trailing space + end = str + strlen(str) - 1; + while(end > str && isspace((unsigned char)*end)) end--; + // Write new null terminator character + end[1] = '\0'; + return str; +} + +int check_caret(){ + int caretint; + char * fpname; + fpname = malloc(sizeof(char)*20); + strcpy(fpname,"/tmp/kinto/caret"); + if( access( fpname, F_OK ) != -1 ) { + char *buffer = NULL; + size_t size = 0; + FILE *fp = fopen(fpname, "r"); + if (fp == NULL){ + return (0); + } + fseek(fp, 0, SEEK_END); + size = ftell(fp); + rewind(fp); + buffer = malloc((size + 1) * sizeof(*buffer)); + fread(buffer, size, 1, fp); + buffer[size] = '\0'; + trimwhitespace(buffer); + caretint = atoi(buffer); + fclose(fp); + if(caretint == 1){ + // printf("caret: %s\n", buffer); + return 1; + } + // printf("found nothing\n"); + return 0; + } + else{ + // printf("file %s does not exist\n",fpname); + return 0; + } +} + +void *inputToggle(void *argStruct) { + ThreadArgs args = argStruct; + + char * onInput; + char * offInput; + onInput = malloc(sizeof(char)*400); + offInput = malloc(sizeof(char)*400); + onInput = args->run_onInput; + offInput = args->run_offInput; + + Bool ran_onInput = 0; + + while(input_check){ + if(check_caret() && ran_onInput == 0){ + if(debug == true){ + printf("run_onInput: %s\n",onInput); + } + system(onInput); + ran_onInput = 1; + } + else if(!check_caret() && ran_onInput == 1){ + if(debug == true){ + printf("run_offInput: %s\n",offInput); + } + system(offInput); + ran_onInput = 0; + } + sleep_ms(100); + } + pthread_exit(NULL); +} + +void *nextPlease(void *threadid) { + long tid; + tid = (long)threadid; + + // printf("Next Please Thread ID, %ld\n", tid); + + // Reference http://www.rahul.net/kenton/xproto/xevents_errors.html + // event type 17 - DestroyNotify + // event type 18 - UnmapNotify + // event type 22 - ConfigureNotify + // Dismiss the following events by initiating another XNextEvent + XNextEvent(d, &e); + while(e.type != ConfigureNotify || (e.type == ConfigureNotify && last_event == ConfigureNotify && timeInMilliseconds()-event_ts < 419)){ + XNextEvent(d, &e); + } + // Unset input thread + input_check = 0; + last_event = e.type; + + if(debug == true){ + printf(" event: %s %d\n",eventNames[e.type-1],e.type); + printf(" duration: %lldms\n",timeInMilliseconds()-event_ts); + } + event_ts = timeInMilliseconds(); + + pthread_exit(NULL); +} + +char * append(char * string1, char * string2){ + char * result = NULL; + asprintf(&result, "%s,%s", string1, string2); + return result; +} + +static int wait_fd(int fd, double seconds){ + struct timeval tv; + fd_set in_fds; + FD_ZERO(&in_fds); + FD_SET(fd, &in_fds); + tv.tv_sec = trunc(seconds); + tv.tv_usec = (seconds - trunc(seconds))*1000000; + return select(fd+1, &in_fds, 0, 0, &tv); +} + +Bool xerror = False; + +int in_int(int a[],int size,int item){ + int i,pos=-1; + for(i=0;i< size;i++) + { + if(a[i]==item) + { + pos=i; + break; + } + } + return pos; +} + +int in(const char **arr, int len, char *target) { + int i; + for(i = 0; i < len; i++) { + if(strncmp(arr[i], target, strlen(target)) == 0) { + return i; + } + } + return -1; +} + +int strcicmp(char const *a, char const *b){ + for (;; a++, b++) { + int d = tolower((unsigned char)*a) - tolower((unsigned char)*b); + if (d != 0 || !*a) + return d; + } +} + +Display* open_display(){ + int i; + Display* d = XOpenDisplay(NULL); + for (i = 0; i < 60; i++) { + if(d == NULL){ + printf("fail to open X server display...\n"); + } + else{ + break; + } + sleep(1); + } + if(d == NULL){ + printf("fail to open X server display for 1 minute...\n"); + printf("Kintox11 is now exiting...\n"); + exit(1); + } + return d; +} + +int handle_error(Display* display, XErrorEvent* error){ + printf("X11 error: type=%d, serial=%lu, code=%d\n", + error->type, error->serial, (int)error->error_code); + xerror = True; + return 1; +} + +Window get_focus_window(Display* d, int etype, char const *eventName, char const *current_app, bool debug){ + Window w; + int revert_to; + + if(debug == true){ + printf("\n get focus window\n"); + } + + if(!(etype == DestroyNotify || etype == UnmapNotify)) { + XGetInputFocus(d, &w, &revert_to); // see man + if(debug == true){ + printf(" -%s: event: %d, window_id: %ld\n",current_app,etype,w); + } + } + + if(xerror){ + printf("*Error getting focused window, e.type: %d, current_app: %s\n",etype,current_app); + exit(1); + }else if(w == None){ + printf("*no focus window, e.type: %d, current_app: %s\n",etype,current_app); + exit(1); + } + + return w; +} + +// get the top window. +// a top window have the following specifications. +// * the start window is contained the descendent windows. +// * the parent window is the root window. +Window get_top_window(Display* d, Window start, int etype, char const *eventName, char const *current_app, bool debug){ + Window w = start; + Window parent = start; + Window root = None; + Window *children; + unsigned int nchildren; + Status s; + char * ws; + char * wstr; + ws = malloc(sizeof(char)*4096); + wstr = malloc(sizeof(char)*100); + // strcpy(wstr,"test,"); + + if(debug == true){ + printf("\n get top window\n"); + } + // Checking for Destroy and Unmap Notify events here too + // Sometimes they still get passed through and if so need + // to be ignored or XQueryTree will cause a segmentation fault + while (parent != root && parent != 0 && !(etype == DestroyNotify || etype == UnmapNotify)) { + w = parent; + + s = XQueryTree(d, w, &root, &parent, &children, &nchildren); // see man + + sprintf(wstr, "%ld", w); + if ((ws != NULL) && (ws[0] == '\0')) { + strcpy(ws,wstr); + } + else{ + ws = append(ws, wstr); + } + + if (s) + XFree(children); + + if(xerror){ + printf("*fail to get top window: %ld, e.type: %d, current_app: %s\n",w,etype,current_app); + break; + } + } + + if(debug == true){ + printf(" -%s: event: %d, window_id: %s\n",current_app,etype,ws); + } + + return w; +} + +// search a named window (that has a WM_STATE prop) +// on the descendent windows of the argment Window. +Window get_named_window(Display* d, Window start, int etype, char const *eventName, char const *current_app, bool debug){ + Window w; + + if(debug == true){ + printf("\n get named window\n"); + } + // printf("getting named window ... "); + w = XmuClientWindow(d, start); // see man + + if(debug == true){ + printf(" -%s: event: %d, window_id: %ld\n\n",current_app,etype,w); + } + // if(w == start) + // printf("fail\n"); + // printf("success (window: %d)\n", (int) w); + return w; +} + +const char * str_window_class(Display* d, Window w, char *prior_app ){ + Status s; + XClassHint* class; + + class = XAllocClassHint(); // see man + if(xerror){ + // printf("ERROR: XAllocClassHint\n"); + } + + s = XGetClassHint(d, w, class); // see man + if(xerror || s){ + char * app_class; + app_class = malloc(sizeof(char)*100); + strcpy(app_class,class->res_class); + // printf("\tname: %s\n\tclass: %s\n", class->res_name, class->res_class); + return app_class; + }else{ + // char * error_msg; + // error_msg = malloc(sizeof(char)*50); + // strcpy(error_msg, "ERROR: XGetClassHint"); + return prior_app; + } +} + +int main(int argc, char *argv[]){ + + XInitThreads(); + + if(argc < 2){ + debug = false; + } + if(argc > 1 && (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "--debug") == 0 )){ + debug = true; + printf("Running in debug mode\n"); + } + + FILE *fp; + char buffer[10240]; + struct json_object *parsed_json, *config, *config_obj, + *config_obj_name, *config_obj_run, *config_obj_run_oninput, + *config_obj_run_offinput, *config_obj_de, *config_obj_appnames, + *appnames_obj, *init, *de, *de_obj, *de_obj_id, *de_obj_active, + *de_obj_run, *de_obj_runterm,*de_obj_rungui; + + int arraylen; + int appnames_len, init_len, de_len, config_de_len; + int system(const char *command); + + size_t i,n,r; + + printf("Importing user_config.json...\n"); + fp = fopen("user_config.json","r"); + fread(buffer, 10240, 1, fp); + fclose(fp); + + parsed_json = json_tokener_parse(buffer); + + config = json_object_object_get(parsed_json, "config"); + init = json_object_object_get(parsed_json, "init"); + de = json_object_object_get(parsed_json, "de"); + + arraylen = json_object_array_length(config); + init_len = json_object_array_length(init); + de_len = json_object_array_length(de); + + const char *name_array[arraylen]; + const char *run_array[arraylen]; + const char *run_oninput_array[arraylen]; + const char *run_offinput_array[arraylen]; + int init_array[init_len]; + + int de_id_array[de_len]; + Bool de_active_array[de_len]; + const char *de_run_array[de_len]; + const char *de_runterm_array[de_len]; + const char *de_rungui_array[de_len]; + + // Grab all de variable info needed + for (i = 0; i < de_len; i++) { + de_obj = json_object_array_get_idx(de, i); + de_obj_id = json_object_object_get(de_obj, "id"); + de_id_array[i] = json_object_get_int(de_obj_id); + de_obj_active = json_object_object_get(de_obj, "active"); + de_active_array[i] = json_object_get_int(de_obj_active); + de_obj_run = json_object_object_get(de_obj, "run"); + de_run_array[i] = json_object_get_string(de_obj_run); + de_obj_runterm = json_object_object_get(de_obj, "run_term"); + de_runterm_array[i] = json_object_get_string(de_obj_runterm); + de_obj_rungui = json_object_object_get(de_obj, "run_gui"); + de_rungui_array[i] = json_object_get_string(de_obj_rungui); + // printf("de_run_array[%ld]: %s\n",i,de_run_array[i]); + } + // de ends + + int appnames_max = 0; + int config_de_max = 0; + + for (i = 0; i < arraylen; i++) { + config_obj = json_object_array_get_idx(config, i); + config_obj_appnames = json_object_object_get(config_obj, "appnames"); + config_obj_de = json_object_object_get(config_obj, "de"); + + appnames_len = json_object_array_length(config_obj_appnames); + if (appnames_len > appnames_max){ + appnames_max = appnames_len; + } + config_de_len = json_object_array_length(config_obj_de); + if(config_de_len > config_de_max){ + config_de_max = config_de_len; + } + } + + const char *appnames_array[arraylen][appnames_max]; + int config_de_array[arraylen][config_de_max]; + + for (i = 0; i < arraylen; i++) { + config_obj = json_object_array_get_idx(config, i); + + config_obj_name = json_object_object_get(config_obj, "name"); + config_obj_run = json_object_object_get(config_obj, "run"); + config_obj_run_oninput = json_object_object_get(config_obj, "run_onInput"); + config_obj_run_offinput = json_object_object_get(config_obj, "run_offInput"); + + name_array[i] = json_object_get_string(config_obj_name); + run_array[i] = json_object_get_string(config_obj_run); + run_oninput_array[i] = json_object_get_string(config_obj_run_oninput); + run_offinput_array[i] = json_object_get_string(config_obj_run_offinput); + // printf("%s\n%s\n", json_object_get_string(config_obj_name), json_object_get_string(config_obj_run)); + + config_obj_appnames = json_object_object_get(config_obj, "appnames"); + appnames_len = json_object_array_length(config_obj_appnames); + for (n = 0; n < appnames_len; n++) { + // printf("name_array[i]: %s\n",name_array[i]); + if(!strcicmp(name_array[i], "gui")){ + appnames_array[i][n] = NULL; + // printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + } + else{ + appnames_array[i][n] = json_object_get_string(json_object_array_get_idx(config_obj_appnames, n)); + //printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + } + } + if(appnames_max > appnames_len){ + for (n = appnames_len; n < appnames_max; n++){ + appnames_array[i][n] = NULL; + //printf("%s i:%ld n:%ld %s\n",name_array[i],i,n,appnames_array[i][n]); + } + } + + config_obj_de = json_object_object_get(config_obj, "de"); + config_de_len = json_object_array_length(config_obj_de); + for (n = 0; n < config_de_max; n++) { + if(n < config_de_len){ + // printf("de value: %d\n",json_object_get_int(json_object_array_get_idx(config_obj_de, n))); + config_de_array[i][n] = json_object_get_int(json_object_array_get_idx(config_obj_de, n)); + } + else{ + // printf("de -1 value: %d\n",json_object_get_int(json_object_array_get_idx(config_obj_de, n))); + config_de_array[i][n] = -1; + } + + } + } + + printf("Data from user_config.json imported successfully.\n"); + + for (i = 0; i < init_len; i++) { + init_array[i] = json_object_get_int(json_object_array_get_idx(init, i)); + int de_id_idx = in_int(de_id_array, de_len, init_array[i]); + printf("Running init command: %s\n",de_run_array[de_id_idx]); + system(de_run_array[de_id_idx]); + } + + char *name; + + // for XmbTextPropertyToTextList + setlocale(LC_ALL, ""); // see man locale + + d = open_display(); + XSelectInput(d, DefaultRootWindow(d), SubstructureNotifyMask); + XSetErrorHandler(handle_error); + + char * run_normal; + char * run_onInput; + char * run_offInput; + char * prior_app; + char * current_app; + char * prior_category; + char * current_category; + run_onInput = malloc(sizeof(char)*400); + run_offInput = malloc(sizeof(char)*400); + run_normal = malloc(sizeof(char)*400); + prior_app = malloc(sizeof(char)*100); + current_app = malloc(sizeof(char)*100); + prior_category = malloc(sizeof(char)*100); + current_category = malloc(sizeof(char)*100); + strcpy(prior_app,"none"); + strcpy(prior_category,"none"); + + int remap_bool = 2; + + printf("Starting keyswap...\n"); + + // get active window + w = get_focus_window(d, 0, eventNames[0], current_app, debug); + w = get_top_window(d, w, 0, eventNames[0], current_app, debug); + w = get_named_window(d, w, 0, eventNames[0], current_app, debug); + + // XFetchName(d, w, &name); + // printf("window:%#x name:%s\n", w, name); + printf("First window name: %s \n\n",str_window_class(d, w,prior_app)); + + int breakouter; + last_event=0; + event_ts = timeInMilliseconds(); + + for (;;) + { + strcpy(current_app,str_window_class(d, w,prior_app)); + int category_idx; + // printf("current: %s\n",current_app); + breakouter = 0; + + // Cycle through category name array + // printf("%d\n",arraylen); + for(i = 0; i < arraylen; ++i){ + // Cycle through the maximum App name array in each category + for(n = 0; n < appnames_max; ++n){ + if (appnames_array[i][n] != NULL){ + // printf("%s\n",appnames_array[i][n]); + if(strcicmp(appnames_array[i][n], current_app) == 0){ + strcpy(current_category,name_array[i]); + category_idx = i; + // printf("Match found: %s: %s\n",current_category,current_app); + breakouter = 1; + break; + } + } + else if(i == arraylen-1 && breakouter==0){ + // printf("No match found, default to gui"); + strcpy(current_category,"gui"); + category_idx = in(name_array, arraylen, current_category); + // printf("Match found: %s: %s\n",current_category,current_app); + break; + } + else if(appnames_array[i][n] == NULL){ + break; + } + if(breakouter==1){ + break; + } + } + } + if(strcicmp(prior_category, current_category) != 0){ + // printf("prior: %s, current: %s\n",prior_category,current_category); + // printf("%d,%d,%d,%d\n",strcicmp(prior_category, "gui"),strcicmp(current_category, "firefox"),strcicmp(current_category, "gui"),strcicmp(prior_category, "firefox")); + // printf("%d,%d\n",(strcicmp(prior_category, "gui") != 0 && strcicmp(prior_category, "firefox") != 0),(strcicmp(current_category, "gui") != 0 && strcicmp(current_category, "firefox") != 0)); + printf("%s: %s\n",current_category,current_app); + // Make sure we're not switching between 2 GUI keymaps + // Firefox & Standard GUI apps + // strcicmp returns 0 for matches, <>0 for non-match + if((strcicmp(prior_category, "gui") != 0 && strcicmp(prior_category, "firefox") != 0) || (strcicmp(current_category, "gui") != 0 && strcicmp(current_category, "firefox") != 0)){ + if(debug == true){ + printf("run: %s\n",run_array[category_idx]); + } + system(run_array[category_idx]); + } + strcpy(run_normal,run_array[category_idx]); + strcpy(run_onInput,run_oninput_array[category_idx]); + strcpy(run_offInput,run_offinput_array[category_idx]); + system(run_offInput); + for(r = 0; r < config_de_max; r++){ + if(config_de_array[category_idx][r] != -1){ + int de_id_idx = in_int(de_id_array, de_len, config_de_array[category_idx][r]); + if(strcicmp(current_category, "term") == 0){ + if(debug == true){ + printf("Running de term command: %s\n",de_runterm_array[de_id_idx]); + } + system(de_runterm_array[de_id_idx]); + } + else{ + if(debug == true){ + printf("Running de gui command: %s\n",de_rungui_array[de_id_idx]); + } + system(de_rungui_array[de_id_idx]); + } + } + } + } + else if(strcicmp(prior_app, current_app) != 0){ + int indent = strlen(current_category)+2; + printf("%*c%s\n", indent, ' ',current_app); + } + + fflush(stdout); + + strcpy(prior_app,current_app); + strcpy(prior_category,current_category); + + if(strlen(run_onInput) > 0){ + input_check = 1; + } + else{ + input_check = 0; + } + + pthread_t threads[NUM_THREADS]; + int rc; + int i; + ThreadArgs args = (ThreadArgs)malloc(sizeof(struct threadArgs)); + args->run_onInput = run_onInput; + args->run_offInput = run_offInput; + for( i = 0; i < NUM_THREADS; i++ ) { + + if(i==0){ + rc = pthread_create(&threads[i], NULL, inputToggle, args); + } + else{ + rc = pthread_create(&threads[i], NULL, nextPlease, (void *)&i); + } + if (rc) { + printf("Error:unable to create thread, %d\n", rc); + exit(-1); + } + } + // wait for threads to close before continuing + for (int i = 0; i < NUM_THREADS; i++) { + pthread_join(threads[i], NULL); + } + + w = get_focus_window(d, e.type, eventNames[e.type-1], current_app, debug); + w = get_top_window(d, w, e.type, eventNames[e.type-1], current_app, debug); + w = get_named_window(d, w, e.type, eventNames[e.type-1], current_app, debug); + } +} \ No newline at end of file diff --git a/linux/xkb/systemd/keyswap.service b/linux/xkb/systemd/keyswap.service new file mode 100755 index 0000000..cfc5896 --- /dev/null +++ b/linux/xkb/systemd/keyswap.service @@ -0,0 +1,16 @@ +[Unit] +Description=keyswap for Terminal and GUI +PartOf=graphical-session.target + +[Service] +Type=simple +Restart=always +# eg DISPLAY=:0.0 +#Environment=DISPLAY={displayid} +RestartSec=1 +WorkingDirectory=/home/{username}/.config/kinto +ExecStart=/bin/bash -c "/home/{username}/.config/kinto/xactive.sh carrots" +ExecStop=/bin/bash /home/{username}/.config/kinto/cleanup.sh + +[Install] +WantedBy=default.target diff --git a/linux/xkb/systemd/keyswap.timer b/linux/xkb/systemd/keyswap.timer new file mode 100644 index 0000000..e2232c1 --- /dev/null +++ b/linux/xkb/systemd/keyswap.timer @@ -0,0 +1,11 @@ +# keyswap.timer +[Unit] +Description=Runs the keyswap.service 5 seconds after boot up + +[Timer] +#OnBootSec=5s +OnActiveSec=5s +Unit=keyswap.service + +[Install] +WantedBy=default.target diff --git a/linux/xkb/user_config.json b/linux/xkb/user_config.json new file mode 100644 index 0000000..f2a8933 --- /dev/null +++ b/linux/xkb/user_config.json @@ -0,0 +1,76 @@ +{"config":[{ + "name":"gui", + "run":"", + "run_onInput":"", + "run_offInput": "killall xbindkeys > /dev/null 2>&1", + "symbols":"", + "types":"", + "de":[], + "appnames":[ "" ] + }, + { + "name":"term", + "run":"", + "run_onInput":"", + "run_offInput": "killall xbindkeys > /dev/null 2>&1", + "symbols":"", + "types":"", + "de":[], + "appnames":[ "alacritty","deepin-terminal","eterm","gnome-terminal","guake","hyper","io.elementary.terminal","kinto-gui.py","kitty","konsole","lxterminal","mate-terminal","qterminal","st","sakura","station","terminator","termite","tilda","tilix","urxvt","xfce4-terminal","xterm" ] + }, + { + "name": "firefox", + "run": "", + "run_onInput": "pkill -f ~/.config/kinto/.firefox-nw", + "run_offInput": "xbindkeys -f $HOME/.config/kinto/.firefox-nw", + "symbols": "", + "types": "", + "de": [], + "appnames": [ "Firefox" ] + }, + { + "name": "chrome", + "run": "", + "run_onInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui $DISPLAY", + "run_offInput": "xkbcomp -w0 -I$HOME/.xkb ~/.xkb/keymap/kbd.mac.gui.chrome $DISPLAY", + "symbols": "", + "types": "", + "de": [], + "appnames": [ "Chromium","Chromium-browser","Google-chrome","Epiphany" ] + }], + "init": [], + "detypes":["gnome2","gnome3","kde4","kde5","xfce","i3wm"], + "de":[{ + "id": 1, + "type": ["gnome3"], + "active": false, + "intent":"init", + "name":"gnome-init", + "description":"Gnome - Remove Superkey Overlay keybinding to Activities Overview", + "run":"gsettings set org.gnome.mutter overlay-key ''", + "run_term":"", + "run_gui":"" + }, + { + "id": 2, + "type": ["gnome3"], + "active": false, + "intent":"gui_term", + "name":"Gnome Activities Overview", + "description":"Cmd+Space activates Activities Overview", + "run":"", + "run_term":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"", + "run_gui":"gsettings set org.gnome.desktop.wm.keybindings panel-main-menu \"['Space']\"" + }, + { + "id": 3, + "type": ["kde5"], + "active": false, + "intent":"init", + "name":"kde-init", + "description":"KDE Plasma 5 - Removes Superkey Overlay from the Launcher Menu", + "run":"kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta \"\";qdbus org.kde.KWin /KWin reconfigure", + "run_term":"", + "run_gui":"" + }] +} \ No newline at end of file