kmscon: pass vtnr to pty so XDG_VTNR is set
[platform/upstream/kmscon.git] / tests / test_input.c
index 180635c..7dc06c7 100644 (file)
@@ -24,6 +24,8 @@
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+static void print_help();
+
 #include <errno.h>
 #include <linux/input.h>
 #include <locale.h>
 #include <sys/signalfd.h>
 #include <unistd.h>
 #include <X11/keysym.h>
+#include <xkbcommon/xkbcommon.h>
 #include "eloop.h"
-#include "log.h"
-#include "uterm.h"
+#include "shl_log.h"
+#include "uterm_input.h"
+#include "uterm_monitor.h"
 #include "test_include.h"
 
-extern void kbd_keysym_to_string(uint32_t keysym, char *str, size_t size);
-
 static struct ev_eloop *eloop;
 static struct uterm_input *input;
 
+struct {
+       char *xkb_model;
+       char *xkb_layout;
+       char *xkb_variant;
+       char *xkb_options;
+       char *xkb_keymap;
+} input_conf;
+
 /* Pressing Ctrl-\ should toggle the capturing. */
 static void sig_quit(struct ev_eloop *p,
                        struct signalfd_siginfo *info,
@@ -70,34 +80,27 @@ static void print_modifiers(unsigned int mods)
                printf("LOCK ");
        if (mods & UTERM_CONTROL_MASK)
                printf("CONTROL ");
-       if (mods & UTERM_MOD1_MASK)
-               printf("MOD1 ");
-       if (mods & UTERM_MOD2_MASK)
-               printf("MOD2 ");
-       if (mods & UTERM_MOD3_MASK)
-               printf("MOD3 ");
-       if (mods & UTERM_MOD4_MASK)
-               printf("MOD4 ");
-       if (mods & UTERM_MOD5_MASK)
-               printf("MOD5 ");
+       if (mods & UTERM_ALT_MASK)
+               printf("ALT ");
+       if (mods & UTERM_LOGO_MASK)
+               printf("LOGO ");
        printf("\n");
 }
 
 static void input_arrived(struct uterm_input *input,
-                               struct uterm_input_event *ev,
-                               void *data)
+                         struct uterm_input_event *ev,
+                         void *data)
 {
-       char s[16];
+       char s[32];
 
-       if (ev->unicode == UTERM_INPUT_INVALID) {
-               kbd_keysym_to_string(ev->keysym, s, sizeof(s));
-               printf("sym %s ", s);
-       } else {
+       xkb_keysym_get_name(ev->keysyms[0], s, sizeof(s));
+       printf("sym %s ", s);
+       if (ev->codepoints[0] != UTERM_INPUT_INVALID) {
                /*
                 * Just a proof-of-concept hack. This works because glibc uses
                 * UTF-32 (= UCS-4) as the internal wchar_t encoding.
                 */
-               printf("unicode %lc ", ev->unicode);
+               printf("unicode %lc ", ev->codepoints[0]);
        }
        print_modifiers(ev->mods);
 }
@@ -107,12 +110,28 @@ static void monitor_event(struct uterm_monitor *mon,
                                void *data)
 {
        int ret;
+       char *keymap;
 
        if (ev->type == UTERM_MONITOR_NEW_SEAT) {
                if (strcmp(ev->seat_name, "seat0"))
                        return;
 
-               ret = uterm_input_new(&input, eloop);
+               keymap = NULL;
+               if (input_conf.xkb_keymap && *input_conf.xkb_keymap) {
+                       ret = shl_read_file(input_conf.xkb_keymap, &keymap,
+                                           NULL);
+                       if (ret)
+                               log_error("cannot read keymap file %s: %d",
+                                         input_conf.xkb_keymap, ret);
+               }
+
+               ret = uterm_input_new(&input, eloop,
+                                     input_conf.xkb_model,
+                                     input_conf.xkb_layout,
+                                     input_conf.xkb_variant,
+                                     input_conf.xkb_options,
+                                     keymap,
+                                     0, 0);
                if (ret)
                        return;
                ret = uterm_input_register_cb(input, input_arrived, NULL);
@@ -131,12 +150,65 @@ static void monitor_event(struct uterm_monitor *mon,
        }
 }
 
+static void print_help()
+{
+       /*
+        * Usage/Help information
+        * This should be scaled to a maximum of 80 characters per line:
+        *
+        * 80 char line:
+        *       |   10   |    20   |    30   |    40   |    50   |    60   |    70   |    80   |
+        *      "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
+        * 80 char line starting with tab:
+        *       |10|    20   |    30   |    40   |    50   |    60   |    70   |    80   |
+        *      "\t901234567890123456789012345678901234567890123456789012345678901234567890\n"
+        */
+       fprintf(stderr,
+               "Usage:\n"
+               "\t%1$s [options]\n"
+               "\t%1$s -h [options]\n"
+               "\n"
+               "You can prefix boolean options with \"no-\" to negate it. If an argument is\n"
+               "given multiple times, only the last argument matters if not otherwise stated.\n"
+               "\n"
+               "General Options:\n"
+               TEST_HELP
+               "\n"
+               "Input Device Options:\n"
+               "\t    --xkb-model <model>     [-]     Set XkbModel for input devices\n"
+               "\t    --xkb-layout <layout>   [-]     Set XkbLayout for input devices\n"
+               "\t    --xkb-variant <variant> [-]     Set XkbVariant for input devices\n"
+               "\t    --xkb-options <options> [-]     Set XkbOptions for input devices\n"
+               "\t    --xkb-keymap <FILE>     [-]     Use a predefined keymap for\n"
+               "\t                                    input devices\n",
+               "test_input");
+       /*
+        * 80 char line:
+        *       |   10   |    20   |    30   |    40   |    50   |    60   |    70   |    80   |
+        *      "12345678901234567890123456789012345678901234567890123456789012345678901234567890\n"
+        * 80 char line starting with tab:
+        *       |10|    20   |    30   |    40   |    50   |    60   |    70   |    80   |
+        *      "\t901234567890123456789012345678901234567890123456789012345678901234567890\n"
+        */
+}
+
+struct conf_option options[] = {
+       TEST_OPTIONS,
+       CONF_OPTION_STRING(0, "xkb-model", &input_conf.xkb_model, ""),
+       CONF_OPTION_STRING(0, "xkb-layout", &input_conf.xkb_layout, ""),
+       CONF_OPTION_STRING(0, "xkb-variant", &input_conf.xkb_variant, ""),
+       CONF_OPTION_STRING(0, "xkb-options", &input_conf.xkb_options, ""),
+       CONF_OPTION_STRING(0, "xkb-keymap", &input_conf.xkb_keymap, ""),
+};
+
 int main(int argc, char **argv)
 {
        int ret;
        struct uterm_monitor *mon;
+       size_t onum;
 
-       ret = test_prepare(argc, argv, &eloop);
+       onum = sizeof(options) / sizeof(*options);
+       ret = test_prepare(options, onum, argc, argv, &eloop);
        if (ret)
                goto err_fail;
 
@@ -163,8 +235,9 @@ int main(int argc, char **argv)
 err_mon:
        uterm_monitor_unref(mon);
 err_exit:
-       test_exit(eloop);
+       test_exit(options, onum, eloop);
 err_fail:
-       test_fail(ret);
+       if (ret != -ECANCELED)
+               test_fail(ret);
        return abs(ret);
 }