mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-10-04 20:12:38 +00:00
zoom: Store the seat that initiated a zoom
Track the seat that initiated a seat instead of picking the first one. 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@osg.samsung.com>
This commit is contained in:
parent
25bd8a71fc
commit
22276a596a
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
17
src/zoom.c
17
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;
|
||||
|
||||
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;
|
||||
|
|
Loading…
Reference in a new issue