// Meta is mapped to second level of Alt keys.
partial modifier_keys
xkb_symbols "meta_alt" {
    key <LALT> { [ Alt_L, Meta_L ] };
    key <RALT> { type[Group1] = "TWO_LEVEL",
                 symbols[Group1] = [ Alt_R, Meta_R ] };
    modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
//  modifier_map Mod4 {};
};

// Alt is mapped to the Win keys (and the usual Alt keys).
partial modifier_keys
xkb_symbols "alt_win" {
    key <LWIN> { [ Alt_L ] };
    key <RWIN> { [ Alt_R ] };
    modifier_map Mod1 { <LWIN>, <RWIN> };
};

// Ctrl is mapped to the Win keys (and the usual Ctrl keys).
partial modifier_keys
xkb_symbols "ctrl_win" {
    key <LWIN> { [ Control_L ] };
    key <RWIN> { [ Control_R ] };
    modifier_map Control { <LWIN>, <RWIN> };
};

// Ctrl is mapped to the Alt keys, Alt to the Win keys, and Win to the Ctrl keys.
partial modifier_keys
xkb_symbols "ctrl_alt_win" {
    key <LALT> { [ Control_L, Control_L  ] };
    key <RALT> { type[Group1] = "TWO_LEVEL",
                 symbols[Group1] = [ Control_R, Control_R ] };
    key <LWIN> { [ Alt_L, Meta_L ] };
    key <RWIN> { [ Alt_R, Meta_R ] };
    key <LCTL> { [ Super_L ] };
    key <RCTL> { [ Super_R ] };
    modifier_map Control { <RALT>, <LALT> };
    modifier_map Mod1 { <LWIN>, <RWIN> };
    modifier_map Mod4 { <LCTL>, <RCTL> };
};

// Meta is mapped to the Win keys.
partial modifier_keys
xkb_symbols "meta_win" {
    key <LALT> { [ Alt_L, Alt_L ] };
    key <RALT> { type[Group1] = "TWO_LEVEL",
                 symbols[Group1] = [ Alt_R, Alt_R ] };
    key <LWIN> { [ Meta_L ] };
    key <RWIN> { [ Meta_R ] };
    modifier_map Mod1 { Alt_L, Alt_R };
    modifier_map Mod4 { <META>, Meta_L, Meta_R };
};

// Meta is mapped to the left Win key.
partial modifier_keys
xkb_symbols "left_meta_win" {
    key <LALT> { [ Alt_L, Alt_L ] };
    key <LWIN> { [ Meta_L ] };
    modifier_map Mod1 { Alt_L };
    modifier_map Mod4 { <META>, Meta_L };
};

// Hyper is mapped to the Win keys.
partial modifier_keys
xkb_symbols "hyper_win" {
    key <LWIN> { [ Hyper_L ] };
    key <RWIN> { [ Hyper_R ] };
    modifier_map Mod4 { Hyper_L, Hyper_R };
};

// Menu is mapped to the Menu key.
partial modifier_keys
xkb_symbols "menu" {
    key <MENU> { [ Menu ] };
};

// Layout for Tux key caps with additional right Alt key
partial modifier_keys
xkb_symbols "alt_super_win" {
    key <LALT> { [ Alt_L, Meta_L ] };
    key <RWIN> { [ Alt_R, Meta_R ] };
    key <LWIN> { [ Super_L ]};
    key <MENU> { [ Super_R ] };
    modifier_map Mod1 { Alt_L, Alt_R, Meta_L, Meta_R };
    modifier_map Mod4 { Super_L, Super_R };
};

// Swap the Alt and Win keys.
partial modifier_keys
xkb_symbols "swap_alt_win" {
    include "altwin(swap_lalt_lwin)"
    include "altwin(swap_ralt_rwin)"
};

// Swap the left Alt and Win keys.
hidden partial modifier_keys
xkb_symbols "swap_lalt_lwin" {
    key <LALT> { type[Group1] = "ONE_LEVEL",
                 symbols[Group1] = [ Super_L ] };
    key <LWIN> { [ Alt_L, Meta_L ] };
};

// Swap the right Alt and Win keys.
hidden partial modifier_keys
xkb_symbols "swap_ralt_rwin" {
    key <RALT> { type[Group1] = "ONE_LEVEL",
                 symbols[Group1] = [ Super_R ] };
    key <RWIN> { [ Alt_R, Meta_R ] };
};
