ClutterSeatEvdev * clutter_seat_evdev_new (ClutterDeviceManagerEvdev *manager_evdev) { ClutterDeviceManager *manager = CLUTTER_DEVICE_MANAGER (manager_evdev); ClutterSeatEvdev *seat; ClutterInputDevice *device; ClutterStage *stage; ClutterKeymap *keymap; struct xkb_keymap *xkb_keymap; seat = g_new0 (ClutterSeatEvdev, 1); if (!seat) return NULL; seat->manager_evdev = manager_evdev; device = _clutter_input_device_evdev_new_virtual ( manager, seat, CLUTTER_POINTER_DEVICE, CLUTTER_INPUT_MODE_MASTER); stage = _clutter_device_manager_evdev_get_stage (manager_evdev); _clutter_input_device_set_stage (device, stage); seat->pointer_x = INITIAL_POINTER_X; seat->pointer_y = INITIAL_POINTER_Y; _clutter_input_device_set_coords (device, NULL, seat->pointer_x, seat->pointer_y, NULL); _clutter_device_manager_add_device (manager, device); seat->core_pointer = device; device = _clutter_input_device_evdev_new_virtual ( manager, seat, CLUTTER_KEYBOARD_DEVICE, CLUTTER_INPUT_MODE_MASTER); _clutter_input_device_set_stage (device, stage); _clutter_device_manager_add_device (manager, device); seat->core_keyboard = device; seat->repeat = TRUE; seat->repeat_delay = 250; /* ms */ seat->repeat_interval = 33; /* ms */ keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); xkb_keymap = clutter_keymap_evdev_get_keyboard_map (CLUTTER_KEYMAP_EVDEV (keymap)); if (xkb_keymap) { seat->xkb = xkb_state_new (xkb_keymap); seat->caps_lock_led = xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_CAPS); seat->num_lock_led = xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_NUM); seat->scroll_lock_led = xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_SCROLL); } return seat; }
static int kbdmap_new_from_names(kbdmap **out, kbdctx *kc, const char *model, const char *layout, const char *variant, const char *options) { _cleanup_(kbdmap_unrefp) kbdmap *km = NULL; struct xkb_rule_names rmlvo = { }; unsigned int i; assert_return(out, -EINVAL); km = new0(kbdmap, 1); if (!km) return -ENOMEM; km->ref = 1; rmlvo.rules = "evdev"; rmlvo.model = model; rmlvo.layout = layout; rmlvo.variant = variant; rmlvo.options = options; errno = 0; km->xkb_keymap = xkb_keymap_new_from_names(kc->xkb_context, &rmlvo, 0); if (!km->xkb_keymap) return errno > 0 ? -errno : -EFAULT; for (i = 0; i < IDEV_KBDMOD_CNT; ++i) { const char *t = kbdmap_modmap[i]; if (t) km->modmap[i] = xkb_keymap_mod_get_index(km->xkb_keymap, t); else km->modmap[i] = XKB_MOD_INVALID; } for (i = 0; i < IDEV_KBDLED_CNT; ++i) { const char *t = kbdmap_ledmap[i]; if (t) km->ledmap[i] = xkb_keymap_led_get_index(km->xkb_keymap, t); else km->ledmap[i] = XKB_LED_INVALID; } *out = km; km = NULL; return 0; }