1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-23 06:38:05 +01:00

wmaker: replaced macro by an inline function, in X Modifier initialisation

A macro can be a source of problems, because the compiler has no type on
the arguments to make checks. Using an inline function allows to do those
checks, meaning clearer error messages, it provides clear info in case of
name collision, it is easier to maintain (no need for the hacky '\' for
multi-lines) and the scope of visibility can be controlled more easily (no
need for #undef).

Took opportunity to change a 0 to the constant NoSymbol which is the name
defined by X for this case and another to NULL which is the right way to
set a null pointer in C.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
This commit is contained in:
Christophe CURIS
2014-12-07 17:10:18 +01:00
committed by Carlos R. Mafra
parent d9438e65ef
commit de00154fa1
2 changed files with 45 additions and 32 deletions

View File

@@ -120,51 +120,61 @@ static void x_reset_modifier_mapping(Display * display)
int mode_bit = 0;
XModifierKeymap *x_modifier_keymap = XGetModifierMapping(display);
#define modwarn(name,old,other) \
wwarning ("%s (0x%x) generates %s, which is generated by %s.", \
name, code, index_to_name (old), other)
#define modbarf(name,other) \
wwarning ("%s (0x%x) generates %s, which is nonsensical.", \
name, code, other)
#define check_modifier(name,mask) \
if ((1<<modifier_index) != mask) \
wwarning ("%s (0x%x) generates %s, which is nonsensical.", \
name, code, index_to_name (modifier_index))
#define store_modifier(name,old) \
if (old && old != modifier_index) \
wwarning ("%s (0x%x) generates both %s and %s, which is nonsensical.", \
name, code, index_to_name (old), \
index_to_name (modifier_index)); \
if (modifier_index == ShiftMapIndex) modbarf (name,"ModShift"); \
else if (modifier_index == LockMapIndex) modbarf (name,"ModLock"); \
else if (modifier_index == ControlMapIndex) modbarf (name,"ModControl"); \
if (modifier_index == ShiftMapIndex) { modbarf (name,"ModShift"); } \
else if (modifier_index == LockMapIndex) { modbarf (name,"ModLock"); } \
else if (modifier_index == ControlMapIndex) { modbarf (name,"ModControl"); } \
else if (sym == XK_Mode_switch) \
mode_bit = modifier_index; /* Mode_switch is special, see below... */ \
else if (modifier_index == meta_bit && old != meta_bit) \
else if (modifier_index == meta_bit && old != meta_bit) { \
modwarn (name, meta_bit, "Meta"); \
else if (modifier_index == super_bit && old != super_bit) \
} else if (modifier_index == super_bit && old != super_bit) { \
modwarn (name, super_bit, "Super"); \
else if (modifier_index == hyper_bit && old != hyper_bit) \
} else if (modifier_index == hyper_bit && old != hyper_bit) { \
modwarn (name, hyper_bit, "Hyper"); \
else if (modifier_index == alt_bit && old != alt_bit) \
} else if (modifier_index == alt_bit && old != alt_bit) { \
modwarn (name, alt_bit, "Alt"); \
else \
} else \
old = modifier_index;
mkpm = x_modifier_keymap->max_keypermod;
for (modifier_index = 0; modifier_index < 8; modifier_index++)
for (modifier_key = 0; modifier_key < mkpm; modifier_key++) {
KeySym last_sym = 0;
for (column = 0; column < 4; column += 2) {
KeyCode code = x_modifier_keymap->modifiermap[modifier_index * mkpm
+ modifier_key];
KeySym sym = (code ? XkbKeycodeToKeysym(display, code, 0, column) : 0);
KeyCode code;
KeySym sym;
inline void modwarn(const char *key_name, int old_mod, const char *other_key)
{
wwarning("key %s (0x%x) generates %s, which is generated by %s",
key_name, code, index_to_name(old_mod), other_key);
}
inline void modbarf(const char *key_name, const char *other_mod)
{
wwarning("key %s (0x%x) generates %s, which is nonsensical",
key_name, code, other_mod);
}
inline void check_modifier(const char *key_name, int mask)
{
if ((1 << modifier_index) != mask)
modbarf(key_name, index_to_name(modifier_index));
}
code = x_modifier_keymap->modifiermap[modifier_index * mkpm + modifier_key];
sym = (code ? XkbKeycodeToKeysym(display, code, 0, column) : NoSymbol);
if (sym == last_sym)
continue;
last_sym = sym;
switch (sym) {
case XK_Mode_switch:
store_modifier("Mode_switch", mode_bit);
@@ -220,10 +230,6 @@ static void x_reset_modifier_mapping(Display * display)
}
}
}
#undef store_modifier
#undef check_modifier
#undef modwarn
#undef modbarf
/* If there was no Meta key, then try using the Alt key instead.
If there is both a Meta key and an Alt key, then the Alt key
@@ -238,7 +244,8 @@ static void x_reset_modifier_mapping(Display * display)
not interpret it as Mode_switch; and interpreting it as both would
be totally wrong. */
if (mode_bit) {
const char *warn = 0;
const char *warn = NULL;
if (mode_bit == meta_bit)
warn = "Meta", meta_bit = 0;
else if (mode_bit == hyper_bit)