- xkb_mod_index_t i;
- xkb_mod_mask_t bit;
- xkb_mod_mask_t rmask, vmask;
- int len, rem;
- const char *mm = NULL;
- char *rtrn, *str;
- char buf[BUFFER_SIZE];
-
- rmask = cmask & 0xff;
- vmask = cmask >> XKB_NUM_CORE_MODS;
-
- if (rmask == 0 && vmask == 0)
- return "none";
-
- if (rmask != 0)
- mm = ModMaskText(rmask);
-
- str = buf;
- buf[0] = '\0';
- rem = BUFFER_SIZE;
-
- if (vmask != 0) {
- for (i = 0, bit = 1; i < XKB_NUM_VIRTUAL_MODS && rem > 1; i++, bit <<=
- 1) {
- if (!(vmask & bit))
- continue;
-
- len = snprintf(str, rem, "%s%s",
- (str != buf) ? "+" : "",
- VModIndexText(keymap, i));
- rem -= len;
- str += len;
- }
-
- str = buf;
- }
- else
- str = NULL;
-
- len = (str ? strlen(str) : 0) + (mm ? strlen(mm) : 0) +
- (str && mm ? 1 : 0);
- if (len >= BUFFER_SIZE)
- len = BUFFER_SIZE - 1;
-
- rtrn = GetBuffer(len + 1);
- rtrn[0] = '\0';
-
- snprintf(rtrn, len + 1, "%s%s%s", (mm ? mm : ""),
- (mm && str ? "+" : ""), (str ? str : ""));
-
- return rtrn;
+ char *buffer = xkb_context_get_buffer(ctx, 64);
+ xkb_keysym_get_name(sym, buffer, 64);
+ return buffer;