95 lines
2.7 KiB
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;
|
|
}
|