windowmaker-wl/src/xmodifier.c

95 lines
2.7 KiB
C

/*
* 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 <string.h>
#include <strings.h>
#include <WINGs/WUtil.h>
#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;
}