[PATCH v2 weston 4/4] zoom: Store the seat that initiated a zoom

Derek Foreman derekf at osg.samsung.com
Mon Jul 27 11:04:48 PDT 2015


On 23/07/15 07:58 PM, Bryce Harrington wrote:
> On Thu, Jul 23, 2015 at 02:55:15PM -0500, Derek Foreman wrote:
>> Track the seat that initiated a seat instead of picking the first one.
> 
> initiated a zoom?  ;-)

Sigh.  Yes. :)

>> Previously, if there are multiple seats then any seat can adjust the zoom
>> level but the zoom tracks the first seat's pointer.
>>
>> Now the zoom will follow the pointer of the seat that initiated the zoom.
>>
>> Additionally, if there's no pointer in the first seat, starting a zoom
>> with the second seat will no longer crash weston.
>>
>> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
>> ---
>>  desktop-shell/shell.c |  2 +-
>>  src/compositor.h      |  4 +++-
>>  src/zoom.c            | 17 ++++++-----------
>>  3 files changed, 10 insertions(+), 13 deletions(-)
>>
>> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
>> index 8f90710..6200a7f 100644
>> --- a/desktop-shell/shell.c
>> +++ b/desktop-shell/shell.c
>> @@ -4808,7 +4808,7 @@ do_zoom(struct weston_seat *seat, uint32_t time, uint32_t key, uint32_t axis,
>>  			if (!output->zoom.active) {
>>  				if (output->zoom.level <= 0.0)
>>  					continue;
>> -				weston_output_activate_zoom(output);
>> +				weston_output_activate_zoom(output, seat);
>>  			}
>>  
>>  			output->zoom.spring_z.target = output->zoom.level;
>> diff --git a/src/compositor.h b/src/compositor.h
>> index b69547f..b74f7e8 100644
>> --- a/src/compositor.h
>> +++ b/src/compositor.h
>> @@ -152,6 +152,7 @@ struct weston_output_zoom {
>>  	float level;
>>  	float max_level;
>>  	float trans_x, trans_y;
>> +	struct weston_seat *seat;
>>  	struct weston_animation animation_z;
>>  	struct weston_spring spring_z;
>>  	struct weston_fixed_point current;
>> @@ -1370,7 +1371,8 @@ weston_output_init_zoom(struct weston_output *output);
>>  void
>>  weston_output_update_zoom(struct weston_output *output);
>>  void
>> -weston_output_activate_zoom(struct weston_output *output);
>> +weston_output_activate_zoom(struct weston_output *output,
>> +			    struct weston_seat *seat);
>>  void
>>  weston_output_update_matrix(struct weston_output *output);
>>  void
>> diff --git a/src/zoom.c b/src/zoom.c
>> index 18fc7ca..efc658c 100644
>> --- a/src/zoom.c
>> +++ b/src/zoom.c
>> @@ -50,6 +50,7 @@ weston_zoom_frame_z(struct weston_animation *animation,
>>  	if (weston_spring_done(&output->zoom.spring_z)) {
>>  		if (output->zoom.active && output->zoom.level <= 0.0) {
>>  			output->zoom.active = false;
>> +			output->zoom.seat = NULL;
>>  			output->disable_planes--;
>>  			wl_list_remove(&output->zoom.motion_listener.link);
>>  		}
>> @@ -62,13 +63,6 @@ weston_zoom_frame_z(struct weston_animation *animation,
>>  	weston_output_damage(output);
>>  }
>>  
>> -static struct weston_seat *
>> -weston_zoom_pick_seat(struct weston_compositor *compositor)
>> -{
>> -	return container_of(compositor->seat_list.next,
>> -			    struct weston_seat, link);
>> -}
>> -
>>  static void
>>  zoom_area_center_from_point(struct weston_output *output,
>>  			    wl_fixed_t *x, wl_fixed_t *y)
>> @@ -134,7 +128,7 @@ weston_zoom_transition(struct weston_output *output)
>>  WL_EXPORT void
>>  weston_output_update_zoom(struct weston_output *output)
>>  {
>> -	struct weston_seat *seat = weston_zoom_pick_seat(output->compositor);
>> +	struct weston_seat *seat = output->zoom.seat;
> 
> Can you convince me that zoom.seat will always be non-NULL at this
> point?  If not, then I'd like to see either an assert or a null ptr
> check here.
>   
>>  	assert(output->zoom.active);
>>  
>> @@ -157,14 +151,14 @@ motion(struct wl_listener *listener, void *data)
>>  }
>>  
>>  WL_EXPORT void
>> -weston_output_activate_zoom(struct weston_output *output)
>> +weston_output_activate_zoom(struct weston_output *output,
>> +			    struct weston_seat *seat)
>>  {
>> -	struct weston_seat *seat = weston_zoom_pick_seat(output->compositor);
>> -
>>  	if (output->zoom.active)
>>  		return;
>>  
>>  	output->zoom.active = true;
>> +	output->zoom.seat = seat;
>>  	output->disable_planes++;
>>  	wl_signal_add(&seat->pointer->motion_signal,
>>  		      &output->zoom.motion_listener);
>> @@ -174,6 +168,7 @@ WL_EXPORT void
>>  weston_output_init_zoom(struct weston_output *output)
>>  {
>>  	output->zoom.active = false;
>> +	output->zoom.seat = NULL;
>>  	output->zoom.increment = 0.07;
>>  	output->zoom.max_level = 0.95;
>>  	output->zoom.level = 0.0;
>> -- 
>> 2.1.4
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 



More information about the wayland-devel mailing list