x11.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright © 2020 Ran Benita <ran@unusedvar.com>
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "config.h"
  6. #include <assert.h>
  7. #include <stdlib.h>
  8. #include <xcb/xkb.h>
  9. #include "xkbcommon/xkbcommon.h"
  10. #include "xkbcommon/xkbcommon-x11.h"
  11. #include "bench.h"
  12. #define BENCHMARK_ITERATIONS 2500
  13. int
  14. main(void)
  15. {
  16. int ret;
  17. xcb_connection_t *conn;
  18. int32_t device_id;
  19. struct xkb_context *ctx;
  20. struct bench bench;
  21. char *elapsed;
  22. conn = xcb_connect(NULL, NULL);
  23. if (!conn || xcb_connection_has_error(conn)) {
  24. fprintf(stderr, "Couldn't connect to X server: error code %d\n",
  25. conn ? xcb_connection_has_error(conn) : -1);
  26. ret = -1;
  27. goto err_out;
  28. }
  29. ret = xkb_x11_setup_xkb_extension(conn,
  30. XKB_X11_MIN_MAJOR_XKB_VERSION,
  31. XKB_X11_MIN_MINOR_XKB_VERSION,
  32. XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS,
  33. NULL, NULL, NULL, NULL);
  34. if (!ret) {
  35. fprintf(stderr, "Couldn't setup XKB extension\n");
  36. goto err_conn;
  37. }
  38. device_id = xkb_x11_get_core_keyboard_device_id(conn);
  39. if (device_id == -1) {
  40. ret = -1;
  41. fprintf(stderr, "Couldn't find core keyboard device\n");
  42. goto err_conn;
  43. }
  44. ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
  45. if (!ctx) {
  46. ret = -1;
  47. fprintf(stderr, "Couldn't create xkb context\n");
  48. goto err_conn;
  49. }
  50. bench_start(&bench);
  51. for (int i = 0; i < BENCHMARK_ITERATIONS; i++) {
  52. struct xkb_keymap *keymap;
  53. struct xkb_state *state;
  54. keymap = xkb_x11_keymap_new_from_device(ctx, conn, device_id,
  55. XKB_KEYMAP_COMPILE_NO_FLAGS);
  56. assert(keymap);
  57. state = xkb_x11_state_new_from_device(keymap, conn, device_id);
  58. assert(state);
  59. xkb_state_unref(state);
  60. xkb_keymap_unref(keymap);
  61. }
  62. bench_stop(&bench);
  63. ret = 0;
  64. elapsed = bench_elapsed_str(&bench);
  65. fprintf(stderr, "retrieved %d keymaps from X in %ss\n",
  66. BENCHMARK_ITERATIONS, elapsed);
  67. free(elapsed);
  68. xkb_context_unref(ctx);
  69. err_conn:
  70. xcb_disconnect(conn);
  71. err_out:
  72. return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
  73. }