summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Foreman <derek.foreman@collabora.com>2022-11-09 13:39:08 -0600
committerDerek Foreman <derek.foreman@collabora.com>2023-06-12 16:55:19 -0500
commit244dc963b93fa17ba9f0f817703e704df52d37d1 (patch)
tree1d7b61e5bf32059330dd03215f411d8581c844c4
parentfff8dbd9b8ed22bd92eceb8dce16aa540ab4a41a (diff)
libweston: use weston_coord for weston_view_set_position
Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
-rw-r--r--desktop-shell/input-panel.c8
-rw-r--r--desktop-shell/shell.c102
-rw-r--r--fullscreen-shell/fullscreen-shell.c35
-rw-r--r--include/libweston/libweston.h4
-rw-r--r--kiosk-shell/kiosk-shell-grab.c13
-rw-r--r--kiosk-shell/kiosk-shell.c21
-rw-r--r--libweston/compositor.c44
-rw-r--r--libweston/data-device.c38
-rw-r--r--libweston/desktop/surface.c26
-rw-r--r--libweston/desktop/xwayland.c5
-rw-r--r--libweston/input.c17
-rw-r--r--libweston/shell-utils/shell-utils.c16
-rw-r--r--libweston/touch-calibration.c6
-rw-r--r--tests/surface-global-test.c3
-rw-r--r--tests/surface-test.c6
-rw-r--r--tests/weston-test-desktop-shell.c10
-rw-r--r--tests/weston-test.c5
17 files changed, 214 insertions, 145 deletions
diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c
index 109f422a..0858e33a 100644
--- a/desktop-shell/input-panel.c
+++ b/desktop-shell/input-panel.c
@@ -84,6 +84,7 @@ show_input_panel_surface(struct input_panel_surface *ipsurf)
struct desktop_shell *shell = ipsurf->shell;
struct weston_seat *seat;
struct weston_surface *focus;
+ struct weston_coord_global pos;
float x, y;
wl_list_for_each(seat, &shell->compositor->seat_list, link) {
@@ -98,7 +99,8 @@ show_input_panel_surface(struct input_panel_surface *ipsurf)
ipsurf->output = focus->output;
if (calc_input_panel_position(ipsurf, &x, &y))
continue;
- weston_view_set_position(ipsurf->view, x, y);
+ pos.c = weston_coord(x, y);
+ weston_view_set_position(ipsurf->view, pos);
}
weston_layer_entry_insert(&shell->input_panel_layer.view_list,
@@ -190,6 +192,7 @@ input_panel_committed(struct weston_surface *surface,
{
struct input_panel_surface *ip_surface = surface->committed_private;
struct desktop_shell *shell = ip_surface->shell;
+ struct weston_coord_global pos;
float x, y;
if (surface->width == 0)
@@ -197,7 +200,8 @@ input_panel_committed(struct weston_surface *surface,
if (calc_input_panel_position(ip_surface, &x, &y))
return;
- weston_view_set_position(ip_surface->view, x, y);
+ pos.c = weston_coord(x, y);
+ weston_view_set_position(ip_surface->view, pos);
if (!weston_surface_is_mapped(surface) && shell->showing_input_panels)
show_input_panel_surface(ip_surface);
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index ff3a3513..666787d2 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -975,13 +975,15 @@ touch_move_grab_motion(struct weston_touch_grab *grab,
struct weston_surface *es;
int dx = wl_fixed_to_int(grab->touch->grab_x + move->dx);
int dy = wl_fixed_to_int(grab->touch->grab_y + move->dy);
+ struct weston_coord_global pos;
if (!shsurf || !shsurf->desktop_surface || !move->active)
return;
es = weston_desktop_surface_get_surface(shsurf->desktop_surface);
- weston_view_set_position(shsurf->view, dx, dy);
+ pos.c = weston_coord(dx, dy);
+ weston_view_set_position(shsurf->view, pos);
weston_compositor_schedule_repaint(es->compositor);
}
@@ -1105,6 +1107,7 @@ move_grab_motion(struct weston_pointer_grab *grab,
struct weston_pointer *pointer = grab->pointer;
struct shell_surface *shsurf = move->base.shsurf;
struct weston_surface *surface;
+ struct weston_coord_global pos;
int cx, cy;
weston_pointer_move(pointer, event);
@@ -1115,7 +1118,8 @@ move_grab_motion(struct weston_pointer_grab *grab,
constrain_position(move, &cx, &cy);
- weston_view_set_position(shsurf->view, cx, cy);
+ pos.c = weston_coord(cx, cy);
+ weston_view_set_position(shsurf->view, pos);
weston_compositor_schedule_repaint(surface->compositor);
}
@@ -1247,9 +1251,9 @@ tablet_tool_move_grab_motion(struct weston_tablet_tool_grab *grab,
return;
es = weston_desktop_surface_get_surface(shsurf->desktop_surface);
- weston_view_set_position(shsurf->view,
- pos.c.x + wl_fixed_to_double(move->dx),
- pos.c.y + wl_fixed_to_double(move->dy));
+ pos.c.x += wl_fixed_to_double(move->dx);
+ pos.c.y += wl_fixed_to_double(move->dy);
+ weston_view_set_position(shsurf->view, pos);
weston_compositor_schedule_repaint(es->compositor);
}
@@ -1782,9 +1786,7 @@ unset_fullscreen(struct shell_surface *shsurf)
shsurf->fullscreen.black_view = NULL;
if (shsurf->saved_position_valid)
- weston_view_set_position(shsurf->view,
- shsurf->saved_pos.c.x,
- shsurf->saved_pos.c.y);
+ weston_view_set_position(shsurf->view, shsurf->saved_pos);
else
weston_view_set_initial_position(shsurf->view, shsurf->shell);
shsurf->saved_position_valid = false;
@@ -1810,9 +1812,7 @@ unset_maximized(struct shell_surface *shsurf)
weston_shell_utils_get_default_output(surface->compositor));
if (shsurf->saved_position_valid)
- weston_view_set_position(shsurf->view,
- shsurf->saved_pos.c.x,
- shsurf->saved_pos.c.y);
+ weston_view_set_position(shsurf->view, shsurf->saved_pos);
else
weston_view_set_initial_position(shsurf->view, shsurf->shell);
shsurf->saved_position_valid = false;
@@ -1965,9 +1965,12 @@ shell_configure_fullscreen(struct shell_surface *shsurf)
&shsurf->view->layer_link);
if (!shsurf->fullscreen_output) {
+ struct weston_coord_global pos;
+
/* If there is no output, there's not much we can do.
* Position the window somewhere, whatever. */
- weston_view_set_position(shsurf->view, 0, 0);
+ pos.c = weston_coord(0, 0);
+ weston_view_set_position(shsurf->view, pos);
return;
}
@@ -2259,6 +2262,8 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
if (shsurf->shell->compositor->state == WESTON_COMPOSITOR_ACTIVE &&
shsurf->view->output->power_state == WESTON_OUTPUT_POWER_NORMAL) {
+ struct weston_coord_global pos;
+
pixman_region32_fini(&surface->pending.input);
pixman_region32_init(&surface->pending.input);
pixman_region32_fini(&surface->input);
@@ -2270,9 +2275,8 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
* the view */
weston_view_set_output(shsurf->wview_anim_fade,
shsurf->view->output);
- weston_view_set_position(shsurf->wview_anim_fade,
- shsurf->view->geometry.pos_offset.x,
- shsurf->view->geometry.pos_offset.y);
+ pos.c = shsurf->view->geometry.pos_offset;
+ weston_view_set_position(shsurf->wview_anim_fade, pos);
weston_layer_entry_insert(&shsurf->view->layer_link,
&shsurf->wview_anim_fade->layer_link);
@@ -2295,29 +2299,29 @@ set_maximized_position(struct desktop_shell *shell,
{
pixman_rectangle32_t area;
struct weston_geometry geometry;
+ struct weston_coord_global pos;
get_output_work_area(shell, shsurf->output, &area);
geometry = weston_desktop_surface_get_geometry(shsurf->desktop_surface);
- weston_view_set_position(shsurf->view,
- area.x - geometry.x,
- area.y - geometry.y);
+ pos.c = weston_coord(area.x - geometry.x,
+ area.y - geometry.y);
+ weston_view_set_position(shsurf->view, pos);
}
static void
set_position_from_xwayland(struct shell_surface *shsurf)
{
struct weston_geometry geometry;
- float x;
- float y;
+ struct weston_coord_global pos;
assert(shsurf->xwayland.is_set);
geometry = weston_desktop_surface_get_geometry(shsurf->desktop_surface);
- x = shsurf->xwayland.x - geometry.x;
- y = shsurf->xwayland.y - geometry.y;
+ pos.c = weston_coord(shsurf->xwayland.x - geometry.x,
+ shsurf->xwayland.y - geometry.y);
- weston_view_set_position(shsurf->view, x, y);
+ weston_view_set_position(shsurf->view, pos);
#ifdef WM_DEBUG
weston_log("%s: XWM %d, %d; geometry %d, %d; view %f, %f\n",
@@ -2491,7 +2495,7 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
offset.c = weston_coord_sub(to_g.c, from_g.c);
pos.c = weston_coord_add(view->geometry.pos_offset, offset.c);
- weston_view_set_position(shsurf->view, pos.c.x, pos.c.y);
+ weston_view_set_position(shsurf->view, pos);
}
shsurf->last_width = surface->width;
@@ -2857,6 +2861,7 @@ static void
configure_static_view(struct weston_view *ev, struct weston_layer *layer, int x, int y)
{
struct weston_view *v, *next;
+ struct weston_coord_global pos;
if (!ev->output)
return;
@@ -2869,7 +2874,8 @@ configure_static_view(struct weston_view *ev, struct weston_layer *layer, int x,
}
}
- weston_view_set_position(ev, ev->output->x + x, ev->output->y + y);
+ pos.c = weston_coord(ev->output->x + x, ev->output->y + y);
+ weston_view_set_position(ev, pos);
weston_surface_map(ev->surface);
ev->is_mapped = true;
@@ -3306,6 +3312,7 @@ set_tiled_orientation(struct weston_surface *focus,
int width, height;
pixman_rectangle32_t area;
struct weston_geometry geom;
+ struct weston_coord_global pos;
int x, y;
surface = weston_surface_get_main_surface(focus);
@@ -3336,7 +3343,8 @@ set_tiled_orientation(struct weston_surface *focus,
else if (orientation & WESTON_TOP_LEVEL_TILED_ORIENTATION_BOTTOM)
y += height;
- weston_view_set_position(shsurf->view, x, y);
+ pos.c = weston_coord(x, y);
+ weston_view_set_position(shsurf->view, pos);
weston_desktop_surface_set_size(shsurf->desktop_surface, width, height);
weston_desktop_surface_set_orientation(shsurf->desktop_surface, orientation);
weston_compositor_schedule_repaint(surface->compositor);
@@ -3544,9 +3552,12 @@ rotate_grab_motion(struct weston_pointer_grab *grab,
dposx = rotate->center.x - cposx;
dposy = rotate->center.y - cposy;
if (dposx != 0.0f || dposy != 0.0f) {
- weston_view_set_position(shsurf->view,
- shsurf->view->geometry.pos_offset.x + dposx,
- shsurf->view->geometry.pos_offset.y + dposy);
+ struct weston_coord_global pos;
+
+ pos.c = shsurf->view->geometry.pos_offset;
+ pos.c.x += dposx;
+ pos.c.y += dposy;
+ weston_view_set_position(shsurf->view, pos);
}
/* Repaint implies weston_view_update_transform(), which
@@ -4003,6 +4014,7 @@ shell_fade_create_fade_out_view(struct shell_surface *shsurf,
{
struct weston_view *view;
struct weston_output *woutput;
+ struct weston_coord_global pos;
view = weston_view_create(surface);
if (!view)
@@ -4012,9 +4024,8 @@ shell_fade_create_fade_out_view(struct shell_surface *shsurf,
/* set the initial position and output just in case we happen to not
* move it around and just destroy it */
weston_view_set_output(view, woutput);
- weston_view_set_position(view,
- shsurf->view->geometry.pos_offset.x,
- shsurf->view->geometry.pos_offset.y);
+ pos.c = shsurf->view->geometry.pos_offset;
+ weston_view_set_position(view, pos);
view->is_mapped = true;
return view;
@@ -4223,6 +4234,7 @@ weston_view_set_initial_position(struct weston_view *view,
struct weston_output *output, *target_output = NULL;
struct weston_seat *seat;
pixman_rectangle32_t area;
+ struct weston_coord_global pos;
/* As a heuristic place the new window on the same output as the
* pointer. Falling back to the output containing 0, 0.
@@ -4247,8 +4259,9 @@ weston_view_set_initial_position(struct weston_view *view,
}
if (!target_output) {
- weston_view_set_position(view, 10 + random() % 400,
- 10 + random() % 400);
+ pos.c = weston_coord(10 + random() % 400,
+ 10 + random() % 400);
+ weston_view_set_position(view, pos);
return;
}
@@ -4269,7 +4282,8 @@ weston_view_set_initial_position(struct weston_view *view,
if (range_y > 0)
y += random() % range_y;
- weston_view_set_position(view, x, y);
+ pos.c = weston_coord(x, y);
+ weston_view_set_position(view, pos);
}
static bool
@@ -4666,13 +4680,16 @@ shell_reposition_view_on_output_change(struct weston_view *view)
return;
if (!visible) {
+ struct weston_coord_global pos;
+
first_output = container_of(ec->output_list.next,
struct weston_output, link);
- x = first_output->x + first_output->width / 4;
- y = first_output->y + first_output->height / 4;
+ pos.c = weston_coord(first_output->x, first_output->y);
+ pos.c.x += first_output->width / 4;
+ pos.c.y += first_output->height / 4;
- weston_view_set_position(view, x, y);
+ weston_view_set_position(view, pos);
} else {
weston_view_geometry_dirty(view);
@@ -4812,15 +4829,16 @@ handle_output_move_layer(struct desktop_shell *shell,
{
struct weston_output *output = data;
struct weston_view *view;
- float x, y;
wl_list_for_each(view, &layer->view_list.link, layer_link.link) {
+ struct weston_coord_global pos;
+
if (view->output != output)
continue;
- x = view->geometry.pos_offset.x + output->move_x;
- y = view->geometry.pos_offset.y + output->move_y;
- weston_view_set_position(view, x, y);
+ pos.c = weston_coord(output->move_x, output->move_y);
+ pos.c = weston_coord_add(view->geometry.pos_offset, pos.c);
+ weston_view_set_position(view, pos);
}
}
diff --git a/fullscreen-shell/fullscreen-shell.c b/fullscreen-shell/fullscreen-shell.c
index 28fb58b7..d3af6eec 100644
--- a/fullscreen-shell/fullscreen-shell.c
+++ b/fullscreen-shell/fullscreen-shell.c
@@ -365,7 +365,6 @@ restore_output_mode(struct weston_output *output)
static void
fs_output_scale_view(struct fs_output *fsout, float width, float height)
{
- float x, y;
int32_t surf_x, surf_y, surf_width, surf_height;
struct weston_matrix *matrix;
struct weston_view *view = fsout->view;
@@ -375,10 +374,15 @@ fs_output_scale_view(struct fs_output *fsout, float width, float height)
&surf_width, &surf_height);
if (output->width == surf_width && output->height == surf_height) {
- weston_view_set_position(view,
- fsout->output->x - surf_x,
- fsout->output->y - surf_y);
+ struct weston_coord_global pos;
+
+ pos.c = weston_coord(fsout->output->x, fsout->output->y);
+ pos.c.x -= surf_x;
+ pos.c.y -= surf_y;
+ weston_view_set_position(view, pos);
} else {
+ struct weston_coord_global pos;
+
matrix = &fsout->transform.matrix;
weston_matrix_init(matrix);
@@ -388,10 +392,11 @@ fs_output_scale_view(struct fs_output *fsout, float width, float height)
wl_list_insert(&fsout->view->geometry.transformation_list,
&fsout->transform.link);
- x = output->x + (output->width - width) / 2 - surf_x;
- y = output->y + (output->height - height) / 2 - surf_y;
+ pos.c = weston_coord(output->x, output->y);
+ pos.c.x += (output->width - width) / 2 - surf_x;
+ pos.c.y += (output->height - height) / 2 - surf_y;
- weston_view_set_position(view, x, y);
+ weston_view_set_position(view, pos);
}
}
@@ -405,6 +410,7 @@ fs_output_configure_simple(struct fs_output *fsout,
struct weston_output *output = fsout->output;
float output_aspect, surface_aspect;
int32_t surf_x, surf_y, surf_width, surf_height;
+ struct weston_coord_global pos;
if (fsout->pending.surface == configured_surface)
fs_output_apply_pending(fsout);
@@ -458,9 +464,10 @@ fs_output_configure_simple(struct fs_output *fsout,
break;
}
- weston_view_set_position(fsout->curtain->view,
- fsout->output->x - surf_x,
- fsout->output->y - surf_y);
+ pos.c = weston_coord(fsout->output->x, fsout->output->y);
+ pos.c.x -= surf_x;
+ pos.c.y -= surf_y;
+ weston_view_set_position(fsout->curtain->view, pos);
weston_surface_set_size(fsout->curtain->view->surface,
fsout->output->width,
fsout->output->height);
@@ -472,6 +479,7 @@ fs_output_configure_for_mode(struct fs_output *fsout,
{
int32_t surf_x, surf_y, surf_width, surf_height;
struct weston_mode mode;
+ struct weston_coord_global pos;
int ret;
if (fsout->pending.surface != configured_surface) {
@@ -536,9 +544,10 @@ fs_output_configure_for_mode(struct fs_output *fsout,
fs_output_apply_pending(fsout);
- weston_view_set_position(fsout->view,
- fsout->output->x - surf_x,
- fsout->output->y - surf_y);
+ pos.c = weston_coord(fsout->output->x, fsout->output->y);
+ pos.c.x -= surf_x;
+ pos.c.y -= surf_y;
+ weston_view_set_position(fsout->view, pos);
}
static void
diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h
index f4bc8cbe..aa55fd99 100644
--- a/include/libweston/libweston.h
+++ b/include/libweston/libweston.h
@@ -2151,11 +2151,11 @@ weston_view_destroy(struct weston_view *view);
void
weston_view_set_rel_position(struct weston_view *view,
- float x, float y);
+ struct weston_coord_surface offset);
void
weston_view_set_position(struct weston_view *view,
- float x, float y);
+ struct weston_coord_global pos);
void
weston_view_set_transform_parent(struct weston_view *view,
diff --git a/kiosk-shell/kiosk-shell-grab.c b/kiosk-shell/kiosk-shell-grab.c
index 1a4db85a..86363f82 100644
--- a/kiosk-shell/kiosk-shell-grab.c
+++ b/kiosk-shell/kiosk-shell-grab.c
@@ -76,7 +76,7 @@ pointer_move_grab_motion(struct weston_pointer_grab *pointer_grab,
struct weston_pointer *pointer = pointer_grab->pointer;
struct kiosk_shell_surface *shsurf = shgrab->shsurf;
struct weston_surface *surface;
- int dx, dy;
+ struct weston_coord_global pos;
weston_pointer_move(pointer, event);
@@ -85,10 +85,11 @@ pointer_move_grab_motion(struct weston_pointer_grab *pointer_grab,
surface = weston_desktop_surface_get_surface(shsurf->desktop_surface);
- dx = pointer->pos.c.x + wl_fixed_to_double(shgrab->dx);
- dy = pointer->pos.c.y + wl_fixed_to_double(shgrab->dy);
+ pos = pointer->pos;
+ pos.c.x += wl_fixed_to_double(shgrab->dx);
+ pos.c.y += wl_fixed_to_double(shgrab->dy);
- weston_view_set_position(shsurf->view, dx, dy);
+ weston_view_set_position(shsurf->view, pos);
weston_compositor_schedule_repaint(surface->compositor);
}
@@ -162,6 +163,7 @@ touch_move_grab_motion(struct weston_touch_grab *touch_grab,
struct weston_touch *touch = touch_grab->touch;
struct kiosk_shell_surface *shsurf = shgrab->shsurf;
struct weston_surface *surface;
+ struct weston_coord_global pos;
int dx, dy;
if (!shsurf || !shgrab->active)
@@ -172,7 +174,8 @@ touch_move_grab_motion(struct weston_touch_grab *touch_grab,
dx = wl_fixed_to_int(touch->grab_x + shgrab->dx);
dy = wl_fixed_to_int(touch->grab_y + shgrab->dy);
- weston_view_set_position(shsurf->view, dx, dy);
+ pos.c = weston_coord(dx, dy);
+ weston_view_set_position(shsurf->view, pos);
weston_compositor_schedule_repaint(surface->compositor);
}
diff --git a/kiosk-shell/kiosk-shell.c b/kiosk-shell/kiosk-shell.c
index 19c32650..418891fd 100644
--- a/kiosk-shell/kiosk-shell.c
+++ b/kiosk-shell/kiosk-shell.c
@@ -781,12 +781,14 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
weston_shell_utils_center_on_output(shsurf->view,
shsurf->output);
} else {
+ struct weston_coord_global tmp;
struct weston_geometry geometry =
weston_desktop_surface_get_geometry(desktop_surface);
float x = shsurf->xwayland.x - geometry.x;
float y = shsurf->xwayland.y - geometry.y;
- weston_view_set_position(shsurf->view, x, y);
+ tmp.c = weston_coord(x, y);
+ weston_view_set_position(shsurf->view, tmp);
}
weston_view_update_transform(shsurf->view);
@@ -822,7 +824,7 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
pos.c = weston_coord_add(shsurf->view->geometry.pos_offset,
offset.c);
- weston_view_set_position(shsurf->view, pos.c.x, pos.c.y);
+ weston_view_set_position(shsurf->view, pos);
weston_view_update_transform(shsurf->view);
}
@@ -1128,23 +1130,26 @@ kiosk_shell_handle_output_moved(struct wl_listener *listener, void *data)
container_of(listener, struct kiosk_shell, output_moved_listener);
struct weston_output *output = data;
struct weston_view *view;
+ struct weston_coord_global pos;
wl_list_for_each(view, &shell->background_layer.view_list.link,
layer_link.link) {
if (view->output != output)
continue;
- weston_view_set_position(view,
- view->geometry.pos_offset.x + output->move_x,
- view->geometry.pos_offset.y + output->move_y);
+ pos.c = view->geometry.pos_offset;
+ pos.c.x += output->move_x;
+ pos.c.y += output->move_y;
+ weston_view_set_position(view, pos);
}
wl_list_for_each(view, &shell->normal_layer.view_list.link,
layer_link.link) {
if (view->output != output)
continue;
- weston_view_set_position(view,
- view->geometry.pos_offset.x + output->move_x,
- view->geometry.pos_offset.y + output->move_y);
+ pos.c = view->geometry.pos_offset;
+ pos.c.x += output->move_x;
+ pos.c.x += output->move_y;
+ weston_view_set_position(view, pos);
}
}
diff --git a/libweston/compositor.c b/libweston/compositor.c
index 379cf391..aa9f3acb 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -1584,29 +1584,32 @@ weston_surface_damage(struct weston_surface *surface)
}
WL_EXPORT void
-weston_view_set_rel_position(struct weston_view *view, float x, float y)
+weston_view_set_rel_position(struct weston_view *view,
+ struct weston_coord_surface offset)
{
assert(view->geometry.parent);
+ assert(offset.coordinate_space_id == view->geometry.parent->surface);
- if (view->geometry.pos_offset.x == x &&
- view->geometry.pos_offset.y == y)
+ if (view->geometry.pos_offset.x == offset.c.x &&
+ view->geometry.pos_offset.y == offset.c.y)
return;
- view->geometry.pos_offset = weston_coord(x, y);
+ view->geometry.pos_offset = offset.c;
weston_view_geometry_dirty(view);
}
WL_EXPORT void
-weston_view_set_position(struct weston_view *view, float x, float y)
+weston_view_set_position(struct weston_view *view,
+ struct weston_coord_global pos)
{
assert(view->surface->committed != subsurface_committed);
assert(!view->geometry.parent);
- if (view->geometry.pos_offset.x == x &&
- view->geometry.pos_offset.y == y)
+ if (view->geometry.pos_offset.x == pos.c.x &&
+ view->geometry.pos_offset.y == pos.c.y)
return;
- view->geometry.pos_offset = weston_coord(x, y);
+ view->geometry.pos_offset = pos.c;
weston_view_geometry_dirty(view);
}
@@ -2901,9 +2904,7 @@ view_list_add_subsurface_view(struct weston_compositor *compositor,
} else {
view = weston_view_create(sub->surface);
weston_view_set_transform_parent(view, parent);
- weston_view_set_rel_position(view,
- sub->position.offset.c.x,
- sub->position.offset.c.y);
+ weston_view_set_rel_position(view, sub->position.offset);
}
view->parent_view = parent;
@@ -4524,8 +4525,7 @@ weston_subsurface_parent_commit(struct weston_subsurface *sub,
if (sub->position.changed) {
wl_list_for_each(view, &sub->surface->views, surface_link)
weston_view_set_rel_position(view,
- sub->position.offset.c.x,
- sub->position.offset.c.y);
+ sub->position.offset);
sub->position.changed = false;
}
@@ -4546,8 +4546,10 @@ subsurface_committed(struct weston_surface *surface,
{
struct weston_view *view;
+ assert(new_origin.coordinate_space_id == surface);
+
wl_list_for_each(view, &surface->views, surface_link) {
- struct weston_coord_surface tmp = new_origin;
+ struct weston_coord_surface tmp;
if (!view->geometry.parent) {
weston_log_paced(&view->subsurface_parent_log_pacer,
@@ -4556,9 +4558,11 @@ subsurface_committed(struct weston_surface *surface,
continue;
}
- tmp.c = weston_coord_add(tmp.c,
- view->geometry.pos_offset);
- weston_view_set_rel_position(view, tmp.c.x, tmp.c.y);
+ tmp = weston_coord_surface(view->geometry.pos_offset.x,
+ view->geometry.pos_offset.y,
+ view->geometry.parent->surface);
+ tmp.c = weston_coord_add(tmp.c, new_origin.c);
+ weston_view_set_rel_position(view, tmp);
}
/* No need to check parent mappedness, because if parent is not
* mapped, parent is not in a visible layer, so this sub-surface
@@ -4788,7 +4792,9 @@ subsurface_set_position(struct wl_client *client,
if (!sub)
return;
- sub->position.offset = weston_coord_surface(x, y, sub->surface);
+ assert(sub->parent);
+
+ sub->position.offset = weston_coord_surface(x, y, sub->parent);
sub->position.changed = true;
}
@@ -5048,7 +5054,7 @@ weston_subsurface_create(uint32_t id, struct weston_surface *surface,
return NULL;
}
- sub->position.offset = weston_coord_surface(0, 0, surface);
+ sub->position.offset = weston_coord_surface(0, 0, parent);
wl_resource_set_implementation(sub->resource,
&subsurface_implementation,
diff --git a/libweston/data-device.c b/libweston/data-device.c
index fbec4e18..e786eb89 100644
--- a/libweston/data-device.c
+++ b/libweston/data-device.c
@@ -415,7 +415,7 @@ drag_surface_configure(struct weston_drag *drag,
struct weston_coord_surface new_origin)
{
struct weston_layer_entry *list;
- float fx, fy;
+ struct weston_coord_global pos;
assert((pointer != NULL && touch == NULL) ||
(pointer == NULL && touch != NULL));
@@ -440,15 +440,14 @@ drag_surface_configure(struct weston_drag *drag,
drag->offset.c = weston_coord_add(drag->offset.c, new_origin.c);
/* init to 0 for avoiding a compile warning */
- fx = fy = 0;
- if (pointer) {
- fx = pointer->pos.c.x + drag->offset.c.x;
- fy = pointer->pos.c.y + drag->offset.c.y;
- } else if (touch) {
- fx = wl_fixed_to_double(touch->grab_x) + drag->offset.c.x;
- fy = wl_fixed_to_double(touch->grab_y) + drag->offset.c.y;
- }
- weston_view_set_position(drag->icon, fx, fy);
+ pos.c = weston_coord(0, 0);
+ if (pointer)
+ pos = pointer->pos;
+ else if (touch)
+ pos.c = weston_coord_from_fixed(touch->grab_x, touch->grab_y);
+
+ pos.c = weston_coord_add(pos.c, drag->offset.c);
+ weston_view_set_position(drag->icon, pos);
}
static int
@@ -617,15 +616,15 @@ drag_grab_motion(struct weston_pointer_grab *grab,
struct weston_pointer_drag *drag =
container_of(grab, struct weston_pointer_drag, grab);
struct weston_pointer *pointer = drag->grab.pointer;
- float fx, fy;
uint32_t msecs;
weston_pointer_move(pointer, event);
if (drag->base.icon) {
- fx = pointer->pos.c.x + drag->base.offset.c.x;
- fy = pointer->pos.c.y + drag->base.offset.c.y;
- weston_view_set_position(drag->base.icon, fx, fy);
+ struct weston_coord_global pos;
+
+ pos.c = weston_coord_add(pointer->pos.c, drag->base.offset.c);
+ weston_view_set_position(drag->base.icon, pos);
weston_view_schedule_repaint(drag->base.icon);
}
@@ -812,7 +811,6 @@ drag_grab_touch_motion(struct weston_touch_grab *grab,
struct weston_touch_drag *touch_drag =
container_of(grab, struct weston_touch_drag, grab);
struct weston_touch *touch = grab->touch;
- float fx, fy;
uint32_t msecs;
if (touch_id != touch->grab_touch_id)
@@ -820,11 +818,11 @@ drag_grab_touch_motion(struct weston_touch_grab *grab,
drag_grab_touch_focus(touch_drag);
if (touch_drag->base.icon) {
- fx = wl_fixed_to_double(touch->grab_x) +
- touch_drag->base.offset.c.x;
- fy = wl_fixed_to_double(touch->grab_y) +
- touch_drag->base.offset.c.y;
- weston_view_set_position(touch_drag->base.icon, fx, fy);
+ struct weston_coord_global pos;
+
+ pos.c = weston_coord_from_fixed(touch->grab_x, touch->grab_y);
+ pos.c = weston_coord_add(pos.c, touch_drag->base.offset.c);
+ weston_view_set_position(touch_drag->base.icon, pos);
weston_view_schedule_repaint(touch_drag->base.icon);
}
diff --git a/libweston/desktop/surface.c b/libweston/desktop/surface.c
index 74707f6a..e61f50aa 100644
--- a/libweston/desktop/surface.c
+++ b/libweston/desktop/surface.c
@@ -81,27 +81,35 @@ static void
weston_desktop_surface_update_view_position(struct weston_desktop_surface *surface)
{
struct weston_desktop_view *view;
- int32_t x, y;
-
- x = surface->position.x;
- y = surface->position.y;
if (surface->use_geometry) {
struct weston_desktop_surface *parent =
weston_desktop_surface_get_parent(surface);
struct weston_geometry geometry, parent_geometry;
+ struct weston_coord offset;
+
+ offset = weston_coord(surface->position.x, surface->position.y);
geometry = weston_desktop_surface_get_geometry(surface);
parent_geometry = weston_desktop_surface_get_geometry(parent);
- x += parent_geometry.x - geometry.x;
- y += parent_geometry.y - geometry.y;
+ offset.x += parent_geometry.x - geometry.x;
+ offset.y += parent_geometry.y - geometry.y;
+ wl_list_for_each(view, &surface->view_list, link) {
+ struct weston_view *wv = view->view;
+ struct weston_coord_surface surf_offset;
- wl_list_for_each(view, &surface->view_list, link)
- weston_view_set_rel_position(view->view, x, y);
+ surf_offset.c = offset;
+ surf_offset.coordinate_space_id = wv->geometry.parent->surface;
+ weston_view_set_rel_position(wv, surf_offset);
+ }
} else {
+ struct weston_coord_global pos;
+
+ pos.c = weston_coord(surface->position.x, surface->position.y);
+
wl_list_for_each(view, &surface->view_list, link)
- weston_view_set_position(view->view, x, y);
+ weston_view_set_position(view->view, pos);
}
}
diff --git a/libweston/desktop/xwayland.c b/libweston/desktop/xwayland.c
index b4bc9ee6..fd7300b5 100644
--- a/libweston/desktop/xwayland.c
+++ b/libweston/desktop/xwayland.c
@@ -354,9 +354,12 @@ set_fullscreen(struct weston_desktop_xwayland_surface *surface,
static void
set_xwayland(struct weston_desktop_xwayland_surface *surface, int x, int y)
{
+ struct weston_coord_global pos;
+
+ pos.c = weston_coord(x, y);
weston_desktop_xwayland_surface_change_state(surface, XWAYLAND, NULL,
x, y);
- weston_view_set_position(surface->view, x, y);
+ weston_view_set_position(surface->view, pos);
}
static int
diff --git a/libweston/input.c b/libweston/input.c
index 164dbf36..d335346d 100644
--- a/libweston/input.c
+++ b/libweston/input.c
@@ -1863,9 +1863,10 @@ weston_tablet_tool_cursor_move(struct weston_tablet_tool *tool,
tool->pos = pos;
if (tool->sprite) {
- weston_view_set_position(tool->sprite,
- pos.c.x - tool->hotspot.c.x,
- pos.c.y - tool->hotspot.c.y);
+ struct weston_coord_global hotspot;
+
+ hotspot.c = weston_coord_sub(pos.c, tool->hotspot.c);
+ weston_view_set_position(tool->sprite, hotspot);
weston_view_schedule_repaint(tool->sprite);
}
}
@@ -2197,9 +2198,9 @@ weston_pointer_move_to(struct weston_pointer *pointer,
pointer->pos = pos;
if (pointer->sprite) {
- weston_view_set_position(pointer->sprite,
- pos.c.x - pointer->hotspot.c.x,
- pos.c.y - pointer->hotspot.c.y);
+ pos.c = weston_coord_sub(pointer->pos.c,
+ pointer->hotspot.c);
+ weston_view_set_position(pointer->sprite, pos);
weston_view_schedule_repaint(pointer->sprite);
}
@@ -3241,7 +3242,7 @@ tablet_tool_cursor_surface_committed(struct weston_surface *es,
tool->hotspot.c = weston_coord_sub(tool->hotspot.c, new_origin.c);
pos.c = weston_coord_sub(tool->pos.c, tool->hotspot.c);
- weston_view_set_position(tool->sprite, pos.c.x, pos.c.y);
+ weston_view_set_position(tool->sprite, pos);
empty_region(&es->pending.input);
empty_region(&es->input);
@@ -3537,7 +3538,7 @@ pointer_cursor_surface_committed(struct weston_surface *es,
new_origin.c);
pos.c = weston_coord_sub(pointer->pos.c, pointer->hotspot.c);
- weston_view_set_position(pointer->sprite, pos.c.x, pos.c.y);
+ weston_view_set_position(pointer->sprite, pos);
empty_region(&es->pending.input);
empty_region(&es->input);
diff --git a/libweston/shell-utils/shell-utils.c b/libweston/shell-utils/shell-utils.c
index 6665062f..98c3d1d2 100644
--- a/libweston/shell-utils/shell-utils.c
+++ b/libweston/shell-utils/shell-utils.c
@@ -130,20 +130,22 @@ weston_shell_utils_center_on_output(struct weston_view *view,
struct weston_output *output)
{
int32_t surf_x, surf_y, width, height;
- float x, y;
+ struct weston_coord_global pos;
if (!output) {
- weston_view_set_position(view, 0, 0);
+ pos.c = weston_coord(0, 0);
+ weston_view_set_position(view, pos);
return;
}
weston_shell_utils_subsurfaces_boundingbox(view->surface, &surf_x,
&surf_y, &width, &height);
- x = output->x + (output->width - width) / 2 - surf_x / 2;
- y = output->y + (output->height - height) / 2 - surf_y / 2;
+ pos.c = weston_coord(output->x, output->y);
+ pos.c.x += (output->width - width) / 2 - surf_x / 2;
+ pos.c.y += (output->height - height) / 2 - surf_y / 2;
- weston_view_set_position(view, x, y);
+ weston_view_set_position(view, pos);
}
/**
@@ -177,6 +179,7 @@ weston_shell_utils_curtain_create(struct weston_compositor *compositor,
struct weston_surface *surface = NULL;
struct weston_buffer_reference *buffer_ref;
struct weston_view *view;
+ struct weston_coord_global pos;
curtain = zalloc(sizeof(*curtain));
if (curtain == NULL)
@@ -218,7 +221,8 @@ weston_shell_utils_curtain_create(struct weston_compositor *compositor,
weston_surface_map(surface);
- weston_view_set_position(view, params->x, params->y);
+ pos.c = weston_coord(params->x, params->y);
+ weston_view_set_position(view, pos);
return curtain;
diff --git a/libweston/touch-calibration.c b/libweston/touch-calibration.c
index bbef89fc..67725548 100644
--- a/libweston/touch-calibration.c
+++ b/libweston/touch-calibration.c
@@ -181,6 +181,7 @@ map_calibrator(struct weston_touch_calibrator *calibrator)
{
struct weston_compositor *c = calibrator->compositor;
struct weston_touch_device *device = calibrator->device;
+ struct weston_coord_global pos;
static const struct weston_touch_device_matrix identity = {
.m = { 1, 0, 0, 0, 1, 0}
};
@@ -199,9 +200,8 @@ map_calibrator(struct weston_touch_calibrator *calibrator)
weston_layer_entry_insert(&c->calibrator_layer.view_list,
&calibrator->view->layer_link);
- weston_view_set_position(calibrator->view,
- calibrator->output->x,
- calibrator->output->y);
+ pos.c = weston_coord(calibrator->output->x, calibrator->output->y);
+ weston_view_set_position(calibrator->view, pos);
calibrator->view->output = calibrator->surface->output;
calibrator->view->is_mapped = true;
diff --git a/tests/surface-global-test.c b/tests/surface-global-test.c
index a58acad8..5db66664 100644
--- a/tests/surface-global-test.c
+++ b/tests/surface-global-test.c
@@ -60,7 +60,8 @@ PLUGIN_TEST(surface_to_from_global)
assert(view);
surface->width = 50;
surface->height = 50;
- weston_view_set_position(view, 5, 10);
+ cg.c = weston_coord(5, 10);
+ weston_view_set_position(view, cg);
weston_view_update_transform(view);
cs = weston_coord_surface(33, 22, surface);
diff --git a/tests/surface-test.c b/tests/surface-test.c
index c1a4499a..5bfd2d0a 100644
--- a/tests/surface-test.c
+++ b/tests/surface-test.c
@@ -59,7 +59,8 @@ PLUGIN_TEST(surface_transform)
assert(view);
surface->width = 200;
surface->height = 200;
- weston_view_set_position(view, 100, 100);
+ coord_g.c = weston_coord(100, 100);
+ weston_view_set_position(view, coord_g);
weston_view_update_transform(view);
coord_s = weston_coord_surface(20, 20, surface);
coord_g = weston_coord_surface_to_global(view, coord_s);
@@ -67,7 +68,8 @@ PLUGIN_TEST(surface_transform)
fprintf(stderr, "20,20 maps to %f, %f\n", coord_g.c.x, coord_g.c.y);
assert(coord_g.c.x == 120 && coord_g.c.y == 120);
- weston_view_set_position(view, 150, 300);
+ coord_g.c = weston_coord(150, 300);
+ weston_view_set_position(view, coord_g);
weston_view_update_transform(view);
coord_s = weston_coord_surface(50, 40, surface);
coord_g = weston_coord_surface_to_global(view, coord_s);
diff --git a/tests/weston-test-desktop-shell.c b/tests/weston-test-desktop-shell.c
index 84855c9e..a1fff473 100644
--- a/tests/weston-test-desktop-shell.c
+++ b/tests/weston-test-desktop-shell.c
@@ -86,6 +86,7 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
weston_desktop_surface_get_surface(desktop_surface);
struct weston_geometry geometry =
weston_desktop_surface_get_geometry(desktop_surface);
+ struct weston_coord_global pos;
assert(dts->view);
@@ -94,7 +95,10 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
weston_surface_map(surface);
weston_layer_entry_insert(&dts->layer.view_list, &dts->view->layer_link);
- weston_view_set_position(dts->view, 0 - geometry.x, 0 - geometry.y);
+ pos.c = weston_coord(0, 0);
+ pos.c.x -= geometry.x;
+ pos.c.y -= geometry.y;
+ weston_view_set_position(dts->view, pos);
weston_view_update_transform(dts->view);
dts->view->is_mapped = true;
}
@@ -195,6 +199,7 @@ wet_shell_init(struct weston_compositor *ec,
.get_label = background_get_label,
.surface_private = NULL,
};
+ struct weston_coord_global pos;
dts = zalloc(sizeof *dts);
if (!dts)
@@ -221,7 +226,8 @@ wet_shell_init(struct weston_compositor *ec,
weston_surface_set_role(dts->background->view->surface,
"test-desktop background", NULL, 0);
- weston_view_set_position(dts->background->view, 0, 0);
+ pos.c = weston_coord(0, 0);
+ weston_view_set_position(dts->background->view, pos);
weston_layer_entry_insert(&dts->background_layer.view_list,
&dts->background->view->layer_link);
weston_view_update_transform(dts->background->view);
diff --git a/tests/weston-test.c b/tests/weston-test.c
index cc6ba433..671ed088 100644
--- a/tests/weston-test.c
+++ b/tests/weston-test.c
@@ -157,13 +157,14 @@ test_surface_committed(struct weston_surface *surface,
{
struct weston_test_surface *test_surface = surface->committed_private;
struct weston_test *test = test_surface->test;
+ struct weston_coord_global pos;
if (wl_list_empty(&test_surface->view->layer_link.link))
weston_layer_entry_insert(&test->layer.view_list,
&test_surface->view->layer_link);
- weston_view_set_position(test_surface->view,
- test_surface->x, test_surface->y);
+ pos.c = weston_coord(test_surface->x, test_surface->y);
+ weston_view_set_position(test_surface->view, pos);
weston_view_update_transform(test_surface->view);