default partial xkb_compatibility "misc" {

    virtual_modifiers  Alt,Meta,Super,Hyper,ScrollLock;

    // Interpretations for some other useful keys.

    interpret Terminate_Server {
	action = Terminate();
    };

    setMods.clearLocks= True;

    // Set the "Alt" virtual modifier.

    interpret Alt_L+Any {
	virtualModifier= Alt;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Alt_L {
	action = SetMods(modifiers=Alt);
    };

    interpret Alt_R+Any {
	virtualModifier= Alt;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Alt_R {
	action = SetMods(modifiers=Alt);
    };

    // Set the "Meta" virtual modifier.

    interpret Meta_L+Any {
	virtualModifier= Meta;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Meta_L {
	action = SetMods(modifiers=Meta);
    };

    interpret Meta_R+Any {
	virtualModifier= Meta;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Meta_R {
	action = SetMods(modifiers=Meta);
    };

    // Set the "Super" virtual modifier.

    interpret Super_L+Any {
	virtualModifier= Super;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Super_L {
	action = SetMods(modifiers=Super);
    };

    interpret Super_R+Any {
	virtualModifier= Super;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Super_R {
	action = SetMods(modifiers=Super);
    };

    // Set the "Hyper" virtual modifier.

    interpret Hyper_L+Any {
	virtualModifier= Hyper;
	action = SetMods(modifiers=modMapMods);
    };

    interpret Hyper_L {
	action = SetMods(modifiers=Hyper);
    };

    interpret Hyper_R+Any {
	virtualModifier= Hyper;
	action = SetMods(modifiers=modMapMods);
    };

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

    // Sets the "ScrollLock" virtual modifier and
    // makes it actually lock when pressed.  Sets
    // up a map for the scroll lock indicator.
    interpret Scroll_Lock+Any {
	virtualModifier= ScrollLock;
	action = LockMods(modifiers=modMapMods);
    };

    include "ledscroll"

    include "misc(assign_shift_left_action)"
    include "misc(assign_shift_right_action)"
};

partial xkb_compatibility "assign_shift_left_action" {
    // Because of the irreversible mapping of the Lock modifier to the
    // keysym Caps_Lock in symbols/pc, some combinations of options
    // involving e.g symbols/shift(lshift_both_capslock) may make
    // <LFSH> bound to the Lock modifier, creating unwanted behaviour.
    // The following statement ensures Shift_L always sets the Shift
    // modifier.
    setMods.clearLocks= True;
    interpret Shift_L {
	action = SetMods(modifiers = Shift);
    };
};

partial xkb_compatibility "assign_shift_right_action" {
    // A similar issue as assign_shift_left_action hereinabove may
    // happen to <RTSH> with some combinations of options,
    // involving e.g symbols/shift(shift_both_capslock) and
    // symbols/group(lalt_lshift_toggle). The following statement
    // ensures Shift_R always sets the Shift modifier.
    setMods.clearLocks= True;
    interpret Shift_R {
	action = SetMods(modifiers = Shift);
    };
};
