napi_value _GetKeyMap()

in src/keyboard_x.cc [165:243]


napi_value _GetKeyMap(napi_env env, napi_callback_info info) {

  napi_value result;
  NAPI_CALL(env, napi_create_object(env, &result));

  Display *display;
  if (!(display = XOpenDisplay(""))) {
    return result;
  }

  XEvent event;
  memset(&event, 0, sizeof(XEvent));
  XKeyEvent* key_event = &event.xkey;
  key_event->display = display;
  key_event->type = KeyPress;

  KeyModifierMaskToXModifierMask *mask_provider = &KeyModifierMaskToXModifierMask::GetInstance();
  mask_provider->Initialize(display);

  size_t cnt = sizeof(usb_keycode_map) / sizeof(usb_keycode_map[0]);

  for (size_t i = 0; i < cnt; ++i) {
    const char *code = usb_keycode_map[i].code;
    int native_keycode = usb_keycode_map[i].native_keycode;

    if (!code || native_keycode <= 0) {
      continue;
    }

    napi_value entry;
    NAPI_CALL(env, napi_create_object(env, &entry));

    key_event->keycode = native_keycode;
    {
      key_event->state = mask_provider->XStateFromKeyMod(0);
      std::string value = GetStrFromXEvent(&event);
      NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "value", value.c_str()));
    }

    {
      key_event->state = mask_provider->XStateFromKeyMod(kShiftKeyModifierMask);
      std::string withShift = GetStrFromXEvent(&event);
      NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withShift", withShift.c_str()));
    }

    {
      key_event->state = mask_provider->XStateFromKeyMod(kLevel3KeyModifierMask);
      std::string withAltGr = GetStrFromXEvent(&event);
      NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withAltGr", withAltGr.c_str()));
    }

    {
      key_event->state = mask_provider->XStateFromKeyMod(kShiftKeyModifierMask | kLevel3KeyModifierMask);
      std::string withShiftAltGr = GetStrFromXEvent(&event);
      NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withShiftAltGr", withShiftAltGr.c_str()));
    }

    {
      // level 5 is important for the Neo layout family
      key_event->state = mask_provider->XStateFromKeyMod(kLevel5KeyModifierMask);
      std::string withLevel5 = GetStrFromXEvent(&event);
      NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withLevel5", withLevel5.c_str()));
    }

    {
      // level3 + level5 is Level 6 in terms of the Neo layout family. (Shift + level5 has no special meaning.)
      key_event->state = mask_provider->XStateFromKeyMod(kLevel3KeyModifierMask | kLevel5KeyModifierMask);
      std::string withLevel3Level5 = GetStrFromXEvent(&event);
      NAPI_CALL(env, napi_set_named_property_string_utf8(env, entry, "withLevel3Level5", withLevel3Level5.c_str()));
    }

    NAPI_CALL(env, napi_set_named_property(env, result, code, entry));
  }

  XFlush(display);
  XCloseDisplay(display);

  return result;
}