diff --git a/compositor/main.c b/compositor/main.c index c6144660c..d2c31b0bd 100644 --- a/compositor/main.c +++ b/compositor/main.c @@ -1766,10 +1766,9 @@ weston_output_lazy_align(struct weston_output *output) if (!wl_list_empty(&c->output_list)) { peer = container_of(c->output_list.prev, struct weston_output, link); - next_x = peer->x + peer->width; + next_x = peer->pos.c.x + peer->width; } - output->x = next_x; - output->y = 0; + output->pos.c = weston_coord(next_x, 0); } static void diff --git a/compositor/screen-share.c b/compositor/screen-share.c index 9ba64cf70..305bab186 100644 --- a/compositor/screen-share.c +++ b/compositor/screen-share.c @@ -870,7 +870,9 @@ shared_output_repainted(struct wl_listener *listener, void *data) */ pixman_region32_init(&sb_damage); pixman_region32_copy(&sb_damage, global_output_damage); - pixman_region32_translate(&sb_damage, -so->output->x, -so->output->y); + pixman_region32_translate(&sb_damage, + -so->output->pos.c.x, + -so->output->pos.c.y); /* Apply damage to all buffers */ wl_list_for_each(sb, &so->shm.buffers, link) @@ -1149,12 +1151,12 @@ weston_output_share(struct weston_output *output, struct screen_share *ss) } static struct weston_output * -weston_output_find(struct weston_compositor *c, int32_t x, int32_t y) +weston_output_find(struct weston_compositor *c, struct weston_coord_global pos) { struct weston_output *output; wl_list_for_each(output, &c->output_list, link) - if (weston_output_contains_point(output, x, y)) + if (weston_output_contains_coord(output, pos)) return output; return NULL; @@ -1171,8 +1173,7 @@ share_output_binding(struct weston_keyboard *keyboard, pointer = weston_seat_get_pointer(keyboard->seat); if (pointer) { output = weston_output_find(pointer->seat->compositor, - pointer->pos.c.x, - pointer->pos.c.y); + pointer->pos); } else { output = weston_shell_utils_get_focused_output(keyboard->seat->compositor); if (!output) diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c index 0858e33a1..a00b2a686 100644 --- a/desktop-shell/input-panel.c +++ b/desktop-shell/input-panel.c @@ -72,8 +72,10 @@ calc_input_panel_position(struct input_panel_surface *ip_surface, float *x, floa *y = view->geometry.pos_offset.y + shell->text_input.cursor_rectangle.y2; } else { - *x = ip_surface->output->x + (ip_surface->output->width - ip_surface->surface->width) / 2; - *y = ip_surface->output->y + ip_surface->output->height - ip_surface->surface->height; + *x = ip_surface->output->pos.c.x + + (ip_surface->output->width - ip_surface->surface->width) / 2; + *y = ip_surface->output->pos.c.y + + ip_surface->output->height - ip_surface->surface->height; } return 0; } diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 666787d28..56d89ed13 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -389,8 +389,8 @@ get_output_work_area(struct desktop_shell *shell, return; } - area->x = output->x; - area->y = output->y; + area->x = output->pos.c.x; + area->y = output->pos.c.y; get_output_panel_size(shell, output, &panel_width, &panel_height); switch (shell->panel_position) { @@ -580,7 +580,7 @@ create_focus_surface(struct weston_compositor *ec, struct focus_surface *fsurf = NULL; struct weston_curtain_params curtain_params = { .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0, - .x = output->x, .y = output->y, + .x = output->pos.c.x, .y = output->pos.c.y, .width = output->width, .height = output->height, .surface_committed = focus_surface_committed, .get_label = focus_surface_get_label, @@ -1922,7 +1922,7 @@ shell_ensure_fullscreen_black_view(struct shell_surface *shsurf) struct weston_output *output = shsurf->fullscreen_output; struct weston_curtain_params curtain_params = { .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0, - .x = output->x, .y = output->y, + .x = output->pos.c.x, .y = output->pos.c.y, .width = output->width, .height = output->height, .surface_committed = black_surface_committed, .get_label = black_surface_get_label, @@ -2326,7 +2326,7 @@ set_position_from_xwayland(struct shell_surface *shsurf) #ifdef WM_DEBUG weston_log("%s: XWM %d, %d; geometry %d, %d; view %f, %f\n", __func__, shsurf->xwayland.x, shsurf->xwayland.y, - geometry.x, geometry.y, x, y); + (int)geometry.coord.x, (int)geometry.coord.y, pos.x, pos.y); #endif } @@ -2874,7 +2874,9 @@ configure_static_view(struct weston_view *ev, struct weston_layer *layer, int x, } } - pos.c = weston_coord(ev->output->x + x, ev->output->y + y); + pos = ev->output->pos; + pos.c.x += x; + pos.c.y += y; weston_view_set_position(ev, pos); weston_surface_map(ev->surface); ev->is_mapped = true; @@ -3985,7 +3987,7 @@ shell_fade_create_view_for_output(struct desktop_shell *shell, struct weston_output *output = shell_output->output; struct weston_curtain_params curtain_params = { .r = 0.0, .g = 0.0, .b = 0.0, .a = 1.0, - .x = output->x, .y = output->y, + .x = output->pos.c.x, .y = output->pos.c.y, .width = output->width, .height = output->height, .surface_committed = black_surface_committed, .get_label = fade_surface_get_label, @@ -4228,7 +4230,6 @@ weston_view_set_initial_position(struct weston_view *view, struct desktop_shell *shell) { struct weston_compositor *compositor = shell->compositor; - int ix = 0, iy = 0; int32_t range_x, range_y; int32_t x, y; struct weston_output *output, *target_output = NULL; @@ -4241,18 +4242,18 @@ weston_view_set_initial_position(struct weston_view *view, * * TODO: Do something clever for touch too? */ + pos.c = weston_coord(0, 0); wl_list_for_each(seat, &compositor->seat_list, link) { struct weston_pointer *pointer = weston_seat_get_pointer(seat); if (pointer) { - ix = pointer->pos.c.x; - iy = pointer->pos.c.y; + pos = pointer->pos; break; } } wl_list_for_each(output, &compositor->output_list, link) { - if (weston_output_contains_point(output, ix, iy)) { + if (weston_output_contains_coord(output, pos)) { target_output = output; break; } @@ -4655,21 +4656,20 @@ shell_reposition_view_on_output_change(struct weston_view *view) struct weston_output *output, *first_output; struct weston_compositor *ec = view->surface->compositor; struct shell_surface *shsurf; - float x, y; int visible; if (wl_list_empty(&ec->output_list)) return; - x = view->geometry.pos_offset.x; - y = view->geometry.pos_offset.y; - /* At this point the destroyed output is not in the list anymore. * If the view is still visible somewhere, we leave where it is, * otherwise, move it to the first output. */ visible = 0; wl_list_for_each(output, &ec->output_list, link) { - if (weston_output_contains_point(output, x, y)) { + struct weston_coord_global pos; + + pos.c = view->geometry.pos_offset; + if (weston_output_contains_coord(output, pos)) { visible = 1; break; } @@ -4685,7 +4685,7 @@ shell_reposition_view_on_output_change(struct weston_view *view) first_output = container_of(ec->output_list.next, struct weston_output, link); - pos.c = weston_coord(first_output->x, first_output->y); + pos = first_output->pos; pos.c.x += first_output->width / 4; pos.c.y += first_output->height / 4; @@ -4832,12 +4832,11 @@ handle_output_move_layer(struct desktop_shell *shell, wl_list_for_each(view, &layer->view_list.link, layer_link.link) { struct weston_coord_global pos; - if (view->output != output) continue; - pos.c = weston_coord(output->move_x, output->move_y); - pos.c = weston_coord_add(view->geometry.pos_offset, pos.c); + pos.c = weston_coord_add(view->geometry.pos_offset, + output->move.c); weston_view_set_position(view, pos); } } diff --git a/fullscreen-shell/fullscreen-shell.c b/fullscreen-shell/fullscreen-shell.c index d3af6eeca..db461d8db 100644 --- a/fullscreen-shell/fullscreen-shell.c +++ b/fullscreen-shell/fullscreen-shell.c @@ -324,7 +324,7 @@ fs_output_create(struct fullscreen_shell *shell, struct weston_output *output) fsout->surface_destroyed.notify = surface_destroyed; fsout->pending.surface_destroyed.notify = pending_surface_destroyed; fsout->curtain = create_curtain(shell->compositor, fsout, - output->x, output->y, + output->pos.c.x, output->pos.c.y, output->width, output->height); fsout->curtain->view->is_mapped = true; weston_layer_entry_insert(&shell->layer.view_list, @@ -369,20 +369,16 @@ fs_output_scale_view(struct fs_output *fsout, float width, float height) struct weston_matrix *matrix; struct weston_view *view = fsout->view; struct weston_output *output = fsout->output; + struct weston_coord_global pos = fsout->output->pos; weston_shell_utils_subsurfaces_boundingbox(view->surface, &surf_x, &surf_y, &surf_width, &surf_height); if (output->width == surf_width && output->height == surf_height) { - 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); @@ -392,10 +388,8 @@ fs_output_scale_view(struct fs_output *fsout, float width, float height) wl_list_insert(&fsout->view->geometry.transformation_list, &fsout->transform.link); - 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, pos); } } @@ -464,7 +458,7 @@ fs_output_configure_simple(struct fs_output *fsout, break; } - pos.c = weston_coord(fsout->output->x, fsout->output->y); + pos = fsout->output->pos; pos.c.x -= surf_x; pos.c.y -= surf_y; weston_view_set_position(fsout->curtain->view, pos); @@ -544,7 +538,7 @@ fs_output_configure_for_mode(struct fs_output *fsout, fs_output_apply_pending(fsout); - pos.c = weston_coord(fsout->output->x, fsout->output->y); + pos = fsout->output->pos; pos.c.x -= surf_x; pos.c.y -= surf_y; weston_view_set_position(fsout->view, pos); diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index aa55fd991..77242a28b 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -468,7 +468,8 @@ struct weston_output { struct weston_matrix inverse_matrix; struct wl_list animation_list; - int32_t x, y, width, height; + struct weston_coord_global pos; + int32_t width, height; /** List of paint nodes in z-order, from top to bottom, maybe pruned * @@ -503,7 +504,7 @@ struct weston_output { struct wl_signal frame_signal; struct wl_signal destroy_signal; /**< sent when disabled */ - int move_x, move_y; + struct weston_coord_global move; struct timespec frame_time; /* presentation timestamp */ uint64_t msc; /* media stream counter */ int disable_planes; @@ -2550,8 +2551,8 @@ weston_output_allow_protection(struct weston_output *output, bool allow_protection); bool -weston_output_contains_point(struct weston_output *output, - int32_t x, int32_t y); +weston_output_contains_coord(struct weston_output *output, + struct weston_coord_global pos); int weston_compositor_enable_touch_calibrator(struct weston_compositor *compositor, diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index af204a1d2..4df53d8db 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -546,13 +546,13 @@ calc_surface_to_global_matrix_and_mask_to_weston_surface( lp->dest_y, lp->dest_width, lp->dest_height }; - struct ivi_rectangle screen_dest_rect = { output->x, - output->y, + struct ivi_rectangle screen_dest_rect = { output->pos.c.x, + output->pos.c.y, output->width, output->height }; struct ivi_rectangle layer_dest_rect_in_global = - { lp->dest_x + output->x, - lp->dest_y + output->y, + { lp->dest_x + output->pos.c.x, + lp->dest_y + output->pos.c.y, lp->dest_width, lp->dest_height }; struct ivi_rectangle layer_dest_rect_in_global_intersected; @@ -569,7 +569,7 @@ calc_surface_to_global_matrix_and_mask_to_weston_surface( calc_transformation_matrix(&surface_source_rect, &surface_dest_rect, m); calc_transformation_matrix(&layer_source_rect, &layer_dest_rect, m); - weston_matrix_translate(m, output->x, output->y, 0.0f); + weston_matrix_translate(m, output->pos.c.x, output->pos.c.y, 0.0f); /* * destination rectangle of layer in multi screens coordinate diff --git a/kiosk-shell/kiosk-shell.c b/kiosk-shell/kiosk-shell.c index 418891fdc..0f66ed486 100644 --- a/kiosk-shell/kiosk-shell.c +++ b/kiosk-shell/kiosk-shell.c @@ -502,8 +502,8 @@ kiosk_shell_output_recreate_background(struct kiosk_shell_output *shoutput) curtain_params.b = ((bg_color >> 0) & 0xff) / 255.0; curtain_params.a = 1.0; - curtain_params.x = output->x; - curtain_params.y = output->y; + curtain_params.x = output->pos.c.x; + curtain_params.y = output->pos.c.y; curtain_params.width = output->width; curtain_params.height = output->height; @@ -1130,25 +1130,28 @@ 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) { + struct weston_coord_global pos; + if (view->output != output) continue; - pos.c = view->geometry.pos_offset; - pos.c.x += output->move_x; - pos.c.y += output->move_y; + + pos.c = weston_coord_add(view->geometry.pos_offset, + output->move.c); weston_view_set_position(view, pos); } wl_list_for_each(view, &shell->normal_layer.view_list.link, layer_link.link) { + struct weston_coord_global pos; + if (view->output != output) continue; - pos.c = view->geometry.pos_offset; - pos.c.x += output->move_x; - pos.c.x += output->move_y; + + pos.c = weston_coord_add(view->geometry.pos_offset, + output->move.c); weston_view_set_position(view, pos); } } diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index b43791db5..97df57c3c 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -1455,7 +1455,8 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b) goto err; pixman_region32_init_rect(&output->renderbuffer[i]->damage, - output->base.x, output->base.y, + output->base.pos.c.x, + output->base.pos.c.y, output->base.width, output->base.height); } diff --git a/libweston/backend-rdp/rdpdisp.c b/libweston/backend-rdp/rdpdisp.c index 3e2ee210c..784aac41e 100644 --- a/libweston/backend-rdp/rdpdisp.c +++ b/libweston/backend-rdp/rdpdisp.c @@ -315,7 +315,7 @@ rdp_head_contains(struct rdp_head *rdp_head, int32_t x, int32_t y) if (!output) return false; - return rect_contains(x, y, output->x, output->y, + return rect_contains(x, y, output->pos.c.x, output->pos.c.y, output->width * output->scale, output->height * output->scale); } @@ -349,8 +349,8 @@ to_weston_coordinate(RdpPeerContext *peerContext, int32_t *x, int32_t *y) sx *= scale; sy *= scale; /* translate x/y to offset of this output in weston space. */ - sx += output->x; - sy += output->y; + sx += output->pos.c.x; + sy += output->pos.c.y; rdp_debug_verbose(b, "%s: (x:%d, y:%d) -> (sx:%d, sy:%d) at head:%s\n", __func__, *x, *y, sx, sy, head->base.name); *x = sx; diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c index 549048494..6e02b61c2 100644 --- a/libweston/backend-vnc/vnc.c +++ b/libweston/backend-vnc/vnc.c @@ -548,10 +548,10 @@ vnc_region_global_to_output(pixman_region16_t *dst, dest_rects = xcalloc(n_rects, sizeof(*dest_rects)); for (i = 0; i < n_rects; i++) { - dest_rects[i].x1 = src_rects[i].x1 - output->x; - dest_rects[i].y1 = src_rects[i].y1 - output->y; - dest_rects[i].x2 = src_rects[i].x2 - output->x; - dest_rects[i].y2 = src_rects[i].y2 - output->y; + dest_rects[i].x1 = src_rects[i].x1 - output->pos.c.x; + dest_rects[i].y1 = src_rects[i].y1 - output->pos.c.y; + dest_rects[i].x2 = src_rects[i].x2 - output->pos.c.x; + dest_rects[i].y2 = src_rects[i].y2 - output->pos.c.y; } pixman_region_init_rects(dst, dest_rects, n_rects); diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c index d8cf49b7f..4596aaa90 100644 --- a/libweston/backend-wayland/wayland.c +++ b/libweston/backend-wayland/wayland.c @@ -1266,7 +1266,8 @@ wayland_output_enable(struct weston_output *base) weston_log("Creating %dx%d wayland output at (%d, %d)\n", output->base.current_mode->width, output->base.current_mode->height, - output->base.x, output->base.y); + (int)output->base.pos.c.x, + (int)output->base.pos.c.y); if (!output->parent.surface) ret = wayland_backend_create_output_surface(output); diff --git a/libweston/compositor.c b/libweston/compositor.c index aa9f3acbc..f4033aa82 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -264,8 +264,8 @@ weston_mode_switch_send_events(struct weston_head *head, } wl_resource_for_each(resource, &head->xdg_output_resource_list) { zxdg_output_v1_send_logical_position(resource, - output->x, - output->y); + output->pos.c.x, + output->pos.c.y); zxdg_output_v1_send_logical_size(resource, output->width, output->height); @@ -274,10 +274,11 @@ weston_mode_switch_send_events(struct weston_head *head, } WL_EXPORT bool -weston_output_contains_point(struct weston_output *output, - int32_t x, int32_t y) +weston_output_contains_coord(struct weston_output *output, + struct weston_coord_global pos) { - return pixman_region32_contains_point(&output->region, x, y, NULL); + return pixman_region32_contains_point(&output->region, + pos.c.x, pos.c.y, NULL); } static void @@ -294,7 +295,8 @@ weston_mode_switch_finish(struct weston_output *output, /* Update output region and transformation matrix */ weston_output_transform_scale_init(output, output->transform, output->current_scale); - pixman_region32_init_rect(&output->region, output->x, output->y, + pixman_region32_init_rect(&output->region, + output->pos.c.x, output->pos.c.y, output->width, output->height); weston_output_update_matrix(output); @@ -303,6 +305,7 @@ weston_mode_switch_finish(struct weston_output *output, * lower-right corner */ wl_list_for_each(seat, &output->compositor->seat_list, link) { struct weston_pointer *pointer = weston_seat_get_pointer(seat); + double quantum = 1.0 / 1024.0; int32_t x, y; if (!pointer) @@ -312,15 +315,14 @@ weston_mode_switch_finish(struct weston_output *output, y = pointer->pos.c.y; if (!pixman_region32_contains_point(&old_output_region, x, y, NULL) || - weston_output_contains_point(output, x, y)) + weston_output_contains_coord(output, pointer->pos)) continue; - if (x >= output->x + output->width) - x = output->x + output->width - 1; - if (y >= output->y + output->height) - y = output->y + output->height - 1; + if (pointer->pos.c.x >= output->pos.c.x + output->width - quantum) + pointer->pos.c.x = output->pos.c.x + output->width - quantum; - pointer->pos.c = weston_coord(x, y); + if (pointer->pos.c.y >= output->pos.c.y + output->height - quantum) + pointer->pos.c.y = output->pos.c.y + output->height - quantum; } pixman_region32_fini(&old_output_region); @@ -1819,10 +1821,10 @@ weston_view_matches_output_entirely(struct weston_view *ev, assert(!ev->transform.dirty); - if (extents->x1 != output->x || - extents->y1 != output->y || - extents->x2 != output->x + output->width || - extents->y2 != output->y + output->height) + if (extents->x1 != (int32_t)output->pos.c.x || + extents->y1 != (int32_t)output->pos.c.y || + extents->x2 != (int32_t)output->pos.c.x + output->width || + extents->y2 != (int32_t)output->pos.c.y + output->height) return false; return true; @@ -5396,8 +5398,8 @@ bind_output(struct wl_client *client, unbind_resource); wl_output_send_geometry(resource, - output->x, - output->y, + output->pos.c.x, + output->pos.c.y, head->mm_width, head->mm_height, head->subpixel, @@ -6381,10 +6383,9 @@ weston_compositor_reflow_outputs(struct weston_compositor *compositor, } if (start_resizing) { - struct weston_coord_global pos; + struct weston_coord_global pos = output->pos; - pos.c = weston_coord(output->x + delta_width, - output->y); + pos.c.x += delta_width; weston_output_set_position(output, pos); } } @@ -6417,7 +6418,7 @@ weston_output_update_matrix(struct weston_output *output) weston_output_dirty_paint_nodes(output); weston_matrix_init_transform(&output->matrix, output->transform, - output->x, output->y, + output->pos.c.x, output->pos.c.y, output->width, output->height, output->current_scale); @@ -6438,13 +6439,16 @@ weston_output_transform_scale_init(struct weston_output *output, uint32_t transf } static void -weston_output_init_geometry(struct weston_output *output, int x, int y) +weston_output_init_geometry(struct weston_output *output, + struct weston_coord_global pos) { - output->x = x; - output->y = y; + output->pos = pos; + output->pos.c.x = (int)output->pos.c.x; + output->pos.c.y = (int)output->pos.c.y; pixman_region32_fini(&output->region); - pixman_region32_init_rect(&output->region, x, y, + pixman_region32_init_rect(&output->region, + output->pos.c.x, output->pos.c.y, output->width, output->height); } @@ -6460,19 +6464,20 @@ weston_output_set_position(struct weston_output *output, struct wl_resource *resource; int ver; + output->pos.c.x = (int)output->pos.c.x; + output->pos.c.y = (int)output->pos.c.y; + if (!output->enabled) { - output->x = pos.c.x; - output->y = pos.c.y; + output->pos = pos; return; } - output->move_x = pos.c.x - output->x; - output->move_y = pos.c.y - output->y; + output->move.c = weston_coord_sub(pos.c, output->pos.c); - if (output->move_x == 0 && output->move_y == 0) + if (output->move.c.x == 0 && output->move.c.y == 0) return; - weston_output_init_geometry(output, pos.c.x, pos.c.y); + weston_output_init_geometry(output, pos); weston_output_update_matrix(output); @@ -6483,8 +6488,8 @@ weston_output_set_position(struct weston_output *output, wl_list_for_each(head, &output->head_list, output_link) { wl_resource_for_each(resource, &head->resource_list) { wl_output_send_geometry(resource, - output->x, - output->y, + output->pos.c.x, + output->pos.c.y, head->mm_width, head->mm_height, head->subpixel, @@ -6499,8 +6504,8 @@ weston_output_set_position(struct weston_output *output, wl_resource_for_each(resource, &head->xdg_output_resource_list) { zxdg_output_v1_send_logical_position(resource, - output->x, - output->y); + output->pos.c.x, + output->pos.c.y); zxdg_output_v1_send_done(resource); } } @@ -6851,7 +6856,7 @@ weston_output_set_transform(struct weston_output *output, pixman_region32_init(&old_region); pixman_region32_copy(&old_region, &output->region); - weston_output_init_geometry(output, output->x, output->y); + weston_output_init_geometry(output, output->pos); weston_output_update_matrix(output); @@ -6859,8 +6864,8 @@ weston_output_set_transform(struct weston_output *output, wl_list_for_each(head, &output->head_list, output_link) { wl_resource_for_each(resource, &head->resource_list) { wl_output_send_geometry(resource, - output->x, - output->y, + output->pos.c.x, + output->pos.c.y, head->mm_width, head->mm_height, head->subpixel, @@ -6874,8 +6879,8 @@ weston_output_set_transform(struct weston_output *output, } wl_resource_for_each(resource, &head->xdg_output_resource_list) { zxdg_output_v1_send_logical_position(resource, - output->x, - output->y); + output->pos.c.x, + output->pos.c.y); zxdg_output_v1_send_logical_size(resource, output->width, output->height); @@ -6884,8 +6889,8 @@ weston_output_set_transform(struct weston_output *output, } /* we must ensure that pointers are inside output, otherwise they disappear */ - mid_x = output->x + output->width / 2; - mid_y = output->y + output->height / 2; + mid_x = output->pos.c.x + output->width / 2; + mid_y = output->pos.c.y + output->height / 2; ev.mask = WESTON_POINTER_MOTION_ABS; ev.abs.c = weston_coord(mid_x, mid_y); @@ -7072,6 +7077,7 @@ weston_output_init(struct weston_output *output, struct weston_compositor *compositor, const char *name) { + output->pos.c = weston_coord(0, 0); output->compositor = compositor; output->destroying = 0; output->name = strdup(name); @@ -7261,7 +7267,7 @@ weston_output_enable(struct weston_output *output) weston_output_transform_scale_init(output, output->transform, output->scale); - weston_output_init_geometry(output, output->x, output->y); + weston_output_init_geometry(output, output->pos); /* At this point we have a valid region so we can check placement. */ if (!weston_output_placement_ok(output)) @@ -7717,7 +7723,9 @@ xdg_output_manager_get_xdg_output(struct wl_client *client, wl_resource_set_implementation(resource, &xdg_output_interface, NULL, xdg_output_unlist); - zxdg_output_v1_send_logical_position(resource, output->x, output->y); + zxdg_output_v1_send_logical_position(resource, + output->pos.c.x, + output->pos.c.y); zxdg_output_v1_send_logical_size(resource, output->width, output->height); @@ -8340,14 +8348,16 @@ weston_compositor_print_scene_graph(struct weston_compositor *ec) wl_list_for_each(output, &ec->output_list, link) { struct weston_head *head; int head_idx = 0; + int x, y; fprintf(fp, "Output %d (%s):\n", output->id, output->name); assert(output->enabled); + x = output->pos.c.x; + y = output->pos.c.y; + fprintf(fp, "\tposition: (%d, %d) -> (%d, %d)\n", - output->x, output->y, - output->x + output->width, - output->y + output->height); + x, y, x + output->width, y + output->height); fprintf(fp, "\tmode: %dx%d@%.3fHz\n", output->current_mode->width, output->current_mode->height, diff --git a/libweston/input.c b/libweston/input.c index d335346df..dd814cc80 100644 --- a/libweston/input.c +++ b/libweston/input.c @@ -2147,18 +2147,19 @@ weston_pointer_clamp_for_output(struct weston_pointer *pointer, struct weston_output *output, struct weston_coord_global pos) { + double quantum = 1.0 / 1024.0; struct weston_coord_global out = pos; int x = pos.c.x; int y = pos.c.y; - if (x < output->x) - out.c.x = output->x; - else if (x >= output->x + output->width) - out.c.x = output->x + output->width - 1; - if (y < output->y) - out.c.y = output->y; - else if (y >= output->y + output->height) - out.c.y = output->y + output->height - 1; + if (x < output->pos.c.x) + out.c.x = output->pos.c.x; + else if (x >= output->pos.c.x + output->width - quantum) + out.c.x = output->pos.c.x + output->width - quantum; + if (y < output->pos.c.y) + out.c.y = output->pos.c.y; + else if (y >= output->pos.c.y + output->height - quantum) + out.c.y = output->pos.c.y + output->height - quantum; return out; } @@ -2173,10 +2174,9 @@ weston_pointer_clamp(struct weston_pointer *pointer, struct weston_coord_global wl_list_for_each(output, &ec->output_list, link) { if (pointer->seat->output && pointer->seat->output != output) continue; - if (weston_output_contains_point(output, pos.c.x, pos.c.y)) + if (weston_output_contains_coord(output, pos)) valid = 1; - if (weston_output_contains_point(output, pointer->pos.c.x, - pointer->pos.c.y)) + if (weston_output_contains_coord(output, pointer->pos)) prev = output; } @@ -2237,13 +2237,17 @@ weston_pointer_handle_output_destroy(struct wl_listener *listener, void *data) y = pointer->pos.c.y; wl_list_for_each(output, &ec->output_list, link) { - if (weston_output_contains_point(output, x, y)) + int ox, oy; + + if (weston_output_contains_coord(output, pointer->pos)) return; + ox = output->pos.c.x; + oy = output->pos.c.y; /* Aproximante the distance from the pointer to the center of * the output. */ - distance = abs(output->x + output->width / 2 - x) + - abs(output->y + output->height / 2 - y); + distance = abs(ox + output->width / 2 - x) + + abs(oy + output->height / 2 - y); if (distance < min) { min = distance; closest = output; diff --git a/libweston/shell-utils/shell-utils.c b/libweston/shell-utils/shell-utils.c index 98c3d1d2e..b36688384 100644 --- a/libweston/shell-utils/shell-utils.c +++ b/libweston/shell-utils/shell-utils.c @@ -141,7 +141,7 @@ weston_shell_utils_center_on_output(struct weston_view *view, weston_shell_utils_subsurfaces_boundingbox(view->surface, &surf_x, &surf_y, &width, &height); - pos.c = weston_coord(output->x, output->y); + pos = output->pos; pos.c.x += (output->width - width) / 2 - surf_x / 2; pos.c.y += (output->height - height) / 2 - surf_y / 2; diff --git a/libweston/touch-calibration.c b/libweston/touch-calibration.c index 677255485..45689ddd8 100644 --- a/libweston/touch-calibration.c +++ b/libweston/touch-calibration.c @@ -181,7 +181,6 @@ 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} }; @@ -200,8 +199,7 @@ map_calibrator(struct weston_touch_calibrator *calibrator) weston_layer_entry_insert(&c->calibrator_layer.view_list, &calibrator->view->layer_link); - pos.c = weston_coord(calibrator->output->x, calibrator->output->y); - weston_view_set_position(calibrator->view, pos); + weston_view_set_position(calibrator->view, calibrator->output->pos); calibrator->view->output = calibrator->surface->output; calibrator->view->is_mapped = true; diff --git a/tests/matrix-transform-test.c b/tests/matrix-transform-test.c index 19dfdff37..920e13d92 100644 --- a/tests/matrix-transform-test.c +++ b/tests/matrix-transform-test.c @@ -365,8 +365,7 @@ simple_weston_output_prepare(struct weston_output *output, int x, int y, int width, int height, int scale, uint32_t transform) { - output->x = x; - output->y = y; + output->pos.c = weston_coord(x, y); output->width = width; output->height = height; output->current_scale = scale; @@ -383,36 +382,36 @@ simple_transform_vector(struct weston_output *output, struct weston_vector in) switch (output->transform) { case WL_OUTPUT_TRANSFORM_NORMAL: - out.f[0] = (-output->x + in.f[0]) * scale; - out.f[1] = (-output->y + in.f[1]) * scale; + out.f[0] = (-output->pos.c.x + in.f[0]) * scale; + out.f[1] = (-output->pos.c.y + in.f[1]) * scale; break; case WL_OUTPUT_TRANSFORM_FLIPPED: - out.f[0] = (output->x + output->width - in.f[0]) * scale; - out.f[1] = (-output->y + in.f[1]) * scale; + out.f[0] = (output->pos.c.x + output->width - in.f[0]) * scale; + out.f[1] = (-output->pos.c.y + in.f[1]) * scale; break; case WL_OUTPUT_TRANSFORM_90: - out.f[0] = (-output->y + in.f[1]) * scale; - out.f[1] = (output->x + output->width - in.f[0]) * scale; + out.f[0] = (-output->pos.c.y + in.f[1]) * scale; + out.f[1] = (output->pos.c.x + output->width - in.f[0]) * scale; break; case WL_OUTPUT_TRANSFORM_FLIPPED_90: - out.f[0] = (-output->y + in.f[1]) * scale; - out.f[1] = (-output->x + in.f[0]) * scale; + out.f[0] = (-output->pos.c.y + in.f[1]) * scale; + out.f[1] = (-output->pos.c.x + in.f[0]) * scale; break; case WL_OUTPUT_TRANSFORM_180: - out.f[0] = (output->x + output->width - in.f[0]) * scale; - out.f[1] = (output->y + output->height - in.f[1]) * scale; + out.f[0] = (output->pos.c.x + output->width - in.f[0]) * scale; + out.f[1] = (output->pos.c.y + output->height - in.f[1]) * scale; break; case WL_OUTPUT_TRANSFORM_FLIPPED_180: - out.f[0] = (-output->x + in.f[0]) * scale; - out.f[1] = (output->y + output->height - in.f[1]) * scale; + out.f[0] = (-output->pos.c.x + in.f[0]) * scale; + out.f[1] = (output->pos.c.y + output->height - in.f[1]) * scale; break; case WL_OUTPUT_TRANSFORM_270: - out.f[0] = (output->y + output->height - in.f[1]) * scale; - out.f[1] = (-output->x + in.f[0]) * scale; + out.f[0] = (output->pos.c.y + output->height - in.f[1]) * scale; + out.f[1] = (-output->pos.c.x + in.f[0]) * scale; break; case WL_OUTPUT_TRANSFORM_FLIPPED_270: - out.f[0] = (output->y + output->height - in.f[1]) * scale; - out.f[1] = (output->x + output->width - in.f[0]) * scale; + out.f[0] = (output->pos.c.y + output->height - in.f[1]) * scale; + out.f[1] = (output->pos.c.x + output->width - in.f[0]) * scale; break; } out.f[2] = 0; diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c index 5cdb275aa..8f195cf26 100644 --- a/xwayland/window-manager.c +++ b/xwayland/window-manager.c @@ -3148,8 +3148,8 @@ legacy_fullscreen(struct weston_wm *wm, /* Heuristics for detecting legacy fullscreen windows... */ wl_list_for_each(output, &compositor->output_list, link) { - if (output->x == window->x && - output->y == window->y && + if ((int)output->pos.c.x == window->x && + (int)output->pos.c.y == window->y && output->width == window->width && output->height == window->height && window->override_redirect) { @@ -3171,8 +3171,8 @@ legacy_fullscreen(struct weston_wm *wm, if (matching_size && !window->decorate && (window->size_hints.flags & (USPosition | PPosition)) && - window->size_hints.x == output->x && - window->size_hints.y == output->y) { + window->size_hints.x == (int)output->pos.c.x && + window->size_hints.y == (int)output->pos.c.y) { *output_ret = output; return 1; }