gnome-control-center/tests/keyboard/test-keyboard-shortcuts.c
Sebastian Keller 7f6dc4511f tests: Add test for keyboard shortcut normalization
This tests if the shortcuts generated from an event are in the format
that the shell expects.
2022-08-22 12:49:13 +00:00

161 lines
4.1 KiB
C

#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <locale.h>
#include <stdlib.h>
#include "keyboard-shortcuts.h"
#define NUM_LAYOUTS 4
typedef struct _shortcut_test {
guint16 keycode;
GdkModifierType modifiers;
char *expected_results[NUM_LAYOUTS];
} shortcut_test;
/* keycodes taken from /usr/share/X11/xkb/keycodes/evdev */
shortcut_test shortcut_tests[] = {
{
24 /* first key after tab in first letter row */,
GDK_SHIFT_MASK | GDK_SUPER_MASK,
{
"<Shift><Super>q" /* us */,
"<Shift><Super>apostrophe" /* us+dvorak */,
"<Shift><Super>a" /* fr+azerty */,
"<Shift><Super>Cyrillic_shorti" /* ru */
/* "<Shift><Super>q" would be valid, too */,
},
},
{
13 /* fifth key in num row */,
GDK_SUPER_MASK,
{
"<Super>4" /* us */,
"<Super>4" /* us+dvorak */,
"<Super>4" /* fr+azerty */,
"<Super>4" /* ru */,
},
},
{
13 /* fifth key in num row */,
GDK_SHIFT_MASK | GDK_SUPER_MASK,
{
"<Shift><Super>4" /* us */,
"<Shift><Super>4" /* us+dvorak */,
"<Shift><Super>4" /* fr+azerty */,
"<Shift><Super>4" /* ru */,
},
},
{
65 /* space key */,
GDK_SHIFT_MASK | GDK_SUPER_MASK,
{
"<Shift><Super>space" /* us */,
"<Shift><Super>space" /* us+dvorak */,
"<Shift><Super>space" /* fr+azerty */,
"<Shift><Super>space" /* ru */,
},
},
{
23 /* tab key */,
GDK_SHIFT_MASK | GDK_SUPER_MASK,
{
"<Shift><Super>Tab" /* us */,
"<Shift><Super>Tab" /* us+dvorak */,
"<Shift><Super>Tab" /* fr+azerty */,
"<Shift><Super>Tab" /* ru */,
},
},
{
107 /* print screen/sysrq key */,
GDK_ALT_MASK,
{
"<Alt>Print" /* us */,
"<Alt>Print" /* us+dvorak */,
"<Alt>Print" /* fr+azerty */,
"<Alt>Print" /* ru */,
},
},
};
static void
test_event_translation (shortcut_test *shortcut_test)
{
g_autofree char *translated_name = NULL;
guint keyval;
GdkModifierType modifiers;
for (int group = 0; group < NUM_LAYOUTS; group++)
{
if (!shortcut_test->expected_results[group])
continue;
normalize_keyval_and_mask (shortcut_test->keycode,
shortcut_test->modifiers,
group,
&keyval,
&modifiers);
translated_name = gtk_accelerator_name (keyval, modifiers);
if (g_strcmp0 (translated_name, shortcut_test->expected_results[group]) != 0)
{
g_error ("Result for keycode %u with modifieres %u for "
"group %d doesn't match '%s' (got: '%s')",
shortcut_test->keycode,
shortcut_test->modifiers,
group,
shortcut_test->expected_results[group],
translated_name);
g_test_fail ();
}
}
}
static void
set_keyboard_layouts (char *layouts,
char *variants,
char *options)
{
GSubprocess *proc;
GError *error = NULL;
proc = g_subprocess_new (G_SUBPROCESS_FLAGS_NONE,
&error,
"setxkbmap",
"-layout", layouts,
"-variant", variants,
"-option", options,
"-model", "pc105",
NULL);
if (!proc || !g_subprocess_wait_check(proc, NULL, &error))
{
g_critical ("Failed to set layout: %s", error->message);
exit (1);
}
g_object_unref (proc);
}
static void
run_shortcut_tests (void)
{
set_keyboard_layouts ("us,us,fr,ru", ",dvorak,azerty,", "");
for (int i = 0; i < G_N_ELEMENTS(shortcut_tests); i++)
test_event_translation (&shortcut_tests[i]);
}
int main (int argc, char **argv)
{
g_setenv ("GSETTINGS_BACKEND", "memory", TRUE);
g_setenv ("GDK_BACKEND", "x11", TRUE);
g_setenv ("LC_ALL", "C", TRUE);
gtk_test_init (&argc, &argv, NULL);
g_test_add_func ("/keyboard/shortcut-translation",
run_shortcut_tests);
return g_test_run ();
}