Modernize struct xkb_mods
authorRan Benita <ran234@gmail.com>
Wed, 8 Aug 2012 23:33:51 +0000 (02:33 +0300)
committerRan Benita <ran234@gmail.com>
Fri, 10 Aug 2012 10:45:58 +0000 (13:45 +0300)
commit07b18bde1796725220605e919eaf02b620db2bd8
tree99b6a212a615f8fa49f14e10208dcf6bb7db5f94
parent45cd92b4d3ddb14027123c9b6f85ed471c02b4f9
Modernize struct xkb_mods

Currently xkb_mods has the following members:
- uint8_t real_mods - 8 X11 core mods
- xkb_mod_mask_t vmods - 16 virtual mods, zero-based index
- xkb_mod_mask_t mask - the computed effective *real* modifier mask,
  basically a cache for the first two which is:
  real_mods | real mods computed from vmods

Our API acts on masks which combine the real_mods and vmods into a
single value, which is:
8 first bits real mods | 16 next bits virtual mods
(XkbNumModifiers = 8, XkbNumVirtualMods = 16). This is also the format
which ResolveVModMask uses (which is where all the modifier masks really
"come from", e.g. "Shift+Lock+Level5" -> xkb_mod_mask_t).

What the code does now after getting the mask from ResolveVModMask, is
to break it into real part and virtual part and store them seperately,
and then join them back together when the effective mask is calculated.

This is all pretty useless work. We change xkb_mods to the following:
- xkb_mod_mask_t mods - usually what ResolveVModMask returns
- xkb_mod_mask_t mask - the computed mask cache
And try to consistently use the word "mods" for the original,
non-effective mods and mask for the effective mods (which can only
contain real mods for now, because things break otherwise).

The separation is also made clearer. The effective masks are computed by
UpdateModifiersFromCompat after all the sections have been compiled;
before this the mask field is never touched; after this (i.e. map.c and
state.c) the original mods field is never touched. This single execption
to this rule is keymap-dump.c: it needs to print out only the original
modifiers, not computed ones. This is also the reason why we actually
keep two fields instead keeping one and modifying it in place.

The next logical step is probably to turn the real mods into vmods
themselves, and get rid of the distinction entirely (in a compatible
way).

Signed-off-by: Ran Benita <ran234@gmail.com>
src/keymap-dump.c
src/state.c
src/text.c
src/text.h
src/xkb-priv.h
src/xkbcomp/action.c
src/xkbcomp/compat.c
src/xkbcomp/keytypes.c
src/xkbcomp/vmod.c
src/xkbcomp/xkbcomp-priv.h