commit 6d2e2b4
Michael Forney
·
2013-06-14 10:49:49 +0000 UTC
parent eab1c18
Move client/resource handling of surface into swc_surface_initialize
4 files changed,
+62,
-82
+10,
-7
1@@ -162,10 +162,13 @@ static void handle_drm_event(struct wl_listener * listener, void * data)
2 drm_listener);
3 }
4
5-static void destroy_surface(struct wl_resource * resource)
6+static void handle_surface_destroy(struct wl_listener * listener, void * data)
7 {
8+ struct wl_resource * resource = data;
9 struct swc_surface * surface = resource->data;
10
11+ wl_list_remove(&surface->link);
12+
13 free(surface);
14 }
15
16@@ -208,20 +211,20 @@ static void create_surface(struct wl_client * client,
17 .compositor = compositor,
18 .event_listener = (struct wl_listener) {
19 .notify = &handle_surface_event
20+ },
21+ .destroy_listener = {
22+ .notify = &handle_surface_destroy
23 }
24 };
25
26- swc_surface_initialize(surface);
27+ swc_surface_initialize(surface, client, id);
28 wl_signal_add(&surface->event_signal,
29 &surface->compositor_state.event_listener);
30+ wl_resource_add_destroy_listener(surface->resource,
31+ &surface->compositor_state.destroy_listener);
32
33 wl_list_insert(&compositor->surfaces, &surface->link);
34 surface->output_mask |= 1 << output->id;
35-
36- surface->resource
37- = wl_client_add_object(client, &wl_surface_interface,
38- &swc_surface_interface, id, surface);
39- wl_resource_set_destructor(surface->resource, &destroy_surface);
40 }
41
42 static void create_region(struct wl_client * client,
+49,
-44
1@@ -4,16 +4,6 @@
2
3 #include <stdio.h>
4
5-struct wl_surface_interface swc_surface_interface = {
6- .destroy = &swc_surface_destroy,
7- .attach = &swc_surface_attach,
8- .damage = &swc_surface_damage,
9- .frame = &swc_surface_frame,
10- .set_opaque_region = &swc_surface_set_opaque_region,
11- .set_input_region = &swc_surface_set_input_region,
12- .commit = &swc_surface_commit,
13-};
14-
15 static void state_initialize(struct swc_surface_state * state)
16 {
17 state->buffer = NULL;
18@@ -25,33 +15,20 @@ static void state_initialize(struct swc_surface_state * state)
19 wl_list_init(&state->frame_callbacks);
20 }
21
22-bool swc_surface_initialize(struct swc_surface * surface)
23+static void destroy_surface_resource(struct wl_resource * resource)
24 {
25- state_initialize(&surface->state);
26- state_initialize(&surface->pending.state);
27-
28- wl_signal_init(&surface->event_signal);
29-
30- surface->output_mask = 0;
31-
32- return true;
33-}
34+ struct swc_surface * surface = resource->data;
35
36-void swc_surface_finish(struct swc_surface * surface)
37-{
38+ swc_surface_finish(surface);
39 }
40
41-void swc_surface_destroy(struct wl_client * client,
42- struct wl_resource * resource)
43+static void destroy(struct wl_client * client, struct wl_resource * resource)
44 {
45 wl_resource_destroy(resource);
46 }
47
48-void swc_surface_attach(struct wl_client * client,
49- struct wl_resource * resource,
50- struct wl_resource * buffer_resource,
51- int32_t x,
52- int32_t y)
53+static void attach(struct wl_client * client, struct wl_resource * resource,
54+ struct wl_resource * buffer_resource, int32_t x, int32_t y)
55 {
56 struct swc_surface * surface = resource->data;
57 struct wl_buffer * buffer = buffer_resource->data;
58@@ -66,10 +43,8 @@ void swc_surface_attach(struct wl_client * client,
59 surface->geometry.height = buffer->height;
60 }
61
62-void swc_surface_damage(struct wl_client * client,
63- struct wl_resource * resource,
64- int32_t x, int32_t y,
65- int32_t width, int32_t height)
66+static void damage(struct wl_client * client, struct wl_resource * resource,
67+ int32_t x, int32_t y, int32_t width, int32_t height)
68 {
69 printf("surface_damage\n");
70 struct swc_surface * surface = resource->data;
71@@ -79,9 +54,8 @@ void swc_surface_damage(struct wl_client * client,
72 x, y, width, height);
73 }
74
75-void swc_surface_frame(struct wl_client * client,
76- struct wl_resource * resource,
77- uint32_t id)
78+static void frame(struct wl_client * client, struct wl_resource * resource,
79+ uint32_t id)
80 {
81 struct swc_surface * surface = resource->data;
82 struct wl_resource * callback_resource;
83@@ -93,9 +67,9 @@ void swc_surface_frame(struct wl_client * client,
84 wl_list_insert(surface->pending.state.frame_callbacks.prev, &resource->link);
85 }
86
87-void swc_surface_set_opaque_region(struct wl_client * client,
88- struct wl_resource * resource,
89- struct wl_resource * region_resource)
90+static void set_opaque_region(struct wl_client * client,
91+ struct wl_resource * resource,
92+ struct wl_resource * region_resource)
93 {
94 struct swc_surface * surface = resource->data;
95
96@@ -111,9 +85,9 @@ void swc_surface_set_opaque_region(struct wl_client * client,
97 pixman_region32_clear(&surface->pending.state.opaque);
98 }
99
100-void swc_surface_set_input_region(struct wl_client * client,
101- struct wl_resource * resource,
102- struct wl_resource * region_resource)
103+static void set_input_region(struct wl_client * client,
104+ struct wl_resource * resource,
105+ struct wl_resource * region_resource)
106 {
107 struct swc_surface * surface = resource->data;
108
109@@ -129,8 +103,7 @@ void swc_surface_set_input_region(struct wl_client * client,
110 pixman_region32_clear(&surface->pending.state.input);
111 }
112
113-void swc_surface_commit(struct wl_client * client,
114- struct wl_resource * resource)
115+static void commit(struct wl_client * client, struct wl_resource * resource)
116 {
117 struct swc_surface * surface = resource->data;
118 struct swc_event event;
119@@ -168,3 +141,35 @@ void swc_surface_commit(struct wl_client * client,
120 wl_signal_emit(&surface->event_signal, &event);
121 }
122
123+struct wl_surface_interface surface_implementation = {
124+ .destroy = &destroy,
125+ .attach = &attach,
126+ .damage = &damage,
127+ .frame = &frame,
128+ .set_opaque_region = &set_opaque_region,
129+ .set_input_region = &set_input_region,
130+ .commit = &commit,
131+};
132+
133+bool swc_surface_initialize(struct swc_surface * surface,
134+ struct wl_client * client, uint32_t id)
135+{
136+ state_initialize(&surface->state);
137+ state_initialize(&surface->pending.state);
138+
139+ surface->resource = wl_client_add_object(client, &wl_surface_interface,
140+ &surface_implementation, id, surface);
141+ wl_resource_set_destructor(surface->resource, &destroy_surface_resource);
142+
143+ wl_signal_init(&surface->event_signal);
144+
145+ surface->output_mask = 0;
146+
147+ return true;
148+}
149+
150+void swc_surface_finish(struct swc_surface * surface)
151+{
152+}
153+
154+
+2,
-31
1@@ -56,39 +56,10 @@ struct swc_surface
2 struct wl_list link;
3 };
4
5-bool swc_surface_initialize(struct swc_surface * surface);
6+bool swc_surface_initialize(struct swc_surface * surface,
7+ struct wl_client * client, uint32_t id);
8
9 void swc_surface_finish(struct swc_surface * surface);
10
11-extern struct wl_surface_interface swc_surface_interface;
12-
13-void swc_surface_destroy(struct wl_client * client,
14- struct wl_resource * resource);
15-
16-void swc_surface_attach(struct wl_client * client,
17- struct wl_resource * resource,
18- struct wl_resource * buffer_resource,
19- int32_t x, int32_t y);
20-
21-void swc_surface_damage(struct wl_client * client,
22- struct wl_resource * resource,
23- int32_t x, int32_t y,
24- int32_t width, int32_t height);
25-
26-void swc_surface_frame(struct wl_client * client,
27- struct wl_resource * resource,
28- uint32_t callback);
29-
30-void swc_surface_set_opaque_region(struct wl_client * client,
31- struct wl_resource * resource,
32- struct wl_resource * region_resource);
33-
34-void swc_surface_set_input_region(struct wl_client * client,
35- struct wl_resource * resource,
36- struct wl_resource * region_resource);
37-
38-void swc_surface_commit(struct wl_client * client,
39- struct wl_resource * resource);
40-
41 #endif
42
+1,
-0
1@@ -22,6 +22,7 @@ union swc_renderer_surface_state
2 struct swc_compositor_surface_state
3 {
4 struct swc_compositor * compositor;
5+ struct wl_listener destroy_listener;
6 struct wl_listener event_listener;
7 };
8