On Fri, Sep 06, 2013 at 08:29:12AM +0000, Andrew Wedgbury wrote:
> Sorry, I missed updating use of xkb_info in compositor-x11.c.
> I've updated the patch.

Argh, and I ended up applying and pushing v2 before seeing this.  Oh
well, I've applied the compositor-x11.c part of the patch and the x11
backend modifiers work again.

thanks,
Kristian

> ---
>  src/compositor-x11.c |    2 +-
>  src/compositor.h     |    5 ++--
>  src/input.c          |   77 
> +++++++++++++++++++++++++++++++-------------------
>  src/text-backend.c   |    4 +--
>  4 files changed, 54 insertions(+), 34 deletions(-)
> 
> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> index a896612..e04ea06 100644
> --- a/src/compositor-x11.c
> +++ b/src/compositor-x11.c
> @@ -160,7 +160,7 @@ x11_compositor_get_keymap(struct x11_compositor *c)
>  static uint32_t
>  get_xkb_mod_mask(struct x11_compositor *c, uint32_t in)
>  {
> -     struct weston_xkb_info *info = &c->core_seat.xkb_info;
> +     struct weston_xkb_info *info = c->core_seat.xkb_info;
>       uint32_t ret = 0;
>  
>       if ((in & ShiftMask) && info->shift_mod != XKB_MOD_INVALID)
> diff --git a/src/compositor.h b/src/compositor.h
> index 6db3c61..3755650 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -398,6 +398,7 @@ struct weston_xkb_info {
>       int keymap_fd;
>       size_t keymap_size;
>       char *keymap_area;
> +     int32_t ref_count;
>       xkb_mod_index_t shift_mod;
>       xkb_mod_index_t caps_mod;
>       xkb_mod_index_t ctrl_mod;
> @@ -468,7 +469,7 @@ struct weston_seat {
>  
>       void (*led_update)(struct weston_seat *ws, enum weston_led leds);
>  
> -     struct weston_xkb_info xkb_info;
> +     struct weston_xkb_info *xkb_info;
>       struct {
>               struct xkb_state *state;
>               enum weston_led leds;
> @@ -588,7 +589,7 @@ struct weston_compositor {
>  
>       struct xkb_rule_names xkb_names;
>       struct xkb_context *xkb_context;
> -     struct weston_xkb_info xkb_info;
> +     struct weston_xkb_info *xkb_info;
>  
>       /* Raw keyboard processing (no libxkbcommon initialization or handling) 
> */
>       int use_xkbcommon;
> diff --git a/src/input.c b/src/input.c
> index aa40b4e..78b6ead 100644
> --- a/src/input.c
> +++ b/src/input.c
> @@ -760,24 +760,24 @@ notify_modifiers(struct weston_seat *seat, uint32_t 
> serial)
>       /* And update the modifier_state for bindings. */
>       mods_lookup = mods_depressed | mods_latched;
>       seat->modifier_state = 0;
> -     if (mods_lookup & (1 << seat->xkb_info.ctrl_mod))
> +     if (mods_lookup & (1 << seat->xkb_info->ctrl_mod))
>               seat->modifier_state |= MODIFIER_CTRL;
> -     if (mods_lookup & (1 << seat->xkb_info.alt_mod))
> +     if (mods_lookup & (1 << seat->xkb_info->alt_mod))
>               seat->modifier_state |= MODIFIER_ALT;
> -     if (mods_lookup & (1 << seat->xkb_info.super_mod))
> +     if (mods_lookup & (1 << seat->xkb_info->super_mod))
>               seat->modifier_state |= MODIFIER_SUPER;
> -     if (mods_lookup & (1 << seat->xkb_info.shift_mod))
> +     if (mods_lookup & (1 << seat->xkb_info->shift_mod))
>               seat->modifier_state |= MODIFIER_SHIFT;
>  
>       /* Finally, notify the compositor that LEDs have changed. */
>       if (xkb_state_led_index_is_active(seat->xkb_state.state,
> -                                       seat->xkb_info.num_led))
> +                                       seat->xkb_info->num_led))
>               leds |= LED_NUM_LOCK;
>       if (xkb_state_led_index_is_active(seat->xkb_state.state,
> -                                       seat->xkb_info.caps_led))
> +                                       seat->xkb_info->caps_led))
>               leds |= LED_CAPS_LOCK;
>       if (xkb_state_led_index_is_active(seat->xkb_state.state,
> -                                       seat->xkb_info.scroll_led))
> +                                       seat->xkb_info->scroll_led))
>               leds |= LED_SCROLL_LOCK;
>       if (leds != seat->xkb_state.leds && seat->led_update)
>               seat->led_update(seat, leds);
> @@ -1243,8 +1243,8 @@ seat_get_keyboard(struct wl_client *client, struct 
> wl_resource *resource,
>  
>       if (seat->compositor->use_xkbcommon) {
>               wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
> -                                     seat->xkb_info.keymap_fd,
> -                                     seat->xkb_info.keymap_size);
> +                                     seat->xkb_info->keymap_fd,
> +                                     seat->xkb_info->keymap_size);
>       } else {
>               int null_fd = open("/dev/null", O_RDONLY);
>               wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP,
> @@ -1351,8 +1351,12 @@ weston_compositor_xkb_init(struct weston_compositor 
> *ec,
>       return 0;
>  }
>  
> -static void xkb_info_destroy(struct weston_xkb_info *xkb_info)
> +static void 
> +weston_xkb_info_destroy(struct weston_xkb_info *xkb_info)
>  {
> +     if (--xkb_info->ref_count > 0)
> +             return;
> +
>       if (xkb_info->keymap)
>               xkb_map_unref(xkb_info->keymap);
>  
> @@ -1360,6 +1364,7 @@ static void xkb_info_destroy(struct weston_xkb_info 
> *xkb_info)
>               munmap(xkb_info->keymap_area, xkb_info->keymap_size);
>       if (xkb_info->keymap_fd >= 0)
>               close(xkb_info->keymap_fd);
> +     free(xkb_info);
>  }
>  
>  void
> @@ -1377,14 +1382,22 @@ weston_compositor_xkb_destroy(struct 
> weston_compositor *ec)
>       free((char *) ec->xkb_names.layout);
>       free((char *) ec->xkb_names.variant);
>       free((char *) ec->xkb_names.options);
> -
> -     xkb_info_destroy(&ec->xkb_info);
> +     
> +     if (ec->xkb_info)
> +             weston_xkb_info_destroy(ec->xkb_info);
>       xkb_context_unref(ec->xkb_context);
>  }
>  
> -static int
> -weston_xkb_info_new_keymap(struct weston_xkb_info *xkb_info)
> +static struct weston_xkb_info *
> +weston_xkb_info_create(struct xkb_keymap *keymap)
>  {
> +     struct weston_xkb_info *xkb_info = zalloc(sizeof *xkb_info);
> +     if (xkb_info == NULL)
> +             return NULL;
> +
> +     xkb_info->keymap = xkb_map_ref(keymap);
> +     xkb_info->ref_count = 1;
> +
>       char *keymap_str;
>  
>       xkb_info->shift_mod = xkb_map_mod_get_index(xkb_info->keymap,
> @@ -1411,7 +1424,7 @@ weston_xkb_info_new_keymap(struct weston_xkb_info 
> *xkb_info)
>       keymap_str = xkb_map_get_as_string(xkb_info->keymap);
>       if (keymap_str == NULL) {
>               weston_log("failed to get string version of keymap\n");
> -             return -1;
> +             goto err_keymap;
>       }
>       xkb_info->keymap_size = strlen(keymap_str) + 1;
>  
> @@ -1433,26 +1446,30 @@ weston_xkb_info_new_keymap(struct weston_xkb_info 
> *xkb_info)
>       strcpy(xkb_info->keymap_area, keymap_str);
>       free(keymap_str);
>  
> -     return 0;
> +     return xkb_info;
>  
>  err_dev_zero:
>       close(xkb_info->keymap_fd);
> -     xkb_info->keymap_fd = -1;
>  err_keymap_str:
>       free(keymap_str);
> -     return -1;
> +err_keymap:
> +     xkb_map_unref(xkb_info->keymap);
> +     free(xkb_info);
> +     return NULL;
>  }
>  
>  static int
>  weston_compositor_build_global_keymap(struct weston_compositor *ec)
>  {
> -     if (ec->xkb_info.keymap != NULL)
> +     struct xkb_keymap *keymap;
> +
> +     if (ec->xkb_info != NULL)
>               return 0;
>  
> -     ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_context,
> -                                                  &ec->xkb_names,
> -                                                  0);
> -     if (ec->xkb_info.keymap == NULL) {
> +     keymap = xkb_map_new_from_names(ec->xkb_context,
> +                                     &ec->xkb_names,
> +                                     0);
> +     if (keymap == NULL) {
>               weston_log("failed to compile global XKB keymap\n");
>               weston_log("  tried rules %s, model %s, layout %s, variant %s, "
>                       "options %s\n",
> @@ -1462,7 +1479,8 @@ weston_compositor_build_global_keymap(struct 
> weston_compositor *ec)
>               return -1;
>       }
>  
> -     if (weston_xkb_info_new_keymap(&ec->xkb_info) < 0)
> +     ec->xkb_info = weston_xkb_info_create(keymap);
> +     if (ec->xkb_info == NULL) 
>               return -1;
>  
>       return 0;
> @@ -1492,17 +1510,17 @@ weston_seat_init_keyboard(struct weston_seat *seat, 
> struct xkb_keymap *keymap)
>  #ifdef ENABLE_XKBCOMMON
>       if (seat->compositor->use_xkbcommon) {
>               if (keymap != NULL) {
> -                     seat->xkb_info.keymap = xkb_map_ref(keymap);
> -                     if (weston_xkb_info_new_keymap(&seat->xkb_info) < 0)
> +                     seat->xkb_info = weston_xkb_info_create(keymap);
> +                     if (seat->xkb_info == NULL)
>                               return -1;
>               } else {
>                       if 
> (weston_compositor_build_global_keymap(seat->compositor) < 0)
>                               return -1;
>                       seat->xkb_info = seat->compositor->xkb_info;
> -                     seat->xkb_info.keymap = 
> xkb_map_ref(seat->xkb_info.keymap);
> +                     seat->xkb_info->ref_count++;
>               }
>  
> -             seat->xkb_state.state = xkb_state_new(seat->xkb_info.keymap);
> +             seat->xkb_state.state = xkb_state_new(seat->xkb_info->keymap);
>               if (seat->xkb_state.state == NULL) {
>                       weston_log("failed to initialise XKB state\n");
>                       return -1;
> @@ -1598,7 +1616,8 @@ weston_seat_release(struct weston_seat *seat)
>       if (seat->compositor->use_xkbcommon) {
>               if (seat->xkb_state.state != NULL)
>                       xkb_state_unref(seat->xkb_state.state);
> -             xkb_info_destroy(&seat->xkb_info);
> +             if (seat->xkb_info)
> +                     weston_xkb_info_destroy(seat->xkb_info);
>       }
>  #endif
>  
> diff --git a/src/text-backend.c b/src/text-backend.c
> index 6c7430c..37dfb75 100644
> --- a/src/text-backend.c
> +++ b/src/text-backend.c
> @@ -591,8 +591,8 @@ input_method_context_grab_keyboard(struct wl_client 
> *client,
>       context->keyboard = cr;
>  
>       wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
> -                             seat->xkb_info.keymap_fd,
> -                             seat->xkb_info.keymap_size);
> +                             seat->xkb_info->keymap_fd,
> +                             seat->xkb_info->keymap_size);
>  
>       if (keyboard->grab != &keyboard->default_grab) {
>               weston_keyboard_end_grab(keyboard);
> -- 
> 1.7.10.4
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to