I'm pretty sure both are possible in xkb. But you'll have to learn how to get a custom xkb_keymap into your DE of choice. I only learned enough to do one mapping:
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols {
include "pc+us+inet(evdev)"
key {
type= "TWO_LEVEL",
symbols[Group1] = [ Multi_key, Caps_Lock ],
actions[Group1] = [ NoAction(), LockMods(modifiers=Lock) ]
};
key {[ Escape ]};
};
xkb_geometry { include "pc(pc105)" };
};
This remaps Capslock to Escape, Escape to Compose, and Shift+Escape to Capslock. Not what you want, but hopefully this will give you a starting point to playing/breaking xkb.
Another benefit of doing this with xkb: it's now a separate codebase from X.org, and is used in every Wayland compositor I know of.