commit 4ee14f5
Michael Forney
·
2014-02-24 09:07:43 +0000 UTC
parent 233b573
view: Don't use view event handlers unnecessarily
7 files changed,
+68,
-113
+26,
-39
1@@ -423,7 +423,17 @@ static bool attach(struct view * base, struct wld_buffer * buffer)
2 update(&view->base);
3 }
4
5- view_set_size_from_buffer(&view->base, buffer);
6+ if (view_set_size_from_buffer(&view->base, buffer))
7+ {
8+ update_extents(view);
9+
10+ if (view->visible && buffer)
11+ {
12+ view_update_screens(&view->base);
13+ damage_below_view(view);
14+ update(&view->base);
15+ }
16+ }
17
18 return true;
19 }
20@@ -438,7 +448,21 @@ static bool move(struct view * base, int32_t x, int32_t y)
21 update(&view->base);
22 }
23
24- view_set_position(&view->base, x, y);
25+ if (view_set_position(&view->base, x, y))
26+ {
27+ update_extents(view);
28+
29+ if (view->visible)
30+ {
31+ /* Assume worst-case no clipping until we draw the next frame (in
32+ * case the surface gets moved again before that). */
33+ pixman_region32_init(&view->clip);
34+
35+ view_update_screens(&view->base);
36+ damage_below_view(view);
37+ update(&view->base);
38+ }
39+ }
40
41 return true;
42 }
43@@ -449,41 +473,6 @@ const static struct view_impl view_impl = {
44 .move = &move
45 };
46
47-static void handle_view_event(struct wl_listener * listener, void * data)
48-{
49- struct compositor_view * view
50- = CONTAINER_OF(listener, typeof(*view), event_listener);
51- struct swc_event * event = data;
52-
53- switch (event->type)
54- {
55- case VIEW_EVENT_MOVED:
56- update_extents(view);
57-
58- if (view->visible)
59- {
60- /* Assume worst-case no clipping until we draw the next frame (in case
61- * the surface gets moved again before that). */
62- pixman_region32_init(&view->clip);
63-
64- damage_below_view(view);
65- view_update_screens(&view->base);
66- update(&view->base);
67- }
68- break;
69- case VIEW_EVENT_RESIZED:
70- update_extents(view);
71-
72- if (view->visible)
73- {
74- damage_below_view(view);
75- view_update_screens(&view->base);
76- update(&view->base);
77- }
78- break;
79- }
80-}
81-
82 struct compositor_view * swc_compositor_create_view
83 (struct swc_surface * surface)
84 {
85@@ -495,8 +484,6 @@ struct compositor_view * swc_compositor_create_view
86 return NULL;
87
88 view_initialize(&view->base, &view_impl);
89- view->event_listener.notify = &handle_view_event;
90- wl_signal_add(&view->base.event_signal, &view->event_listener);
91 view->surface = surface;
92 view->buffer = NULL;
93 view->visible = false;
+0,
-1
1@@ -40,7 +40,6 @@ void swc_compositor_finalize();
2 struct compositor_view
3 {
4 struct view base;
5- struct wl_listener event_listener;
6 struct swc_surface * surface;
7 struct wld_buffer * buffer;
8
+15,
-44
1@@ -102,14 +102,24 @@ static bool attach(struct view * view, struct wld_buffer * buffer)
2
3 /* TODO: Send an early release to the buffer */
4
5- view_set_size_from_buffer(view, buffer);
6+ if (view_set_size_from_buffer(view, buffer))
7+ view_update_screens(view);
8
9 return true;
10 }
11
12 static bool move(struct view * view, int32_t x, int32_t y)
13 {
14- view_set_position(view, x, y);
15+ struct screen * screen;
16+
17+ if (view_set_position(view, x, y))
18+ view_update_screens(view);
19+
20+ wl_list_for_each(screen, &swc.screens, link)
21+ {
22+ view_move(&screen->planes.cursor.view,
23+ view->geometry.x, view->geometry.y);
24+ }
25
26 return true;
27 }
28@@ -119,45 +129,6 @@ static const struct view_impl view_impl = {
29 .attach = &attach,
30 .move = &move,
31 };
32-
33-static void handle_view_event(struct wl_listener * listener, void * data)
34-{
35- struct pointer * pointer
36- = CONTAINER_OF(listener, typeof(*pointer), cursor.view_listener);
37- struct swc_event * event = data;
38- struct view_event_data * event_data = event->data;
39- struct view * view = event_data->view;
40- struct screen * screen;
41-
42- switch (event->type)
43- {
44- case VIEW_EVENT_MOVED:
45- wl_list_for_each(screen, &swc.screens, link)
46- {
47- view_move(&screen->planes.cursor.view,
48- view->geometry.x, view->geometry.y);
49- }
50-
51- view_update_screens(view);
52- break;
53- case VIEW_EVENT_RESIZED:
54- view_update_screens(view);
55- break;
56- case VIEW_EVENT_SCREENS_CHANGED:
57- wl_list_for_each(screen, &swc.screens, link)
58- {
59- if (event_data->screens_changed.entered & screen_mask(screen))
60- {
61- view_attach(&screen->planes.cursor.view,
62- pointer->cursor.buffer);
63- }
64- else if (event_data->screens_changed.left & screen_mask(screen))
65- view_attach(&screen->planes.cursor.view, NULL);
66- }
67- break;
68- }
69-}
70-
71 static inline void update_cursor(struct pointer * pointer)
72 {
73 view_move(&pointer->cursor.view,
74@@ -258,9 +229,6 @@ bool pointer_initialize(struct pointer * pointer)
75 wl_array_init(&pointer->buttons);
76
77 view_initialize(&pointer->cursor.view, &view_impl);
78- pointer->cursor.view_listener.notify = &handle_view_event;
79- wl_signal_add(&pointer->cursor.view.event_signal,
80- &pointer->cursor.view_listener);
81 pointer->cursor.surface = NULL;
82 pointer->cursor.destroy_listener.notify = &handle_cursor_surface_destroy;
83 pointer->cursor.buffer = wld_create_buffer
84@@ -272,6 +240,9 @@ bool pointer_initialize(struct pointer * pointer)
85
86 pointer_set_cursor(pointer, cursor_left_ptr);
87
88+ wl_list_for_each(screen, &swc.screens, link)
89+ view_attach(&screen->planes.cursor.view, pointer->cursor.buffer);
90+
91 input_focus_initialize(&pointer->focus, &pointer->focus_handler);
92 pixman_region32_init(&pointer->region);
93
+0,
-1
1@@ -58,7 +58,6 @@ struct pointer
2 struct
3 {
4 struct view view;
5- struct wl_listener view_listener;
6 struct swc_surface * surface;
7 struct wl_listener destroy_listener;
8 struct wld_buffer * buffer;
+13,
-16
1@@ -188,6 +188,14 @@ static void set_input_region(struct wl_client * client,
2 pixman_region32_reset(&surface->pending.state.input, &infinite_extents);
3 }
4
5+static inline void trim_region(pixman_region32_t * region,
6+ struct wld_buffer * buffer)
7+{
8+ pixman_region32_intersect_rect(region, region, 0, 0,
9+ buffer ? buffer->width : 0,
10+ buffer ? buffer->height : 0);
11+}
12+
13 static void commit(struct wl_client * client, struct wl_resource * resource)
14 {
15 struct swc_surface * surface = wl_resource_get_user_data(resource);
16@@ -211,10 +219,6 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
17 /* Damage */
18 if (surface->pending.commit & SWC_SURFACE_COMMIT_DAMAGE)
19 {
20- pixman_region32_intersect_rect(&surface->pending.state.damage,
21- &surface->pending.state.damage, 0, 0,
22- buffer ? buffer->width : 0,
23- buffer ? buffer->height : 0);
24 pixman_region32_union(&surface->state.damage, &surface->state.damage,
25 &surface->pending.state.damage);
26 pixman_region32_clear(&surface->pending.state.damage);
27@@ -223,10 +227,8 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
28 /* Opaque */
29 if (surface->pending.commit & SWC_SURFACE_COMMIT_OPAQUE)
30 {
31- pixman_region32_intersect_rect(&surface->state.opaque,
32- &surface->pending.state.opaque, 0, 0,
33- buffer ? buffer->width : 0,
34- buffer ? buffer->height : 0);
35+ pixman_region32_copy(&surface->state.opaque,
36+ &surface->pending.state.opaque);
37 }
38
39 /* Input */
40@@ -244,6 +246,9 @@ static void commit(struct wl_client * client, struct wl_resource * resource)
41 wl_list_init(&surface->pending.state.frame_callbacks);
42 }
43
44+ trim_region(&surface->state.damage, buffer);
45+ trim_region(&surface->state.opaque, buffer);
46+
47 if (surface->view)
48 {
49 if (surface->pending.commit & SWC_SURFACE_COMMIT_ATTACH)
50@@ -347,14 +352,6 @@ static void handle_view_event(struct wl_listener * listener, void * data)
51 }
52 break;
53 }
54- case VIEW_EVENT_RESIZED:
55- pixman_region32_intersect_rect
56- (&surface->state.opaque, &surface->state.opaque, 0, 0,
57- surface->view->geometry.width, surface->view->geometry.height);
58- pixman_region32_intersect_rect
59- (&surface->state.damage, &surface->state.damage, 0, 0,
60- surface->view->geometry.width, surface->view->geometry.height);
61- break;
62 }
63 }
64
+11,
-9
1@@ -74,36 +74,38 @@ bool view_move(struct view * view, int32_t x, int32_t y)
2 return view->impl->move(view, x, y);
3 }
4
5-void view_set_position(struct view * view, int32_t x, int32_t y)
6+bool view_set_position(struct view * view, int32_t x, int32_t y)
7 {
8 struct view_event_data data = { .view = view };
9
10 if (x == view->geometry.x && y == view->geometry.y)
11- return;
12+ return false;
13
14 view->geometry.x = x;
15 view->geometry.y = y;
16 swc_send_event(&view->event_signal, VIEW_EVENT_MOVED, &data);
17+
18+ return true;
19 }
20
21-void view_set_size(struct view * view, uint32_t width, uint32_t height)
22+bool view_set_size(struct view * view, uint32_t width, uint32_t height)
23 {
24 struct view_event_data data = { .view = view };
25
26 if (view->geometry.width == width && view->geometry.height == height)
27- return;
28+ return false;
29
30 view->geometry.width = width;
31 view->geometry.height = height;
32 swc_send_event(&view->event_signal, VIEW_EVENT_RESIZED, &data);
33+
34+ return true;
35 }
36
37-void view_set_size_from_buffer(struct view * view, struct wld_buffer * buffer)
38+bool view_set_size_from_buffer(struct view * view, struct wld_buffer * buffer)
39 {
40- if (buffer)
41- view_set_size(view, buffer->width, buffer->height);
42- else
43- view_set_size(view, 0, 0);
44+ return view_set_size(view, buffer ? buffer->width : 0,
45+ buffer ? buffer->height : 0);
46 }
47
48 void view_set_screens(struct view * view, uint32_t screens)
+3,
-3
1@@ -134,9 +134,9 @@ void view_initialize(struct view * view, const struct view_impl * impl);
2 */
3 void view_finalize(struct view * view);
4
5-void view_set_position(struct view * view, int32_t x, int32_t y);
6-void view_set_size(struct view * view, uint32_t width, uint32_t height);
7-void view_set_size_from_buffer(struct view * view, struct wld_buffer * bufer);
8+bool view_set_position(struct view * view, int32_t x, int32_t y);
9+bool view_set_size(struct view * view, uint32_t width, uint32_t height);
10+bool view_set_size_from_buffer(struct view * view, struct wld_buffer * bufer);
11 void view_set_screens(struct view * view, uint32_t screens);
12 void view_update_screens(struct view * view);
13