swc

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/swc
Log | Files | Refs | README | LICENSE

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:
Mlibswc/compositor.c | 65++++++++++++++++++++++++++---------------------------------------
Mlibswc/compositor.h | 1-
Mlibswc/pointer.c | 59+++++++++++++++--------------------------------------------
Mlibswc/pointer.h | 1-
Mlibswc/surface.c | 29+++++++++++++----------------
Mlibswc/view.c | 20+++++++++++---------
Mlibswc/view.h | 6+++---
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);