diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-11-12 19:35:39 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-11-12 19:35:39 -0500 |
commit | 11b1ba397f9bef1266f073fafab3e8de51346032 (patch) | |
tree | 7f9a3f548cc3cd521ade3f777e5b812135bac053 /wayland | |
parent | Start fleshing out wayland client implementation (diff) | |
download | sway-11b1ba397f9bef1266f073fafab3e8de51346032.tar.gz sway-11b1ba397f9bef1266f073fafab3e8de51346032.tar.zst sway-11b1ba397f9bef1266f073fafab3e8de51346032.zip |
Further refinement of wayland client support
Diffstat (limited to 'wayland')
-rw-r--r-- | wayland/client.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/wayland/client.c b/wayland/client.c index c62f92bd..b5e5b51a 100644 --- a/wayland/client.c +++ b/wayland/client.c | |||
@@ -103,6 +103,16 @@ static int create_pool_file(size_t size) { | |||
103 | return fd; | 103 | return fd; |
104 | } | 104 | } |
105 | 105 | ||
106 | static void buffer_release(void *data, struct wl_buffer *buffer) { | ||
107 | struct client_state *state = data; | ||
108 | state->busy = false; | ||
109 | sway_log(L_INFO, "buffer release"); | ||
110 | } | ||
111 | |||
112 | static const struct wl_buffer_listener buffer_listener = { | ||
113 | .release = buffer_release | ||
114 | }; | ||
115 | |||
106 | struct buffer *create_buffer(struct client_state *state, | 116 | struct buffer *create_buffer(struct client_state *state, |
107 | int32_t width, int32_t height, uint32_t format) { | 117 | int32_t width, int32_t height, uint32_t format) { |
108 | 118 | ||
@@ -120,10 +130,23 @@ struct buffer *create_buffer(struct client_state *state, | |||
120 | state->cairo = cairo_create(state->cairo_surface); | 130 | state->cairo = cairo_create(state->cairo_surface); |
121 | state->pango = pango_cairo_create_context(state->cairo); | 131 | state->pango = pango_cairo_create_context(state->cairo); |
122 | 132 | ||
133 | wl_buffer_add_listener(buf->buffer, &buffer_listener, state); | ||
134 | |||
123 | sway_log(L_INFO, "%p %p", buf->pool, buf->buffer); | 135 | sway_log(L_INFO, "%p %p", buf->pool, buf->buffer); |
124 | return buf; | 136 | return buf; |
125 | } | 137 | } |
126 | 138 | ||
139 | static void frame_callback(void *data, struct wl_callback *callback, uint32_t time) { | ||
140 | sway_log(L_INFO, "frame callback"); | ||
141 | struct client_state *state = data; | ||
142 | wl_callback_destroy(callback); | ||
143 | state->frame_cb = NULL; | ||
144 | } | ||
145 | |||
146 | static const struct wl_callback_listener listener = { | ||
147 | frame_callback | ||
148 | }; | ||
149 | |||
127 | struct client_state *client_setup(void) { | 150 | struct client_state *client_setup(void) { |
128 | struct client_state *state = malloc(sizeof(struct client_state)); | 151 | struct client_state *state = malloc(sizeof(struct client_state)); |
129 | memset(state, 0, sizeof(struct client_state)); | 152 | memset(state, 0, sizeof(struct client_state)); |
@@ -138,8 +161,8 @@ struct client_state *client_setup(void) { | |||
138 | 161 | ||
139 | struct wl_registry *registry = wl_display_get_registry(state->display); | 162 | struct wl_registry *registry = wl_display_get_registry(state->display); |
140 | wl_registry_add_listener(registry, ®istry_listener, state); | 163 | wl_registry_add_listener(registry, ®istry_listener, state); |
141 | wl_display_roundtrip(state->display); // globals | 164 | wl_display_dispatch(state->display); |
142 | wl_display_roundtrip(state->display); // listeners | 165 | wl_display_roundtrip(state->display); |
143 | wl_registry_destroy(registry); | 166 | wl_registry_destroy(registry); |
144 | 167 | ||
145 | state->buffer = create_buffer(state, 100, 100, WL_SHM_FORMAT_ARGB8888); | 168 | state->buffer = create_buffer(state, 100, 100, WL_SHM_FORMAT_ARGB8888); |
@@ -148,21 +171,26 @@ struct client_state *client_setup(void) { | |||
148 | wl_shell_surface_set_toplevel(state->shell_surface); | 171 | wl_shell_surface_set_toplevel(state->shell_surface); |
149 | 172 | ||
150 | wl_surface_damage(state->surface, 0, 0, 100, 100); | 173 | wl_surface_damage(state->surface, 0, 0, 100, 100); |
151 | wl_surface_attach(state->surface, state->buffer->buffer, 0, 0); | ||
152 | wl_surface_commit(state->surface); | ||
153 | 174 | ||
154 | return state; | 175 | return state; |
155 | } | 176 | } |
156 | 177 | ||
157 | int client_prerender(struct client_state *state) { | 178 | int client_prerender(struct client_state *state) { |
158 | wl_display_dispatch_pending(state->display); | 179 | wl_display_dispatch_pending(state->display); |
159 | if (wl_display_flush(state->display) < 0 && errno != EAGAIN) { | 180 | wl_display_flush(state->display); |
160 | return 0; | ||
161 | } | ||
162 | return 1; | 181 | return 1; |
163 | } | 182 | } |
164 | 183 | ||
165 | int client_render(struct client_state *state) { | 184 | int client_render(struct client_state *state) { |
185 | if (state->frame_cb) { | ||
186 | return 2; | ||
187 | } | ||
188 | state->frame_cb = wl_surface_frame(state->surface); | ||
189 | wl_callback_add_listener(state->frame_cb, &listener, state); | ||
190 | wl_surface_damage(state->surface, 0, 0, 100, 100); | ||
191 | wl_surface_attach(state->surface, state->buffer->buffer, 0, 0); | ||
192 | wl_surface_commit(state->surface); | ||
193 | state->busy = true; | ||
166 | return wl_display_dispatch(state->display) != -1; | 194 | return wl_display_dispatch(state->display) != -1; |
167 | } | 195 | } |
168 | 196 | ||