Pushed

Thanks,
Derek

On 15/10/15 02:30 AM, Pekka Paalanen wrote:
> On Wed, 14 Oct 2015 20:57:35 +0200
> Hardening <rdp.eff...@gmail.com> wrote:
> 
>> Le 14/10/2015 16:39, Derek Foreman a écrit :
>>> Apparently it's possible for a compositor to advertise seats with
>>> different versions on the same connection, so this makes us more robust
>>> against that dubious behaviour.
>>>
>>> This also tracks the seat version we requested instead of the advertised
>>> maximum.
>>>
>>> Signed-off-by: Derek Foreman <der...@osg.samsung.com>
>>> ---
>>>
>>> As penance for my sass, I've gone ahead and "fixed" this - I think
>>> tracking the version we requested instead of the one advertised is
>>> more robust against catching a failure to increment the requested
>>> version though. However, it does seem like the correct thing to do.
>>>
>>>  clients/window.c | 20 +++++++++++---------
>>>  1 file changed, 11 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/clients/window.c b/clients/window.c
>>> index 6d3e944..d8f2ee2 100644
>>> --- a/clients/window.c
>>> +++ b/clients/window.c
>>> @@ -140,7 +140,6 @@ struct display {
>>>     void *dummy_surface_data;
>>>  
>>>     int has_rgb565;
>>> -   int seat_version;
>>>     int data_device_manager_version;
>>>  };
>>>  
>>> @@ -362,6 +361,7 @@ struct input {
>>>     uint32_t repeat_sym;
>>>     uint32_t repeat_key;
>>>     uint32_t repeat_time;
>>> +   int seat_version;
>>>  };
>>>  
>>>  struct output {
>>> @@ -3256,7 +3256,7 @@ seat_handle_capabilities(void *data, struct wl_seat 
>>> *seat,
>>>             wl_pointer_add_listener(input->pointer, &pointer_listener,
>>>                                     input);
>>>     } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) {
>>> -           if (input->display->seat_version >= 
>>> WL_POINTER_RELEASE_SINCE_VERSION)
>>> +           if (input->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION)
>>>                     wl_pointer_release(input->pointer);
>>>             else
>>>                     wl_pointer_destroy(input->pointer);
>>> @@ -3269,7 +3269,7 @@ seat_handle_capabilities(void *data, struct wl_seat 
>>> *seat,
>>>             wl_keyboard_add_listener(input->keyboard, &keyboard_listener,
>>>                                      input);
>>>     } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) {
>>> -           if (input->display->seat_version >= 
>>> WL_KEYBOARD_RELEASE_SINCE_VERSION)
>>> +           if (input->seat_version >= WL_KEYBOARD_RELEASE_SINCE_VERSION)
>>>                     wl_keyboard_release(input->keyboard);
>>>             else
>>>                     wl_keyboard_destroy(input->keyboard);
>>> @@ -3281,7 +3281,7 @@ seat_handle_capabilities(void *data, struct wl_seat 
>>> *seat,
>>>             wl_touch_set_user_data(input->touch, input);
>>>             wl_touch_add_listener(input->touch, &touch_listener, input);
>>>     } else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->touch) {
>>> -           if (input->display->seat_version >= 
>>> WL_TOUCH_RELEASE_SINCE_VERSION)
>>> +           if (input->seat_version >= WL_TOUCH_RELEASE_SINCE_VERSION)
>>>                     wl_touch_release(input->touch);
>>>             else
>>>                     wl_touch_destroy(input->touch);
>>> @@ -5218,17 +5218,20 @@ fini_xkb(struct input *input)
>>>  }
>>>  
>>>  static void
>>> -display_add_input(struct display *d, uint32_t id)
>>> +display_add_input(struct display *d, uint32_t id, int display_seat_version)
>>>  {
>>>     struct input *input;
>>> +   int seat_version = MIN(display_seat_version, 4);
>>>  
>>>     input = xzalloc(sizeof *input);
>>>     input->display = d;
>>>     input->seat = wl_registry_bind(d->registry, id, &wl_seat_interface,
>>> -                                  MIN(d->seat_version, 4));
>>> +                                  seat_version);
>>>     input->touch_focus = NULL;
>>>     input->pointer_focus = NULL;
>>>     input->keyboard_focus = NULL;
>>> +   input->seat_version = seat_version;
>>> +
>>>     wl_list_init(&input->touch_point_list);
>>>     wl_list_insert(d->input_list.prev, &input->link);
>>>  
>>> @@ -5278,7 +5281,7 @@ input_destroy(struct input *input)
>>>             else
>>>                     wl_data_device_destroy(input->data_device);
>>>     }
>>> -   if (input->display->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION) {
>>> +   if (input->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION) {
>>>             if (input->touch)
>>>                     wl_touch_release(input->touch);
>>>             if (input->pointer)
>>> @@ -5365,8 +5368,7 @@ registry_handle_global(void *data, struct wl_registry 
>>> *registry, uint32_t id,
>>>     } else if (strcmp(interface, "wl_output") == 0) {
>>>             display_add_output(d, id);
>>>     } else if (strcmp(interface, "wl_seat") == 0) {
>>> -           d->seat_version = version;
>>> -           display_add_input(d, id);
>>> +           display_add_input(d, id, version);
>>>     } else if (strcmp(interface, "wl_shm") == 0) {
>>>             d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
>>>             wl_shm_add_listener(d->shm, &shm_listener, d);
>>>
>>
>> I had noticed that too, I can't see in which situation this could
>> happen, perhaps a subcompositor advertising its own seats ?
> 
> There is no such thing. :-)
> 
> I think this is more a correctness thing than anything that actually
> happens.
> 
>> Anyway,
>>
>> Reviewed-by: David FORT <cont...@hardening-consulting.com>
>>
> 
> Yeah, looks good to me too.
> Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
> 
> 
> Thanks,
> pq
> 
> 
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to