diff options
Diffstat (limited to 'sway')
-rw-r--r-- | sway/extensions.c | 155 | ||||
-rw-r--r-- | sway/ipc-json.c | 4 |
2 files changed, 118 insertions, 41 deletions
diff --git a/sway/extensions.c b/sway/extensions.c index 5fee7d38..15d2f971 100644 --- a/sway/extensions.c +++ b/sway/extensions.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <wlc/wlc-render.h> | 4 | #include <wlc/wlc-render.h> |
5 | #include "wayland-desktop-shell-server-protocol.h" | 5 | #include "wayland-desktop-shell-server-protocol.h" |
6 | #include "wayland-swaylock-server-protocol.h" | 6 | #include "wayland-swaylock-server-protocol.h" |
7 | #include "wayland-gamma-control-server-protocol.h" | ||
7 | #include "sway/layout.h" | 8 | #include "sway/layout.h" |
8 | #include "sway/input_state.h" | 9 | #include "sway/input_state.h" |
9 | #include "sway/extensions.h" | 10 | #include "sway/extensions.h" |
@@ -140,6 +141,52 @@ static void desktop_unlock(struct wl_client *client, struct wl_resource *resourc | |||
140 | sway_log(L_ERROR, "desktop_unlock is not currently supported"); | 141 | sway_log(L_ERROR, "desktop_unlock is not currently supported"); |
141 | } | 142 | } |
142 | 143 | ||
144 | static void set_grab_surface(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface) { | ||
145 | sway_log(L_ERROR, "desktop_set_grab_surface is not currently supported"); | ||
146 | } | ||
147 | |||
148 | static void desktop_ready(struct wl_client *client, struct wl_resource *resource) { | ||
149 | // nop | ||
150 | } | ||
151 | |||
152 | static void set_panel_position(struct wl_client *client, struct wl_resource *resource, uint32_t position) { | ||
153 | pid_t pid; | ||
154 | wl_client_get_credentials(client, &pid, NULL, NULL); | ||
155 | if (!(get_feature_policy(pid) & FEATURE_PANEL)) { | ||
156 | sway_log(L_INFO, "Denying panel feature to %d", pid); | ||
157 | return; | ||
158 | } | ||
159 | struct panel_config *config = find_or_create_panel_config(resource); | ||
160 | sway_log(L_DEBUG, "Panel position for wl_resource %p changed %d => %d", resource, config->panel_position, position); | ||
161 | config->panel_position = position; | ||
162 | arrange_windows(&root_container, -1, -1); | ||
163 | } | ||
164 | |||
165 | static struct desktop_shell_interface desktop_shell_implementation = { | ||
166 | .set_background = set_background, | ||
167 | .set_panel = set_panel, | ||
168 | .set_lock_surface = desktop_set_lock_surface, | ||
169 | .unlock = desktop_unlock, | ||
170 | .set_grab_surface = set_grab_surface, | ||
171 | .desktop_ready = desktop_ready, | ||
172 | .set_panel_position = set_panel_position | ||
173 | }; | ||
174 | |||
175 | static void desktop_shell_bind(struct wl_client *client, void *data, | ||
176 | unsigned int version, unsigned int id) { | ||
177 | if (version > 3) { | ||
178 | // Unsupported version | ||
179 | return; | ||
180 | } | ||
181 | |||
182 | struct wl_resource *resource = wl_resource_create(client, &desktop_shell_interface, version, id); | ||
183 | if (!resource) { | ||
184 | wl_client_post_no_memory(client); | ||
185 | } | ||
186 | |||
187 | wl_resource_set_implementation(resource, &desktop_shell_implementation, NULL, NULL); | ||
188 | } | ||
189 | |||
143 | static void set_lock_surface(struct wl_client *client, struct wl_resource *resource, | 190 | static void set_lock_surface(struct wl_client *client, struct wl_resource *resource, |
144 | struct wl_resource *_output, struct wl_resource *surface) { | 191 | struct wl_resource *_output, struct wl_resource *surface) { |
145 | pid_t pid; | 192 | pid_t pid; |
@@ -179,70 +226,98 @@ static void unlock(struct wl_client *client, struct wl_resource *resource) { | |||
179 | // This isn't really necessary, we just unlock when the client exits. | 226 | // This isn't really necessary, we just unlock when the client exits. |
180 | } | 227 | } |
181 | 228 | ||
182 | static void set_grab_surface(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface) { | ||
183 | sway_log(L_ERROR, "desktop_set_grab_surface is not currently supported"); | ||
184 | } | ||
185 | |||
186 | static void desktop_ready(struct wl_client *client, struct wl_resource *resource) { | ||
187 | // nop | ||
188 | } | ||
189 | |||
190 | static void set_panel_position(struct wl_client *client, struct wl_resource *resource, uint32_t position) { | ||
191 | pid_t pid; | ||
192 | wl_client_get_credentials(client, &pid, NULL, NULL); | ||
193 | if (!(get_feature_policy(pid) & FEATURE_PANEL)) { | ||
194 | sway_log(L_INFO, "Denying panel feature to %d", pid); | ||
195 | return; | ||
196 | } | ||
197 | struct panel_config *config = find_or_create_panel_config(resource); | ||
198 | sway_log(L_DEBUG, "Panel position for wl_resource %p changed %d => %d", resource, config->panel_position, position); | ||
199 | config->panel_position = position; | ||
200 | arrange_windows(&root_container, -1, -1); | ||
201 | } | ||
202 | |||
203 | static struct desktop_shell_interface desktop_shell_implementation = { | ||
204 | .set_background = set_background, | ||
205 | .set_panel = set_panel, | ||
206 | .set_lock_surface = desktop_set_lock_surface, | ||
207 | .unlock = desktop_unlock, | ||
208 | .set_grab_surface = set_grab_surface, | ||
209 | .desktop_ready = desktop_ready, | ||
210 | .set_panel_position = set_panel_position | ||
211 | }; | ||
212 | |||
213 | static struct lock_interface swaylock_implementation = { | 229 | static struct lock_interface swaylock_implementation = { |
214 | .set_lock_surface = set_lock_surface, | 230 | .set_lock_surface = set_lock_surface, |
215 | .unlock = unlock | 231 | .unlock = unlock |
216 | }; | 232 | }; |
217 | 233 | ||
218 | static void desktop_shell_bind(struct wl_client *client, void *data, | 234 | static void swaylock_bind(struct wl_client *client, void *data, |
219 | unsigned int version, unsigned int id) { | 235 | unsigned int version, unsigned int id) { |
220 | if (version > 3) { | 236 | if (version > 1) { |
221 | // Unsupported version | 237 | // Unsupported version |
222 | return; | 238 | return; |
223 | } | 239 | } |
224 | 240 | ||
225 | struct wl_resource *resource = wl_resource_create(client, &desktop_shell_interface, version, id); | 241 | struct wl_resource *resource = wl_resource_create(client, &lock_interface, version, id); |
226 | if (!resource) { | 242 | if (!resource) { |
227 | wl_client_post_no_memory(client); | 243 | wl_client_post_no_memory(client); |
228 | } | 244 | } |
229 | 245 | ||
230 | wl_resource_set_implementation(resource, &desktop_shell_implementation, NULL, NULL); | 246 | wl_resource_set_implementation(resource, &swaylock_implementation, NULL, NULL); |
231 | } | 247 | } |
232 | 248 | ||
233 | static void swaylock_bind(struct wl_client *client, void *data, | 249 | static void gamma_control_destroy(struct wl_client *client, struct wl_resource *res) { |
234 | unsigned int version, unsigned int id) { | 250 | wl_resource_destroy(res); |
251 | } | ||
252 | |||
253 | static void gamma_control_set_gamma(struct wl_client *client, | ||
254 | struct wl_resource *res, struct wl_array *red, | ||
255 | struct wl_array *green, struct wl_array *blue) { | ||
256 | if (red->size != green->size || red->size != blue->size) { | ||
257 | wl_resource_post_error(res, GAMMA_CONTROL_ERROR_INVALID_GAMMA, | ||
258 | "The gamma ramps don't have the same size"); | ||
259 | return; | ||
260 | } | ||
261 | uint16_t *r = (uint16_t *)red->data; | ||
262 | uint16_t *g = (uint16_t *)green->data; | ||
263 | uint16_t *b = (uint16_t *)blue->data; | ||
264 | wlc_handle output = wlc_handle_from_wl_output_resource( | ||
265 | wl_resource_get_user_data(res)); | ||
266 | if (!output) { | ||
267 | return; | ||
268 | } | ||
269 | sway_log(L_DEBUG, "Setting gamma for output"); | ||
270 | wlc_output_set_gamma(output, red->size / sizeof(uint16_t), r, g, b); | ||
271 | } | ||
272 | |||
273 | static void gamma_control_reset_gamma(struct wl_client *client, | ||
274 | struct wl_resource *resource) { | ||
275 | // This space intentionally left blank | ||
276 | } | ||
277 | |||
278 | static struct gamma_control_interface gamma_control_implementation = { | ||
279 | .destroy = gamma_control_destroy, | ||
280 | .set_gamma = gamma_control_set_gamma, | ||
281 | .reset_gamma = gamma_control_reset_gamma | ||
282 | }; | ||
283 | |||
284 | static void gamma_control_manager_destroy(struct wl_client *client, | ||
285 | struct wl_resource *res) { | ||
286 | wl_resource_destroy(res); | ||
287 | } | ||
288 | |||
289 | static void gamma_control_manager_get(struct wl_client *client, | ||
290 | struct wl_resource *res, uint32_t id, struct wl_resource *_output) { | ||
291 | struct wl_resource *manager_res = wl_resource_create(client, | ||
292 | &gamma_control_interface, wl_resource_get_version(res), id); | ||
293 | wlc_handle output = wlc_handle_from_wl_output_resource(_output); | ||
294 | if (!output) { | ||
295 | return; | ||
296 | } | ||
297 | wl_resource_set_implementation(manager_res, &gamma_control_implementation, | ||
298 | _output, NULL); | ||
299 | gamma_control_send_gamma_size(manager_res, wlc_output_get_gamma_size(output)); | ||
300 | } | ||
301 | |||
302 | static struct gamma_control_manager_interface gamma_manager_implementation = { | ||
303 | .destroy = gamma_control_manager_destroy, | ||
304 | .get_gamma_control = gamma_control_manager_get | ||
305 | }; | ||
306 | |||
307 | static void gamma_control_manager_bind(struct wl_client *client, void *data, | ||
308 | unsigned int version, unsigned int fd) { | ||
235 | if (version > 1) { | 309 | if (version > 1) { |
236 | // Unsupported version | 310 | // Unsupported version |
237 | return; | 311 | return; |
238 | } | 312 | } |
239 | 313 | ||
240 | struct wl_resource *resource = wl_resource_create(client, &lock_interface, version, id); | 314 | struct wl_resource *resource = wl_resource_create(client, |
315 | &gamma_control_manager_interface, version, fd); | ||
241 | if (!resource) { | 316 | if (!resource) { |
242 | wl_client_post_no_memory(client); | 317 | wl_client_post_no_memory(client); |
243 | } | 318 | } |
244 | 319 | ||
245 | wl_resource_set_implementation(resource, &swaylock_implementation, NULL, NULL); | 320 | wl_resource_set_implementation(resource, &gamma_manager_implementation, NULL, NULL); |
246 | } | 321 | } |
247 | 322 | ||
248 | void register_extensions(void) { | 323 | void register_extensions(void) { |
@@ -252,4 +327,6 @@ void register_extensions(void) { | |||
252 | desktop_shell.lock_surfaces = create_list(); | 327 | desktop_shell.lock_surfaces = create_list(); |
253 | desktop_shell.is_locked = false; | 328 | desktop_shell.is_locked = false; |
254 | wl_global_create(wlc_get_wl_display(), &lock_interface, 1, NULL, swaylock_bind); | 329 | wl_global_create(wlc_get_wl_display(), &lock_interface, 1, NULL, swaylock_bind); |
330 | wl_global_create(wlc_get_wl_display(), &gamma_control_manager_interface, 1, | ||
331 | NULL, gamma_control_manager_bind); | ||
255 | } | 332 | } |
diff --git a/sway/ipc-json.c b/sway/ipc-json.c index fd17216e..876fc87c 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c | |||
@@ -132,7 +132,7 @@ static void ipc_json_describe_output(swayc_t *output, json_object *object) { | |||
132 | 132 | ||
133 | static void ipc_json_describe_workspace(swayc_t *workspace, json_object *object) { | 133 | static void ipc_json_describe_workspace(swayc_t *workspace, json_object *object) { |
134 | int num = (isdigit(workspace->name[0])) ? atoi(workspace->name) : -1; | 134 | int num = (isdigit(workspace->name[0])) ? atoi(workspace->name) : -1; |
135 | const char *layout = ipc_json_layout_description(workspace->layout); | 135 | const char *layout = ipc_json_layout_description(workspace->workspace_layout); |
136 | 136 | ||
137 | json_object_object_add(object, "num", json_object_new_int(num)); | 137 | json_object_object_add(object, "num", json_object_new_int(num)); |
138 | json_object_object_add(object, "output", (workspace->parent) ? json_object_new_string(workspace->parent->name) : NULL); | 138 | json_object_object_add(object, "output", (workspace->parent) ? json_object_new_string(workspace->parent->name) : NULL); |
@@ -173,7 +173,7 @@ static void ipc_json_describe_view(swayc_t *c, json_object *object) { | |||
173 | json_object_object_add(object, "last_split_layout", | 173 | json_object_object_add(object, "last_split_layout", |
174 | (strcmp(last_layout, "null") == 0) ? NULL : json_object_new_string(last_layout)); | 174 | (strcmp(last_layout, "null") == 0) ? NULL : json_object_new_string(last_layout)); |
175 | json_object_object_add(object, "workspace_layout", | 175 | json_object_object_add(object, "workspace_layout", |
176 | json_object_new_string(ipc_json_layout_description(swayc_parent_by_type(c, C_WORKSPACE)->layout))); | 176 | json_object_new_string(ipc_json_layout_description(swayc_parent_by_type(c, C_WORKSPACE)->workspace_layout))); |
177 | 177 | ||
178 | json_object_object_add(object, "border", json_object_new_string(ipc_json_border_description(c))); | 178 | json_object_object_add(object, "border", json_object_new_string(ipc_json_border_description(c))); |
179 | json_object_object_add(object, "current_border_width", json_object_new_int(c->border_thickness)); | 179 | json_object_object_add(object, "current_border_width", json_object_new_int(c->border_thickness)); |