Hash :
44c8deb2
Author :
Date :
2025-05-07T10:20:25
Introduce keymap format v2 and make it the default for parsing - Added `XKB_KEYMAP_FORMAT_TEXT_V2`. - Made `xkb_keymap_new_from_names()` use the new keymap format. - Made the tools default to the new keymap format for input. This is in preparation for changes in the parsing & state handling. For now it changes nothing.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
/*
* Copyright © 2025 Pierre Le Marre <dev@wismill.eu>
*
* SPDX-License-Identifier: MIT
*/
#include "config.h"
#include <string.h>
#include "utils.h"
#include "keymap-formats.h"
/* [WARNING] Must be in ascending order */
static const enum xkb_keymap_format keymap_formats[] = {
XKB_KEYMAP_FORMAT_TEXT_V1,
XKB_KEYMAP_FORMAT_TEXT_V2,
};
/*
* Human-friendly formats labels
*
* They are aimed to be used in the CLI tools and to be *stable*. While the
* current labels are simply “v” + corresponding `xkb_keymap_format` values, it
* may change in the future. Indeed, `xkb_keymap_format` encoding may change
* (although we avoit it) while the corresponding labels remain unchanged.
*/
struct format_label {
const char* label;
enum xkb_keymap_format format;
};
static const struct format_label keymap_formats_labels [] = {
{ "v1", XKB_KEYMAP_FORMAT_TEXT_V1 },
{ "v2", XKB_KEYMAP_FORMAT_TEXT_V2 },
};
size_t
xkb_keymap_supported_formats(const enum xkb_keymap_format **formats)
{
*formats = keymap_formats;
return ARRAY_SIZE(keymap_formats);
}
bool
xkb_keymap_is_supported_format(enum xkb_keymap_format format)
{
for (size_t k = 0; k < ARRAY_SIZE(keymap_formats); k++) {
if (keymap_formats[k] == format)
return true;
/* Short-circuit because array is sorted */
if (keymap_formats[k] > format)
return false;
}
return false;
}
enum xkb_keymap_format
xkb_keymap_parse_format(const char *raw)
{
if (!raw)
return 0;
if (raw[0] != 'v') {
/* Parse numeric format */
const int format = atoi(raw);
return (xkb_keymap_is_supported_format(format)) ? format : 0;
} else {
/* Parse format label: “vXXX” */
for (size_t k = 0; k < ARRAY_SIZE(keymap_formats_labels); k++) {
if (strcmp(raw, keymap_formats_labels[k].label) == 0)
return keymap_formats_labels[k].format;
}
return 0;
}
}