weston_keyboard_send_keymap(struct weston_keyboard *kbd, struct wl_resource *resource)
{
struct weston_xkb_info *xkb_info = kbd->xkb_info;
- void *area;
int fd;
+ size_t size;
+ enum ro_anonymous_file_mapmode mapmode;
- fd = os_create_anonymous_file(xkb_info->keymap_size);
- if (fd < 0) {
- weston_log("creating a keymap file for %lu bytes failed: %s\n",
- (unsigned long) xkb_info->keymap_size,
+ if (wl_resource_get_version(resource) < 7)
+ mapmode = RO_ANONYMOUS_FILE_MAPMODE_SHARED;
+ else
+ mapmode = RO_ANONYMOUS_FILE_MAPMODE_PRIVATE;
+
+ fd = os_ro_anonymous_file_get_fd(xkb_info->keymap_rofile, mapmode);
+ size = os_ro_anonymous_file_size(xkb_info->keymap_rofile);
+
+ if (fd == -1) {
+ weston_log("creating a keymap file failed: %s\n",
strerror(errno));
return;
}
- area = mmap(NULL, xkb_info->keymap_size, PROT_READ | PROT_WRITE,
- MAP_SHARED, fd, 0);
- if (area == MAP_FAILED) {
- weston_log("failed to mmap() %lu bytes\n",
- (unsigned long) xkb_info->keymap_size);
- goto err_mmap;
- }
- strcpy(area, xkb_info->keymap_string);
- munmap(area, xkb_info->keymap_size);
wl_keyboard_send_keymap(resource,
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
fd,
- xkb_info->keymap_size);
-err_mmap:
- close(fd);
+ size);
+
+ os_ro_anonymous_file_put_fd(fd);
}
static void
xkb_keymap_unref(xkb_info->keymap);
- if (xkb_info->keymap_string)
- free(xkb_info->keymap_string);
+ os_ro_anonymous_file_destroy(xkb_info->keymap_rofile);
free(xkb_info);
}
static struct weston_xkb_info *
weston_xkb_info_create(struct xkb_keymap *keymap)
{
+ char *keymap_string;
+ size_t keymap_size;
struct weston_xkb_info *xkb_info = zalloc(sizeof *xkb_info);
if (xkb_info == NULL)
return NULL;
xkb_info->scroll_led = xkb_keymap_led_get_index(xkb_info->keymap,
XKB_LED_NAME_SCROLL);
- xkb_info->keymap_string = xkb_keymap_get_as_string(xkb_info->keymap,
+ keymap_string = xkb_keymap_get_as_string(xkb_info->keymap,
XKB_KEYMAP_FORMAT_TEXT_V1);
- if (xkb_info->keymap_string == NULL) {
+ if (keymap_string == NULL) {
weston_log("failed to get string version of keymap\n");
goto err_keymap;
}
- xkb_info->keymap_size = strlen(xkb_info->keymap_string) + 1;
+ keymap_size = strlen(keymap_string) + 1;
+
+ xkb_info->keymap_rofile = os_ro_anonymous_file_create(keymap_size,
+ keymap_string);
+ free(keymap_string);
+
+ if (!xkb_info->keymap_rofile) {
+ weston_log("failed to create anonymous file for keymap\n");
+ goto err_keymap;
+ }
return xkb_info;
wl_signal_init(&seat->destroy_signal);
wl_signal_init(&seat->updated_caps_signal);
- seat->global = wl_global_create(ec->wl_display, &wl_seat_interface, 7,
+ seat->global = wl_global_create(ec->wl_display, &wl_seat_interface,
+ MIN(wl_seat_interface.version, 7),
seat, bind_seat);
seat->compositor = ec;