/************************************************************
- Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
-
- Permission to use, copy, modify, and distribute this
- software and its documentation for any purpose and without
- fee is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting
- documentation, and that the name of Silicon Graphics not be
- used in advertising or publicity pertaining to distribution
- of the software without specific prior written permission.
- Silicon Graphics makes no representation about the suitability
- of this software for any purpose. It is provided "as is"
- without any express or implied warranty.
-
- SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
- GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
- THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
+ * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting
+ * documentation, and that the name of Silicon Graphics not be
+ * used in advertising or publicity pertaining to distribution
+ * of the software without specific prior written permission.
+ * Silicon Graphics makes no representation about the suitability
+ * of this software for any purpose. It is provided "as is"
+ * without any express or implied warranty.
+ *
+ * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+ * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+ * THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
********************************************************/
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-#include "xkbmisc.h"
-#include "X11/extensions/XKBcommon.h"
-#include "XKBcommonint.h"
-#include <X11/extensions/XKM.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-
-#define BUFFER_SIZE 1024
-static char textBuffer[BUFFER_SIZE];
-static int tbNext = 0;
-
-static char *
-tbGetBuffer(unsigned int size)
-{
- char *rtrn;
+#include "config.h"
- if (size >= BUFFER_SIZE)
- return NULL;
+#include "keymap.h"
+#include "text.h"
- if ((BUFFER_SIZE - tbNext) <= size)
- tbNext = 0;
+bool
+LookupString(const LookupEntry tab[], const char *string,
+ unsigned int *value_rtrn)
+{
+ if (!string)
+ return false;
- rtrn = &textBuffer[tbNext];
- tbNext += size;
+ for (const LookupEntry *entry = tab; entry->name; entry++) {
+ if (istreq(entry->name, string)) {
+ *value_rtrn = entry->value;
+ return true;
+ }
+ }
- return rtrn;
+ return false;
}
-char *
-XkbcVModIndexText(XkbcDescPtr xkb, unsigned ndx)
+const char *
+LookupValue(const LookupEntry tab[], unsigned int value)
{
- int len;
- uint32_t *vmodNames;
- char *rtrn, *tmp = NULL;
-
- if (xkb && xkb->names)
- vmodNames = xkb->names->vmods;
- else
- vmodNames = NULL;
-
- if (ndx >= XkbNumVirtualMods)
- tmp = strdup("illegal");
- else if (vmodNames && (vmodNames[ndx] != None))
- tmp = XkbcAtomGetString(vmodNames[ndx]);
-
- if (!tmp) {
- tmp = malloc(20 * sizeof(char));
- snprintf(tmp, 20, "%d", ndx);
- }
+ for (const LookupEntry *entry = tab; entry->name; entry++)
+ if (entry->value == value)
+ return entry->name;
- len = strlen(tmp) + 1;
- if (len >= BUFFER_SIZE)
- len = BUFFER_SIZE - 1;
+ return NULL;
+}
- rtrn = tbGetBuffer(len);
- strncpy(rtrn, tmp, len);
+const LookupEntry ctrlMaskNames[] = {
+ { "RepeatKeys", CONTROL_REPEAT },
+ { "Repeat", CONTROL_REPEAT },
+ { "AutoRepeat", CONTROL_REPEAT },
+ { "SlowKeys", CONTROL_SLOW },
+ { "BounceKeys", CONTROL_DEBOUNCE },
+ { "StickyKeys", CONTROL_STICKY },
+ { "MouseKeys", CONTROL_MOUSEKEYS },
+ { "MouseKeysAccel", CONTROL_MOUSEKEYS_ACCEL },
+ { "AccessXKeys", CONTROL_AX },
+ { "AccessXTimeout", CONTROL_AX_TIMEOUT },
+ { "AccessXFeedback", CONTROL_AX_FEEDBACK },
+ { "AudibleBell", CONTROL_BELL },
+ { "IgnoreGroupLock", CONTROL_IGNORE_GROUP_LOCK },
+ { "all", CONTROL_ALL },
+ { "none", 0 },
+ { "Overlay1", 0 },
+ { "Overlay2", 0 },
+ { NULL, 0 }
+};
- free(tmp);
+const LookupEntry modComponentMaskNames[] = {
+ { "base", XKB_STATE_MODS_DEPRESSED },
+ { "latched", XKB_STATE_MODS_LATCHED },
+ { "locked", XKB_STATE_MODS_LOCKED },
+ { "effective", XKB_STATE_MODS_EFFECTIVE },
+ { "compat", XKB_STATE_MODS_EFFECTIVE },
+ { "any", XKB_STATE_MODS_EFFECTIVE },
+ { "none", 0 },
+ { NULL, 0 }
+};
- return rtrn;
-}
+const LookupEntry groupComponentMaskNames[] = {
+ { "base", XKB_STATE_LAYOUT_DEPRESSED },
+ { "latched", XKB_STATE_LAYOUT_LATCHED },
+ { "locked", XKB_STATE_LAYOUT_LOCKED },
+ { "effective", XKB_STATE_LAYOUT_EFFECTIVE },
+ { "any", XKB_STATE_LAYOUT_EFFECTIVE },
+ { "none", 0 },
+ { NULL, 0 }
+};
-char *
-XkbcVModMaskText(XkbcDescPtr xkb, unsigned modMask, unsigned mask)
-{
- int i, bit, len, rem;
- char *mm = NULL, *rtrn, *str;
- char buf[BUFFER_SIZE];
+const LookupEntry groupMaskNames[] = {
+ { "Group1", 0x01 },
+ { "Group2", 0x02 },
+ { "Group3", 0x04 },
+ { "Group4", 0x08 },
+ { "Group5", 0x10 },
+ { "Group6", 0x20 },
+ { "Group7", 0x40 },
+ { "Group8", 0x80 },
+ { "none", 0x00 },
+ { "all", 0xff },
+ { NULL, 0 }
+};
- if ((modMask == 0) && (mask == 0))
- return "none";
+const LookupEntry groupNames[] = {
+ { "Group1", 1 },
+ { "Group2", 2 },
+ { "Group3", 3 },
+ { "Group4", 4 },
+ { "Group5", 5 },
+ { "Group6", 6 },
+ { "Group7", 7 },
+ { "Group8", 8 },
+ { NULL, 0 }
+};
- if (modMask != 0)
- mm = XkbcModMaskText(modMask, False);
+const LookupEntry levelNames[] = {
+ { "Level1", 1 },
+ { "Level2", 2 },
+ { "Level3", 3 },
+ { "Level4", 4 },
+ { "Level5", 5 },
+ { "Level6", 6 },
+ { "Level7", 7 },
+ { "Level8", 8 },
+ { NULL, 0 }
+};
- str = buf;
- buf[0]= '\0';
- rem = BUFFER_SIZE;
+const LookupEntry buttonNames[] = {
+ { "Button1", 1 },
+ { "Button2", 2 },
+ { "Button3", 3 },
+ { "Button4", 4 },
+ { "Button5", 5 },
+ { "default", 0 },
+ { NULL, 0 }
+};
- if (mask) {
- for (i = 0, bit = 1; i < XkbNumVirtualMods && rem > 1; i++, bit <<= 1)
- {
- if (!(mask & bit))
- continue;
+const LookupEntry useModMapValueNames[] = {
+ { "LevelOne", 1 },
+ { "Level1", 1 },
+ { "AnyLevel", 0 },
+ { "any", 0 },
+ { NULL, 0 }
+};
- len = snprintf(str, rem, "%s%s",
- (str != buf) ? "+" : "",
- XkbcVModIndexText(xkb, i));
- rem -= len;
- str += len;
- }
+const LookupEntry actionTypeNames[] = {
+ { "NoAction", ACTION_TYPE_NONE },
+ { "SetMods", ACTION_TYPE_MOD_SET },
+ { "LatchMods", ACTION_TYPE_MOD_LATCH },
+ { "LockMods", ACTION_TYPE_MOD_LOCK },
+ { "SetGroup", ACTION_TYPE_GROUP_SET },
+ { "LatchGroup", ACTION_TYPE_GROUP_LATCH },
+ { "LockGroup", ACTION_TYPE_GROUP_LOCK },
+ { "MovePtr", ACTION_TYPE_PTR_MOVE },
+ { "MovePointer", ACTION_TYPE_PTR_MOVE },
+ { "PtrBtn", ACTION_TYPE_PTR_BUTTON },
+ { "PointerButton", ACTION_TYPE_PTR_BUTTON },
+ { "LockPtrBtn", ACTION_TYPE_PTR_LOCK },
+ { "LockPtrButton", ACTION_TYPE_PTR_LOCK },
+ { "LockPointerButton", ACTION_TYPE_PTR_LOCK },
+ { "LockPointerBtn", ACTION_TYPE_PTR_LOCK },
+ { "SetPtrDflt", ACTION_TYPE_PTR_DEFAULT },
+ { "SetPointerDefault", ACTION_TYPE_PTR_DEFAULT },
+ { "Terminate", ACTION_TYPE_TERMINATE },
+ { "TerminateServer", ACTION_TYPE_TERMINATE },
+ { "SwitchScreen", ACTION_TYPE_SWITCH_VT },
+ { "SetControls", ACTION_TYPE_CTRL_SET },
+ { "LockControls", ACTION_TYPE_CTRL_LOCK },
+ { "Private", ACTION_TYPE_PRIVATE },
+ /* deprecated actions below here - unused */
+ { "RedirectKey", ACTION_TYPE_NONE },
+ { "Redirect", ACTION_TYPE_NONE },
+ { "ISOLock", ACTION_TYPE_NONE },
+ { "ActionMessage", ACTION_TYPE_NONE },
+ { "MessageAction", ACTION_TYPE_NONE },
+ { "Message", ACTION_TYPE_NONE },
+ { "DeviceBtn", ACTION_TYPE_NONE },
+ { "DevBtn", ACTION_TYPE_NONE },
+ { "DevButton", ACTION_TYPE_NONE },
+ { "DeviceButton", ACTION_TYPE_NONE },
+ { "LockDeviceBtn", ACTION_TYPE_NONE },
+ { "LockDevBtn", ACTION_TYPE_NONE },
+ { "LockDevButton", ACTION_TYPE_NONE },
+ { "LockDeviceButton", ACTION_TYPE_NONE },
+ { "DeviceValuator", ACTION_TYPE_NONE },
+ { "DevVal", ACTION_TYPE_NONE },
+ { "DeviceVal", ACTION_TYPE_NONE },
+ { "DevValuator", ACTION_TYPE_NONE },
+ { NULL, 0 },
+};
- str = buf;
- }
- else
- str = NULL;
+const LookupEntry symInterpretMatchMaskNames[] = {
+ { "NoneOf", MATCH_NONE },
+ { "AnyOfOrNone", MATCH_ANY_OR_NONE },
+ { "AnyOf", MATCH_ANY },
+ { "AllOf", MATCH_ALL },
+ { "Exactly", MATCH_EXACTLY },
+ { NULL, 0 },
+};
- len = ((str) ? strlen(str) : 0) + ((mm) ? strlen(mm) : 0) +
- ((str && mm) ? 1 : 0);
- if (len >= BUFFER_SIZE)
- len = BUFFER_SIZE - 1;
+const char *
+ModIndexText(struct xkb_context *ctx, const struct xkb_mod_set *mods,
+ xkb_mod_index_t ndx)
+{
+ if (ndx == XKB_MOD_INVALID)
+ return "none";
- rtrn = tbGetBuffer(len + 1);
- rtrn[0] = '\0';
+ if (ndx == XKB_MOD_NONE)
+ return "None";
- snprintf(rtrn, len + 1, "%s%s%s", (mm) ? mm : "",
- (mm && str) ? "+" : "", (str) ? str : "");
+ if (ndx >= mods->num_mods)
+ return NULL;
- return rtrn;
+ return xkb_atom_text(ctx, mods->mods[ndx].name);
}
-static char *modNames[XkbNumModifiers] = {
- "Shift",
- "Lock",
- "Control",
- "Mod1",
- "Mod2",
- "Mod3",
- "Mod4",
- "Mod5"
-};
-
-char *
-XkbcModIndexText(unsigned ndx)
+const char *
+ActionTypeText(enum xkb_action_type type)
{
- char *buf;
-
- if (ndx < XkbNumModifiers)
- return modNames[ndx];
- else if (ndx == XkbNoModifier)
- return "none";
+ const char *name = LookupValue(actionTypeNames, type);
+ return name ? name : "Private";
+}
- buf = tbGetBuffer(32);
- snprintf(buf, 32, "ILLEGAL_%02x", ndx);
+const char *
+KeysymText(struct xkb_context *ctx, xkb_keysym_t sym)
+{
+ char *buffer = xkb_context_get_buffer(ctx, 64);
+ xkb_keysym_get_name(sym, buffer, 64);
+ return buffer;
+}
+const char *
+KeyNameText(struct xkb_context *ctx, xkb_atom_t name)
+{
+ const char *sname = xkb_atom_text(ctx, name);
+ size_t len = strlen_safe(sname) + 3;
+ char *buf = xkb_context_get_buffer(ctx, len);
+ snprintf(buf, len, "<%s>", strempty(sname));
return buf;
}
-char *
-XkbcModMaskText(unsigned mask, Bool cFormat)
+const char *
+SIMatchText(enum xkb_match_operation type)
{
- int i, rem, bit;
- char *str, *buf;
+ return LookupValue(symInterpretMatchMaskNames, type);
+}
- if ((mask & 0xff) == 0xff)
- return (cFormat ? "0xff" : "all");
+const char *
+ModMaskText(struct xkb_context *ctx, const struct xkb_mod_set *mods,
+ xkb_mod_mask_t mask)
+{
+ char buf[1024] = {0};
+ size_t pos = 0;
+ xkb_mod_index_t i;
+ const struct xkb_mod *mod;
- if ((mask & 0xff) == 0)
- return (cFormat ? "0" : "none");
+ if (mask == 0)
+ return "none";
- rem = 64;
- buf = tbGetBuffer(rem);
- str = buf;
- buf[0] = '\0';
- for (i = 0, bit = 1; i < XkbNumModifiers && rem > 1; i++, bit <<= 1) {
- int len;
+ if (mask == MOD_REAL_MASK_ALL)
+ return "all";
- if (!(mask & bit))
+ xkb_mods_enumerate(i, mod, mods) {
+ int ret;
+
+ if (!(mask & (1u << i)))
continue;
- len = snprintf(str, rem, "%s%s%s",
- (str != buf) ? (cFormat ? "|" : "+") : "",
- modNames[i],
- cFormat ? "Mask" : "");
- rem -= len;
- str += len;
+ ret = snprintf(buf + pos, sizeof(buf) - pos, "%s%s",
+ pos == 0 ? "" : "+",
+ xkb_atom_text(ctx, mod->name));
+ if (ret <= 0 || pos + ret >= sizeof(buf))
+ break;
+ else
+ pos += ret;
}
- return buf;
+ return strcpy(xkb_context_get_buffer(ctx, pos + 1), buf);
}
-char *
-XkbcConfigText(unsigned config)
+const char *
+LedStateMaskText(struct xkb_context *ctx, enum xkb_state_component mask)
{
- switch (config) {
- case XkmSemanticsFile:
- return "Semantics";
- case XkmLayoutFile:
- return "Layout";
- case XkmKeymapFile:
- return "Keymap";
- case XkmGeometryFile:
- case XkmGeometryIndex:
- return "Geometry";
- case XkmTypesIndex:
- return "Types";
- case XkmCompatMapIndex:
- return "CompatMap";
- case XkmSymbolsIndex:
- return "Symbols";
- case XkmIndicatorsIndex:
- return "Indicators";
- case XkmKeyNamesIndex:
- return "KeyNames";
- case XkmVirtualModsIndex:
- return "VirtualMods";
- default:
- return "unknown";
- }
-}
+ char buf[1024];
+ size_t pos = 0;
-char *
-XkbcGeomFPText(int val)
-{
- char *buf;
- int whole, frac;
+ if (mask == 0)
+ return "0";
- buf = tbGetBuffer(12);
- whole = val / XkbGeomPtsPerMM;
- frac = val % XkbGeomPtsPerMM;
+ for (unsigned i = 0; mask; i++) {
+ int ret;
- if (frac != 0)
- snprintf(buf, 12, "%d.%d", whole, frac);
- else
- snprintf(buf, 12, "%d", whole);
+ if (!(mask & (1u << i)))
+ continue;
- return buf;
-}
+ mask &= ~(1u << i);
-static char *actionTypeNames[XkbSA_NumActions]= {
- "NoAction", /* XkbSA_NoAction */
- "SetMods", /* XkbSA_SetMods */
- "LatchMods", /* XkbSA_LatchMods */
- "LockMods", /* XkbSA_LockMods */
- "SetGroup", /* XkbSA_SetGroup */
- "LatchGroup", /* XkbSA_LatchGroup */
- "LockGroup", /* XkbSA_LockGroup */
- "MovePtr", /* XkbSA_MovePtr */
- "PtrBtn", /* XkbSA_PtrBtn */
- "LockPtrBtn", /* XkbSA_LockPtrBtn */
- "SetPtrDflt", /* XkbSA_SetPtrDflt */
- "ISOLock", /* XkbSA_ISOLock */
- "Terminate", /* XkbSA_Terminate */
- "SwitchScreen", /* XkbSA_SwitchScreen */
- "SetControls", /* XkbSA_SetControls */
- "LockControls", /* XkbSA_LockControls */
- "ActionMessage", /* XkbSA_ActionMessage */
- "RedirectKey", /* XkbSA_RedirectKey */
- "DeviceBtn", /* XkbSA_DeviceBtn */
- "LockDeviceBtn", /* XkbSA_LockDeviceBtn */
- "DeviceValuator" /* XkbSA_DeviceValuator */
-};
+ ret = snprintf(buf + pos, sizeof(buf) - pos, "%s%s",
+ pos == 0 ? "" : "+",
+ LookupValue(modComponentMaskNames, 1u << i));
+ if (ret <= 0 || pos + ret >= sizeof(buf))
+ break;
+ else
+ pos += ret;
+ }
-char *
-XkbcActionTypeText(unsigned type)
-{
- if (type <= XkbSA_LastAction)
- return actionTypeNames[type];
- return "Private";
+ return strcpy(xkb_context_get_buffer(ctx, pos + 1), buf);
}
-char *
-XkbcKeysymText(uint32_t sym)
+const char *
+ControlMaskText(struct xkb_context *ctx, enum xkb_action_controls mask)
{
- return XkbcKeysymToString(sym);
-}
+ char buf[1024];
+ size_t pos = 0;
-char *
-XkbcKeyNameText(char *name)
-{
- char *buf;
- int len;
+ if (mask == 0)
+ return "none";
- buf = tbGetBuffer(7);
- buf[0] = '<';
- strncpy(&buf[1], name, 4);
- buf[5] = '\0';
- len = strlen(buf);
- buf[len++] = '>';
- buf[len] = '\0';
+ if (mask == CONTROL_ALL)
+ return "all";
- return buf;
-}
+ for (unsigned i = 0; mask; i++) {
+ int ret;
-static char *siMatchText[5] = {
- "NoneOf", /* XkbSI_NoneOf */
- "AnyOfOrNone", /* XkbSI_AnyOfOrNone */
- "AnyOf", /* XkbSI_AnyOf */
- "AllOf", /* XkbSI_AllOf */
- "Exactly" /* XkbSI_Exactly */
-};
+ if (!(mask & (1u << i)))
+ continue;
-char *
-XkbcSIMatchText(unsigned type)
-{
- char *buf;
-
- switch (type & XkbSI_OpMask) {
- case XkbSI_NoneOf:
- return siMatchText[0];
- case XkbSI_AnyOfOrNone:
- return siMatchText[1];
- case XkbSI_AnyOf:
- return siMatchText[2];
- case XkbSI_AllOf:
- return siMatchText[3];
- case XkbSI_Exactly:
- return siMatchText[4];
- default:
- buf = tbGetBuffer(40);
- snprintf(buf, 40, "0x%x", type & XkbSI_OpMask);
- return buf;
+ mask &= ~(1u << i);
+
+ ret = snprintf(buf + pos, sizeof(buf) - pos, "%s%s",
+ pos == 0 ? "" : "+",
+ LookupValue(ctrlMaskNames, 1u << i));
+ if (ret <= 0 || pos + ret >= sizeof(buf))
+ break;
+ else
+ pos += ret;
}
+
+ return strcpy(xkb_context_get_buffer(ctx, pos + 1), buf);
}