commit 4ee14f5f55237fddc6a6c75796df76d159d53e61
parent 233b5731f7617f874593d874ad639759b3f9a1a0
Author: Michael Forney <mforney@mforney.org>
Date: Mon, 24 Feb 2014 01:07:43 -0800
view: Don't use view event handlers unnecessarily
Diffstat:
7 files changed, 68 insertions(+), 113 deletions(-)
diff --git a/libswc/compositor.c b/libswc/compositor.c
@@ -423,7 +423,17 @@ static bool attach(struct view * base, struct wld_buffer * buffer)
update(&view->base);
}
- view_set_size_from_buffer(&view->base, buffer);
+ if (view_set_size_from_buffer(&view->base, buffer))
+ {
+ update_extents(view);
+
+ if (view->visible && buffer)
+ {
+ view_update_screens(&view->base);
+ damage_below_view(view);
+ update(&view->base);
+ }
+ }
return true;
}
@@ -438,7 +448,21 @@ static bool move(struct view * base, int32_t x, int32_t y)
update(&view->base);
}
- view_set_position(&view->base, x, y);
+ if (view_set_position(&view->base, x, y))
+ {
+ update_extents(view);
+
+ if (view->visible)
+ {
+ /* Assume worst-case no clipping until we draw the next frame (in
+ * case the surface gets moved again before that). */
+ pixman_region32_init(&view->clip);
+
+ view_update_screens(&view->base);
+ damage_below_view(view);
+ update(&view->base);
+ }
+ }
return true;
}
@@ -449,41 +473,6 @@ const static struct view_impl view_impl = {
.move = &move
};
-static void handle_view_event(struct wl_listener * listener, void * data)
-{
- struct compositor_view * view
- = CONTAINER_OF(listener, typeof(*view), event_listener);
- struct swc_event * event = data;
-
- switch (event->type)
- {
- case VIEW_EVENT_MOVED:
- update_extents(view);
-
- if (view->visible)
- {
- /* Assume worst-case no clipping until we draw the next frame (in case
- * the surface gets moved again before that). */
- pixman_region32_init(&view->clip);
-
- damage_below_view(view);
- view_update_screens(&view->base);
- update(&view->base);
- }
- break;
- case VIEW_EVENT_RESIZED:
- update_extents(view);
-
- if (view->visible)
- {
- damage_below_view(view);
- view_update_screens(&view->base);
- update(&view->base);
- }
- break;
- }
-}
-
struct compositor_view * swc_compositor_create_view
(struct swc_surface * surface)
{
@@ -495,8 +484,6 @@ struct compositor_view * swc_compositor_create_view
return NULL;
view_initialize(&view->base, &view_impl);
- view->event_listener.notify = &handle_view_event;
- wl_signal_add(&view->base.event_signal, &view->event_listener);
view->surface = surface;
view->buffer = NULL;
view->visible = false;
diff --git a/libswc/compositor.h b/libswc/compositor.h
@@ -40,7 +40,6 @@ void swc_compositor_finalize();
struct compositor_view
{
struct view base;
- struct wl_listener event_listener;
struct swc_surface * surface;
struct wld_buffer * buffer;
diff --git a/libswc/pointer.c b/libswc/pointer.c
@@ -102,14 +102,24 @@ static bool attach(struct view * view, struct wld_buffer * buffer)
/* TODO: Send an early release to the buffer */
- view_set_size_from_buffer(view, buffer);
+ if (view_set_size_from_buffer(view, buffer))
+ view_update_screens(view);
return true;
}
static bool move(struct view * view, int32_t x, int32_t y)
{
- view_set_position(view, x, y);
+ struct screen * screen;
+
+ if (view_set_position(view, x, y))
+ view_update_screens(view);
+
+ wl_list_for_each(screen, &swc.screens, link)
+ {
+ view_move(&screen->planes.cursor.view,
+ view->geometry.x, view->geometry.y);
+ }
return true;
}
@@ -119,45 +129,6 @@ static const struct view_impl view_impl = {
.attach = &attach,
.move = &move,
};
-
-static void handle_view_event(struct wl_listener * listener, void * data)
-{
- struct pointer * pointer
- = CONTAINER_OF(listener, typeof(*pointer), cursor.view_listener);
- struct swc_event * event = data;
- struct view_event_data * event_data = event->data;
- struct view * view = event_data->view;
- struct screen * screen;
-
- switch (event->type)
- {
- case VIEW_EVENT_MOVED:
- wl_list_for_each(screen, &swc.screens, link)
- {
- view_move(&screen->planes.cursor.view,
- view->geometry.x, view->geometry.y);
- }
-
- view_update_screens(view);
- break;
- case VIEW_EVENT_RESIZED:
- view_update_screens(view);
- break;
- case VIEW_EVENT_SCREENS_CHANGED:
- wl_list_for_each(screen, &swc.screens, link)
- {
- if (event_data->screens_changed.entered & screen_mask(screen))
- {
- view_attach(&screen->planes.cursor.view,
- pointer->cursor.buffer);
- }
- else if (event_data->screens_changed.left & screen_mask(screen))
- view_attach(&screen->planes.cursor.view, NULL);
- }
- break;
- }
-}
-
static inline void update_cursor(struct pointer * pointer)
{
view_move(&pointer->cursor.view,
@@ -258,9 +229,6 @@ bool pointer_initialize(struct pointer * pointer)
wl_array_init(&pointer->buttons);
view_initialize(&pointer->cursor.view, &view_impl);
- pointer->cursor.view_listener.notify = &handle_view_event;
- wl_signal_add(&pointer->cursor.view.event_signal,
- &pointer->cursor.view_listener);
pointer->cursor.surface = NULL;
pointer->cursor.destroy_listener.notify = &handle_cursor_surface_destroy;
pointer->cursor.buffer = wld_create_buffer
@@ -272,6 +240,9 @@ bool pointer_initialize(struct pointer * pointer)
pointer_set_cursor(pointer, cursor_left_ptr);
+ wl_list_for_each(screen, &swc.screens, link)
+ view_attach(&screen->planes.cursor.view, pointer->cursor.buffer);
+
input_focus_initialize(&pointer->focus, &pointer->focus_handler);
pixman_region32_init(&pointer->region);
diff --git a/libswc/pointer.h b/libswc/pointer.h
@@ -58,7 +58,6 @@ struct pointer
struct
{
struct view view;
- struct wl_listener view_listener;
struct swc_surface * surface;
struct wl_listener destroy_listener;
struct wld_buffer * buffer;
diff --git a/libswc/surface.c b/libswc/surface.c
@@ -188,6 +188,14 @@ static void set_input_region(struct wl_client * client,
pixman_region32_reset(&surface->pending.state.input, &infinite_extents);
}
+static inline void trim_region(pixman_region32_t * region,
+ struct wld_buffer * buffer)
+{
+ pixman_region32_intersect_rect(region, region, 0, 0,
+ buffer ? buffer->width : 0,
+ buffer ? buffer->height : 0);
+}
+
static void commit(struct wl_client * client, struct wl_resource * resource)
{
struct swc_surface * surface = wl_resource_get_user_data(resource);
@@ -211,10 +219,6 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
/* Damage */
if (surface->pending.commit & SWC_SURFACE_COMMIT_DAMAGE)
{
- pixman_region32_intersect_rect(&surface->pending.state.damage,
- &surface->pending.state.damage, 0, 0,
- buffer ? buffer->width : 0,
- buffer ? buffer->height : 0);
pixman_region32_union(&surface->state.damage, &surface->state.damage,
&surface->pending.state.damage);
pixman_region32_clear(&surface->pending.state.damage);
@@ -223,10 +227,8 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
/* Opaque */
if (surface->pending.commit & SWC_SURFACE_COMMIT_OPAQUE)
{
- pixman_region32_intersect_rect(&surface->state.opaque,
- &surface->pending.state.opaque, 0, 0,
- buffer ? buffer->width : 0,
- buffer ? buffer->height : 0);
+ pixman_region32_copy(&surface->state.opaque,
+ &surface->pending.state.opaque);
}
/* Input */
@@ -244,6 +246,9 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
wl_list_init(&surface->pending.state.frame_callbacks);
}
+ trim_region(&surface->state.damage, buffer);
+ trim_region(&surface->state.opaque, buffer);
+
if (surface->view)
{
if (surface->pending.commit & SWC_SURFACE_COMMIT_ATTACH)
@@ -347,14 +352,6 @@ static void handle_view_event(struct wl_listener * listener, void * data)
}
break;
}
- case VIEW_EVENT_RESIZED:
- pixman_region32_intersect_rect
- (&surface->state.opaque, &surface->state.opaque, 0, 0,
- surface->view->geometry.width, surface->view->geometry.height);
- pixman_region32_intersect_rect
- (&surface->state.damage, &surface->state.damage, 0, 0,
- surface->view->geometry.width, surface->view->geometry.height);
- break;
}
}
diff --git a/libswc/view.c b/libswc/view.c
@@ -74,36 +74,38 @@ bool view_move(struct view * view, int32_t x, int32_t y)
return view->impl->move(view, x, y);
}
-void view_set_position(struct view * view, int32_t x, int32_t y)
+bool view_set_position(struct view * view, int32_t x, int32_t y)
{
struct view_event_data data = { .view = view };
if (x == view->geometry.x && y == view->geometry.y)
- return;
+ return false;
view->geometry.x = x;
view->geometry.y = y;
swc_send_event(&view->event_signal, VIEW_EVENT_MOVED, &data);
+
+ return true;
}
-void view_set_size(struct view * view, uint32_t width, uint32_t height)
+bool view_set_size(struct view * view, uint32_t width, uint32_t height)
{
struct view_event_data data = { .view = view };
if (view->geometry.width == width && view->geometry.height == height)
- return;
+ return false;
view->geometry.width = width;
view->geometry.height = height;
swc_send_event(&view->event_signal, VIEW_EVENT_RESIZED, &data);
+
+ return true;
}
-void view_set_size_from_buffer(struct view * view, struct wld_buffer * buffer)
+bool view_set_size_from_buffer(struct view * view, struct wld_buffer * buffer)
{
- if (buffer)
- view_set_size(view, buffer->width, buffer->height);
- else
- view_set_size(view, 0, 0);
+ return view_set_size(view, buffer ? buffer->width : 0,
+ buffer ? buffer->height : 0);
}
void view_set_screens(struct view * view, uint32_t screens)
diff --git a/libswc/view.h b/libswc/view.h
@@ -134,9 +134,9 @@ void view_initialize(struct view * view, const struct view_impl * impl);
*/
void view_finalize(struct view * view);
-void view_set_position(struct view * view, int32_t x, int32_t y);
-void view_set_size(struct view * view, uint32_t width, uint32_t height);
-void view_set_size_from_buffer(struct view * view, struct wld_buffer * bufer);
+bool view_set_position(struct view * view, int32_t x, int32_t y);
+bool view_set_size(struct view * view, uint32_t width, uint32_t height);
+bool view_set_size_from_buffer(struct view * view, struct wld_buffer * bufer);
void view_set_screens(struct view * view, uint32_t screens);
void view_update_screens(struct view * view);