/* * xmodifier.c — modifier mask state shared between backends. * * The actual X11 keymap discovery (XGetModifierMapping et al.) lives in * the X11 backend; on Wayland the masks come from xkb via * wSetModifierMasks called from the Wayland backend. This file only * holds the cached masks and the portable name↔mask conversions used * by shared policy code (rootmenu.c, defaults.c, misc.c, usermenu.c). * * History: this file used to contain the modifier-keymap-walking code * (taken from XEmacs 20.3, original copyright Sudish Joseph, 1997, and * Free Software Foundation 1991-1995). That code now lives in * src/backend/x11/x11_backend.c (function x11_reset_modifier_mapping). */ #include "wconfig.h" #include #include #include #include "WindowMaker.h" /* WM_MOD_SHIFT, WM_MOD_CONTROL, WM_MOD_MOD1..5 */ #include "xmodifier.h" static int MetaMask, HyperMask, SuperMask, AltMask; const char *wXModifierToShortcutLabel(int mask) { if (mask < 0) return NULL; if (mask == WM_MOD_SHIFT) return "Sh+"; if (mask == WM_MOD_CONTROL) return "^"; if (mask == AltMask) return "A+"; if (mask == WM_MOD_MOD1) return "M1+"; if (mask == WM_MOD_MOD2) return "M2+"; if (mask == WM_MOD_MOD3) return "M3+"; if (mask == WM_MOD_MOD4) return "M4+"; if (mask == WM_MOD_MOD5) return "M5+"; if (mask == MetaMask) return "M+"; wwarning(_("Can't convert keymask 0x%04X to a shortcut label"), mask); return NULL; } int wXModifierFromKey(const char *key) { if (strcasecmp(key, "SHIFT") == 0 && WM_MOD_SHIFT != 0) return WM_MOD_SHIFT; else if (strcasecmp(key, "CONTROL") == 0 && WM_MOD_CONTROL != 0) return WM_MOD_CONTROL; else if (strcasecmp(key, "ALT") == 0 && AltMask != 0) return AltMask; else if (strcasecmp(key, "META") == 0 && MetaMask != 0) return MetaMask; else if (strcasecmp(key, "SUPER") == 0 && SuperMask != 0) return SuperMask; else if (strcasecmp(key, "HYPER") == 0 && HyperMask != 0) return HyperMask; else if (strcasecmp(key, "MOD1") == 0 && WM_MOD_MOD1 != 0) return WM_MOD_MOD1; else if (strcasecmp(key, "MOD2") == 0 && WM_MOD_MOD2 != 0) return WM_MOD_MOD2; else if (strcasecmp(key, "MOD3") == 0 && WM_MOD_MOD3 != 0) return WM_MOD_MOD3; else if (strcasecmp(key, "MOD4") == 0 && WM_MOD_MOD4 != 0) return WM_MOD_MOD4; else if (strcasecmp(key, "MOD5") == 0 && WM_MOD_MOD5 != 0) return WM_MOD_MOD5; else return -1; } /* * Set the standard modifier masks. Called from x11_backend.c after * XGetModifierMapping discovery, or from wl_backend.c with XKB defaults * (Mod1=Alt=Meta, Mod4=Super, Hyper=0). */ void wSetModifierMasks(int alt, int meta, int super, int hyper) { AltMask = alt; MetaMask = meta; SuperMask = super; HyperMask = hyper; }