Interactive tools: add options to hide some fields

Display can be cluttered when too many fields are displayed.

Add options to hide some default fields
master
Pierre Le Marre 2023-09-18 12:15:06 +02:00 committed by Wismill
parent c23c6bb996
commit b5079dc96d
5 changed files with 56 additions and 23 deletions

View File

@ -58,6 +58,8 @@ static int evdev_offset = 8;
static bool report_state_changes;
static bool with_compose;
static enum xkb_consumed_mode consumed_mode = XKB_CONSUMED_MODE_XKB;
#define DEFAULT_PRINT_FIELDS PRINT_ALL_FIELDS
print_state_fields_mask_t print_fields = DEFAULT_PRINT_FIELDS;
#define DEFAULT_INCLUDE_PATH_PLACEHOLDER "__defaults__"
#define NLONGS(n) (((n) + LONG_BIT - 1) / LONG_BIT)
@ -271,9 +273,12 @@ process_event(struct keyboard *kbd, uint16_t type, uint16_t code, int32_t value)
xkb_compose_state_feed(kbd->compose_state, keysym);
}
if (value != KEY_STATE_RELEASE)
tools_print_keycode_state(kbd->state, kbd->compose_state, keycode,
consumed_mode);
if (value != KEY_STATE_RELEASE) {
tools_print_keycode_state(
kbd->state, kbd->compose_state, keycode,
consumed_mode, print_fields
);
}
if (with_compose) {
status = xkb_compose_state_get_status(kbd->compose_state);
@ -373,6 +378,7 @@ usage(FILE *fp, char *progname)
fprintf(fp, " or: %s --keymap <path to keymap file>\n",
progname);
fprintf(fp, "For both:\n"
" --short (do not print layout nor Unicode keysym translation)\n"
" --report-state-changes (report changes to the state)\n"
" --enable-compose (enable Compose)\n"
" --consumed-mode={xkb|gtk} (select the consumed modifiers mode, default: xkb)\n"
@ -410,6 +416,7 @@ main(int argc, char *argv[])
OPT_WITHOUT_X11_OFFSET,
OPT_CONSUMED_MODE,
OPT_COMPOSE,
OPT_SHORT,
OPT_REPORT_STATE,
};
static struct option opts[] = {
@ -424,6 +431,7 @@ main(int argc, char *argv[])
{"keymap", required_argument, 0, OPT_KEYMAP},
{"consumed-mode", required_argument, 0, OPT_CONSUMED_MODE},
{"enable-compose", no_argument, 0, OPT_COMPOSE},
{"short", no_argument, 0, OPT_SHORT},
{"report-state-changes", no_argument, 0, OPT_REPORT_STATE},
{"without-x11-offset", no_argument, 0, OPT_WITHOUT_X11_OFFSET},
{0, 0, 0, 0},
@ -481,6 +489,9 @@ main(int argc, char *argv[])
case OPT_COMPOSE:
with_compose = true;
break;
case OPT_SHORT:
print_fields &= ~PRINT_VERBOSE_FIELDS;
break;
case OPT_CONSUMED_MODE:
if (strcmp(optarg, "gtk") == 0) {
consumed_mode = XKB_CONSUMED_MODE_GTK;

View File

@ -400,7 +400,8 @@ kbd_key(void *data, struct wl_keyboard *wl_kbd, uint32_t serial, uint32_t time,
printf("%s: ", seat->name_str);
tools_print_keycode_state(seat->state, NULL, key + EVDEV_OFFSET,
XKB_CONSUMED_MODE_XKB);
XKB_CONSUMED_MODE_XKB,
PRINT_ALL_FIELDS);
/* Exit on ESC. */
if (xkb_state_key_get_one_sym(seat->state, key + EVDEV_OFFSET) == XKB_KEY_Escape)

View File

@ -243,7 +243,8 @@ process_event(xcb_generic_event_t *gevent, struct keyboard *kbd)
xkb_keycode_t keycode = event->detail;
tools_print_keycode_state(kbd->state, NULL, keycode,
XKB_CONSUMED_MODE_XKB);
XKB_CONSUMED_MODE_XKB,
PRINT_ALL_FIELDS);
/* Exit on ESC. */
if (xkb_state_key_get_one_sym(kbd->state, keycode) == XKB_KEY_Escape)

View File

@ -65,7 +65,8 @@ void
tools_print_keycode_state(struct xkb_state *state,
struct xkb_compose_state *compose_state,
xkb_keycode_t keycode,
enum xkb_consumed_mode consumed_mode)
enum xkb_consumed_mode consumed_mode,
print_state_fields_mask_t fields)
{
struct xkb_keymap *keymap;
@ -109,25 +110,29 @@ tools_print_keycode_state(struct xkb_state *state,
}
printf("] ");
if (status == XKB_COMPOSE_COMPOSED)
xkb_compose_state_get_utf8(compose_state, s, sizeof(s));
else
xkb_state_key_get_utf8(state, keycode, s, sizeof(s));
/* HACK: escape single control characters from C0 set using the
* Unicode codepoint convention. Ideally we would like to escape
* any non-printable character in the string.
*/
if (!*s) {
printf("unicode [ ] ");
} else if (strlen(s) == 1 && (*s <= 0x1F || *s == 0x7F)) {
printf("unicode [ U+%04hX ] ", *s);
} else {
printf("unicode [ %s ] ", s);
if (fields & PRINT_UNICODE) {
if (status == XKB_COMPOSE_COMPOSED)
xkb_compose_state_get_utf8(compose_state, s, sizeof(s));
else
xkb_state_key_get_utf8(state, keycode, s, sizeof(s));
/* HACK: escape single control characters from C0 set using the
* Unicode codepoint convention. Ideally we would like to escape
* any non-printable character in the string.
*/
if (!*s) {
printf("unicode [ ] ");
} else if (strlen(s) == 1 && (*s <= 0x1F || *s == 0x7F)) {
printf("unicode [ U+%04hX ] ", *s);
} else {
printf("unicode [ %s ] ", s);
}
}
layout = xkb_state_key_get_layout(state, keycode);
printf("layout [ %s (%d) ] ",
xkb_keymap_layout_get_name(keymap, layout), layout);
if (fields & PRINT_LAYOUT) {
printf("layout [ %s (%d) ] ",
xkb_keymap_layout_get_name(keymap, layout), layout);
}
printf("level [ %d ] ",
xkb_state_key_get_level(state, keycode, layout));

View File

@ -36,11 +36,26 @@
#define ARRAY_SIZE(arr) ((sizeof(arr) / sizeof(*(arr))))
/* Fields that are printed in the interactive tools. */
enum print_state_fields {
PRINT_LAYOUT = (1u << 2),
PRINT_UNICODE = (1u << 3),
PRINT_ALL_FIELDS = ((PRINT_UNICODE << 1) - 1),
/*
* Fields that can be hidden with the option --short.
* NOTE: If this value is modified, remember to update the documentation of
* the --short option in the corresponding tools.
*/
PRINT_VERBOSE_FIELDS = (PRINT_LAYOUT | PRINT_UNICODE)
};
typedef uint32_t print_state_fields_mask_t;
void
tools_print_keycode_state(struct xkb_state *state,
struct xkb_compose_state *compose_state,
xkb_keycode_t keycode,
enum xkb_consumed_mode consumed_mode);
enum xkb_consumed_mode consumed_mode,
print_state_fields_mask_t fields);
void
tools_print_state_changes(enum xkb_state_component changed);