Split the geometry information from weston_surface out into weston_view
The weston_surface structure is split into two structures:
* The weston_surface structure storres everything required for a
client-side or server-side surface. This includes buffers; callbacks;
backend private data; input, damage, and opaque regions; and a few other
bookkeeping bits.
* The weston_view structure represents an entity in the scenegraph and
storres all of the geometry information. This includes clip region,
alpha, position, and the transformation list as well as all of the
temporary information derived from the geometry state. Because a view,
and not a surface, is a scenegraph element, the view is what is placed
in layers and planes.
There are a few things worth noting about the surface/view split:
1. This is *not* a modification to the protocol. It is, instead, a
modification to Weston's internal scenegraph to allow a single surface
to exist in multiple places at a time. Clients are completely unaware
of how many views to a particular surface exist.
2. A view is considered a direct child of a surface and is destroyed when
the surface is destroyed. Because of this, the view.surface pointer is
always valid and non-null.
3. The compositor's surface_list is replaced with a view_list. Due to
subsurfaces, building the view list is a little more complicated than
it used to be and involves building a tree of views on the fly whenever
subsurfaces are used. However, this means that backends can remain
completely subsurface-agnostic.
4. Surfaces and views both keep track of which outputs they are on.
5. The weston_surface structure now has width and height fields. These
are populated when a new buffer is attached before surface.configure
is called. This is because there are many surface-based operations
that really require the width and height and digging through the views
didn't work well.
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
diff --git a/src/zoom.c b/src/zoom.c
index 220b2b6..962ed6d 100644
--- a/src/zoom.c
+++ b/src/zoom.c
@@ -27,97 +27,6 @@
#include "compositor.h"
#include "text-cursor-position-server-protocol.h"
-struct text_cursor_position {
- struct weston_compositor *ec;
- struct wl_global *global;
- struct wl_listener destroy_listener;
-};
-
-static void
-text_cursor_position_notify(struct wl_client *client,
- struct wl_resource *resource,
- struct wl_resource *surface_resource,
- wl_fixed_t x, wl_fixed_t y)
-{
- struct weston_surface *surface =
- wl_resource_get_user_data(surface_resource);
-
- weston_text_cursor_position_notify(surface, x, y);
-}
-
-struct text_cursor_position_interface text_cursor_position_implementation = {
- text_cursor_position_notify
-};
-
-static void
-bind_text_cursor_position(struct wl_client *client,
- void *data, uint32_t version, uint32_t id)
-{
- struct wl_resource *resource;
-
- resource = wl_resource_create(client,
- &text_cursor_position_interface, 1, id);
- if (resource)
- wl_resource_set_implementation(resource,
- &text_cursor_position_implementation,
- data, NULL);
-}
-
-static void
-text_cursor_position_notifier_destroy(struct wl_listener *listener, void *data)
-{
- struct text_cursor_position *text_cursor_position =
- container_of(listener, struct text_cursor_position, destroy_listener);
-
- wl_global_destroy(text_cursor_position->global);
- free(text_cursor_position);
-}
-
-void
-text_cursor_position_notifier_create(struct weston_compositor *ec)
-{
- struct text_cursor_position *text_cursor_position;
-
- text_cursor_position = malloc(sizeof *text_cursor_position);
- if (text_cursor_position == NULL)
- return;
-
- text_cursor_position->ec = ec;
-
- text_cursor_position->global =
- wl_global_create(ec->wl_display,
- &text_cursor_position_interface, 1,
- text_cursor_position,
- bind_text_cursor_position);
-
- text_cursor_position->destroy_listener.notify =
- text_cursor_position_notifier_destroy;
- wl_signal_add(&ec->destroy_signal, &text_cursor_position->destroy_listener);
-}
-
-WL_EXPORT void
-weston_text_cursor_position_notify(struct weston_surface *surface,
- wl_fixed_t cur_pos_x,
- wl_fixed_t cur_pos_y)
-{
- struct weston_output *output;
- wl_fixed_t global_x, global_y;
-
- weston_surface_to_global_fixed(surface, cur_pos_x, cur_pos_y,
- &global_x, &global_y);
-
- wl_list_for_each(output, &surface->compositor->output_list, link)
- if (output->zoom.active &&
- pixman_region32_contains_point(&output->region,
- wl_fixed_to_int(global_x),
- wl_fixed_to_int(global_y),
- NULL)) {
- output->zoom.text_cursor.x = global_x;
- output->zoom.text_cursor.y = global_y;
- weston_output_update_zoom(output, ZOOM_FOCUS_TEXT);
- }
-}
-
static void
weston_zoom_frame_z(struct weston_animation *animation,
struct weston_output *output, uint32_t msecs)
@@ -176,12 +85,8 @@
if (weston_spring_done(&output->zoom.spring_xy)) {
output->zoom.spring_xy.current = output->zoom.spring_xy.target;
- output->zoom.current.x =
- output->zoom.type == ZOOM_FOCUS_POINTER ?
- seat->pointer->x : output->zoom.text_cursor.x;
- output->zoom.current.y =
- output->zoom.type == ZOOM_FOCUS_POINTER ?
- seat->pointer->y : output->zoom.text_cursor.y;
+ output->zoom.current.x = seat->pointer->x;
+ output->zoom.current.y = seat->pointer->y;
wl_list_remove(&animation->link);
wl_list_init(&animation->link);
}
@@ -251,7 +156,6 @@
static void
weston_output_update_zoom_transform(struct weston_output *output)
{
- uint32_t type = output->zoom.type;
float global_x, global_y;
wl_fixed_t x = output->zoom.current.x;
wl_fixed_t y = output->zoom.current.y;
@@ -265,8 +169,7 @@
level == 0.0f)
return;
- if (type == ZOOM_FOCUS_POINTER &&
- wl_list_empty(&output->zoom.animation_xy.link))
+ if (wl_list_empty(&output->zoom.animation_xy.link))
zoom_area_center_from_pointer(output, &x, &y);
global_x = wl_fixed_to_double(x);
@@ -297,39 +200,8 @@
}
static void
-weston_zoom_transition(struct weston_output *output, uint32_t type,
- wl_fixed_t x, wl_fixed_t y)
+weston_zoom_transition(struct weston_output *output, wl_fixed_t x, wl_fixed_t y)
{
- if (output->zoom.type != type) {
- /* Set from/to points and start animation */
- output->zoom.spring_xy.current = 0.0;
- output->zoom.spring_xy.previous = 0.0;
- output->zoom.spring_xy.target = 1.0;
-
- if (wl_list_empty(&output->zoom.animation_xy.link)) {
- output->zoom.animation_xy.frame_counter = 0;
- wl_list_insert(output->animation_list.prev,
- &output->zoom.animation_xy.link);
-
- output->zoom.from.x = (type == ZOOM_FOCUS_TEXT) ?
- x : output->zoom.text_cursor.x;
- output->zoom.from.y = (type == ZOOM_FOCUS_TEXT) ?
- y : output->zoom.text_cursor.y;
- } else {
- output->zoom.from.x = output->zoom.current.x;
- output->zoom.from.y = output->zoom.current.y;
- }
-
- output->zoom.to.x = (type == ZOOM_FOCUS_POINTER) ?
- x : output->zoom.text_cursor.x;
- output->zoom.to.y = (type == ZOOM_FOCUS_POINTER) ?
- y : output->zoom.text_cursor.y;
- output->zoom.current.x = output->zoom.from.x;
- output->zoom.current.y = output->zoom.from.y;
-
- output->zoom.type = type;
- }
-
if (output->zoom.level != output->zoom.spring_z.current) {
output->zoom.spring_z.target = output->zoom.level;
if (wl_list_empty(&output->zoom.animation_z.link)) {
@@ -344,7 +216,7 @@
}
WL_EXPORT void
-weston_output_update_zoom(struct weston_output *output, uint32_t type)
+weston_output_update_zoom(struct weston_output *output)
{
struct weston_seat *seat = weston_zoom_pick_seat(output->compositor);
wl_fixed_t x = seat->pointer->x;
@@ -352,27 +224,15 @@
zoom_area_center_from_pointer(output, &x, &y);
- if (type == ZOOM_FOCUS_POINTER) {
- if (wl_list_empty(&output->zoom.animation_xy.link)) {
- output->zoom.current.x = seat->pointer->x;
- output->zoom.current.y = seat->pointer->y;
- } else {
- output->zoom.to.x = x;
- output->zoom.to.y = y;
- }
+ if (wl_list_empty(&output->zoom.animation_xy.link)) {
+ output->zoom.current.x = seat->pointer->x;
+ output->zoom.current.y = seat->pointer->y;
+ } else {
+ output->zoom.to.x = x;
+ output->zoom.to.y = y;
}
- if (type == ZOOM_FOCUS_TEXT) {
- if (wl_list_empty(&output->zoom.animation_xy.link)) {
- output->zoom.current.x = output->zoom.text_cursor.x;
- output->zoom.current.y = output->zoom.text_cursor.y;
- } else {
- output->zoom.to.x = output->zoom.text_cursor.x;
- output->zoom.to.y = output->zoom.text_cursor.y;
- }
- }
-
- weston_zoom_transition(output, type, x, y);
+ weston_zoom_transition(output, x, y);
weston_output_update_zoom_transform(output);
}
@@ -385,7 +245,6 @@
output->zoom.level = 0.0;
output->zoom.trans_x = 0.0;
output->zoom.trans_y = 0.0;
- output->zoom.type = ZOOM_FOCUS_POINTER;
weston_spring_init(&output->zoom.spring_z, 250.0, 0.0, 0.0);
output->zoom.spring_z.friction = 1000;
output->zoom.animation_z.frame = weston_zoom_frame_z;