default partial xkb_types "default" {

    // Some types that are necessary
    // for a full implementation of
    // a PC-compatible keyboard.

    virtual_modifiers  Alt, LevelThree;

    type "PC_SUPER_LEVEL2" {
	modifiers = Mod4;
	map[None] = Level1;
	map[Mod4] = Level2;
	level_name[Level1] = "Base";
	level_name[Level2] = "Super";
    };

    type "PC_CONTROL_LEVEL2" {
	modifiers = Control;
	map[None] = Level1;
	map[Control] = Level2;
	level_name[Level1] = "Base";
	level_name[Level2] = "Control";
    };

    type "PC_ALT_LEVEL2" {
	modifiers = Alt;
	map[None] = Level1;
	map[Alt] = Level2;
	level_name[Level1] = "Base";
	level_name[Level2] = "Alt";
    };

    type "CTRL+ALT" {
	modifiers = Shift + LevelThree + Control + Alt;
	map[None] = Level1;
	map[Shift] = Level2;
	map[LevelThree] = Level3;
	map[Shift+LevelThree] = Level4;
	map[Control+Alt] = Level5;
	preserve[Shift] = Shift;
	preserve[Shift+LevelThree] = Shift;
	level_name[Level1] = "Base";
	level_name[Level2] = "Shift";
	level_name[Level3] = "Alt Base";
	level_name[Level4] = "Shift Alt";
	level_name[Level5] = "Ctrl+Alt";
    };

    // Local eight level.
    // Needed when you want part of your layout eight-level but cannot use
    // LevelFive as modifier, as this will take over the right Ctrl by default
    // for the whole layout and is too invasive for the average four-level user.
    // Needed to fix bug #9529.
    // FIXME: Should really use RControl but it seems not to be enabled by
    // default and touching this requires a lot of testing.
    type "LOCAL_EIGHT_LEVEL" {
	modifiers = Shift + Lock + LevelThree + Control;

	map[None]       = Level1;
	map[Lock+Shift] = Level1;
	map[Shift] = Level2;
	map[Lock]  = Level2;

	map[LevelThree]            = Level3;
	map[Lock+Shift+LevelThree] = Level3;
	map[Shift+LevelThree] = Level4;
	map[Lock+LevelThree]  = Level4;

	map[Control]            = Level5;
	map[Lock+Shift+Control] = Level5;
	map[Shift+Control] = Level6;
	map[Lock+Control]  = Level6;

	map[LevelThree+Control]            = Level7;
	map[Lock+Shift+LevelThree+Control] = Level7;
	map[Shift+LevelThree+Control] = Level8;
	map[Lock+LevelThree+Control]  = Level8;

	level_name[Level1] = "Base";
	level_name[Level2] = "Shift";
	level_name[Level3] = "Level3";
	level_name[Level4] = "Shift Level3";
	level_name[Level5] = "Ctrl";
	level_name[Level6] = "Shift Ctrl";
	level_name[Level7] = "Level3 Ctrl";
	level_name[Level8] = "Shift Level3 Ctrl";
    };
};
