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