* Ran Benita <ran234@gmail.com>
*/
+#include "config.h"
+
#include <limits.h>
#include <fcntl.h>
-#include <unistd.h>
+#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef _WIN32
+#include <io.h>
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <termios.h>
+#endif
#include "test.h"
+#include "utils.h"
/*
* Test a sequence of keysyms, resulting from a sequence of key presses,
syms = &sym;
}
- fprintf(stderr, "got %u syms for key 0x%x: [", nsyms, kc);
+ fprintf(stderr, "got %u syms for keycode %u: [", nsyms, kc);
if (op == DOWN || op == BOTH)
xkb_state_update_key(state, kc, XKB_KEY_DOWN);
}
char *
+test_makedir(const char *parent, const char *path)
+{
+ char *dirname;
+ int err;
+
+ dirname = asprintf_safe("%s/%s", parent, path);
+ assert(dirname);
+#ifdef _WIN32
+ err = _mkdir(dirname);
+#else
+ err = mkdir(dirname, 0777);
+#endif
+ assert(err == 0);
+
+ return dirname;
+}
+
+char *
+test_maketempdir(const char *template)
+{
+#ifdef _WIN32
+ const char *basetmp = getenv("TMP");
+ if (basetmp == NULL) {
+ basetmp = getenv("TEMP");
+ }
+ if (basetmp == NULL) {
+ basetmp = getenv("top_builddir");
+ }
+ assert(basetmp != NULL);
+ char *tmpdir = asprintf_safe("%s/%s", basetmp, template);
+ assert(tmpdir != NULL);
+ char *tmp = _mktemp(tmpdir);
+ assert(tmp == tmpdir);
+ int ret = _mkdir(tmp);
+ assert(ret == 0);
+ return tmpdir;
+#else
+ char *tmpdir = asprintf_safe("/tmp/%s", template);
+ assert(tmpdir != NULL);
+ char *tmp = mkdtemp(tmpdir);
+ assert(tmp == tmpdir);
+ return tmpdir;
+#endif
+}
+
+char *
test_get_path(const char *path_rel)
{
char *path;
- size_t path_len;
- const char *srcdir = getenv("srcdir");
+ const char *srcdir;
+
+ srcdir = getenv("top_srcdir");
+ if (!srcdir)
+ srcdir = ".";
+
+ if (path_rel[0] == '/')
+ return strdup(path_rel);
- path_len = strlen(srcdir ? srcdir : ".") +
- strlen(path_rel ? path_rel : "") + 12;
- path = malloc(path_len);
+ path = asprintf_safe("%s/test/data%s%s", srcdir,
+ path_rel[0] ? "/" : "", path_rel);
if (!path) {
- fprintf(stderr, "Failed to allocate path (%d chars) for %s\n",
- (int) path_len, path);
+ fprintf(stderr, "Failed to allocate path for %s\n", path_rel);
return NULL;
}
- snprintf(path, path_len,
- "%s/test/data/%s", srcdir ? srcdir : ".",
- path_rel ? path_rel : "");
-
return path;
}
remaining = info.st_size;
tmp = ret;
- while ((count = read(fd, tmp, remaining))) {
+ while ((count = read(fd, tmp, remaining)) > 0) {
remaining -= count;
tmp += count;
}
return NULL;
path = test_get_path("");
- if (!path)
+ if (!path) {
+ xkb_context_unref(ctx);
return NULL;
+ }
xkb_context_include_path_append(ctx, path);
free(path);
if (!path)
return NULL;
- file = fopen(path, "r");
+ file = fopen(path, "rb");
if (!file) {
fprintf(stderr, "Failed to open path: %s\n", path);
free(path);
return keymap;
}
-
-void
-test_print_keycode_state(struct xkb_state *state, xkb_keycode_t keycode)
-{
- struct xkb_keymap *keymap;
-
- const xkb_keysym_t *syms;
- int nsyms;
- char s[16];
- xkb_layout_index_t layout;
-
- keymap = xkb_state_get_keymap(state);
-
- nsyms = xkb_state_key_get_syms(state, keycode, &syms);
-
- if (nsyms <= 0)
- return;
-
- if (nsyms == 1) {
- xkb_keysym_t sym = xkb_state_key_get_one_sym(state, keycode);
- xkb_keysym_get_name(sym, s, sizeof(s));
- printf("keysym [ %-*s ] ", (int) sizeof(s), s);
- }
- else {
- printf("keysyms [ ");
- for (int i = 0; i < nsyms; i++) {
- xkb_keysym_get_name(syms[i], s, sizeof(s));
- printf("%-*s ", (int) sizeof(s), s);
- }
- printf("] ");
- }
-
- xkb_state_key_get_utf8(state, keycode, s, sizeof(s));
- printf("unicode [ %s ] ", s);
-
- layout = xkb_state_key_get_layout(state, keycode);
- printf("layout [ %s (%d) ] ",
- xkb_keymap_layout_get_name(keymap, layout), layout);
-
- printf("level [ %d ] ",
- xkb_state_key_get_level(state, keycode, layout));
-
- printf("mods [ ");
- for (xkb_mod_index_t mod = 0; mod < xkb_keymap_num_mods(keymap); mod++) {
- if (xkb_state_mod_index_is_active(state, mod,
- XKB_STATE_MODS_EFFECTIVE) <= 0)
- continue;
- if (xkb_state_mod_index_is_consumed(state, keycode, mod))
- printf("-%s ", xkb_keymap_mod_get_name(keymap, mod));
- else
- printf("%s ", xkb_keymap_mod_get_name(keymap, mod));
- }
- printf("] ");
-
- printf("leds [ ");
- for (xkb_led_index_t led = 0; led < xkb_keymap_num_leds(keymap); led++) {
- if (xkb_state_led_index_is_active(state, led) <= 0)
- continue;
- printf("%s ", xkb_keymap_led_get_name(keymap, led));
- }
- printf("] ");
-
- printf("\n");
-}
-
-void
-test_print_state_changes(enum xkb_state_component changed)
-{
- if (changed == 0)
- return;
-
- printf("changed [ ");
- if (changed & XKB_STATE_LAYOUT_EFFECTIVE)
- printf("effective-layout ");
- if (changed & XKB_STATE_LAYOUT_DEPRESSED)
- printf("depressed-layout ");
- if (changed & XKB_STATE_LAYOUT_LATCHED)
- printf("latched-layout ");
- if (changed & XKB_STATE_LAYOUT_LOCKED)
- printf("locked-layout ");
- if (changed & XKB_STATE_MODS_EFFECTIVE)
- printf("effective-mods ");
- if (changed & XKB_STATE_MODS_DEPRESSED)
- printf("depressed-mods ");
- if (changed & XKB_STATE_MODS_LATCHED)
- printf("latched-mods ");
- if (changed & XKB_STATE_MODS_LOCKED)
- printf("locked-mods ");
- if (changed & XKB_STATE_LEDS)
- printf("leds ");
- printf("]\n");
-}