summaryrefslogtreecommitdiffstats
path: root/sway/ipc-server.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/ipc-server.c')
-rw-r--r--sway/ipc-server.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/sway/ipc-server.c b/sway/ipc-server.c
index 4c54e56a..ebb5ce58 100644
--- a/sway/ipc-server.c
+++ b/sway/ipc-server.c
@@ -43,6 +43,7 @@ static list_t *ipc_get_pixel_requests = NULL;
43struct get_pixels_request { 43struct get_pixels_request {
44 struct ipc_client *client; 44 struct ipc_client *client;
45 wlc_handle output; 45 wlc_handle output;
46 struct wlc_geometry geo;
46}; 47};
47 48
48struct sockaddr_un *ipc_user_sockaddr(void); 49struct sockaddr_un *ipc_user_sockaddr(void);
@@ -259,16 +260,12 @@ void ipc_get_pixels(wlc_handle output) {
259 continue; 260 continue;
260 } 261 }
261 262
262 const struct wlc_size *size = wlc_output_get_resolution(req->output); 263 const struct wlc_size *size = &req->geo.size;
263 struct wlc_geometry g = {
264 .size = *size,
265 .origin = { 0, 0 },
266 };
267 struct wlc_geometry g_out; 264 struct wlc_geometry g_out;
268 char response_header[9]; 265 char response_header[9];
269 memset(response_header, 0, sizeof(response_header)); 266 memset(response_header, 0, sizeof(response_header));
270 char *data = malloc(sizeof(response_header) + size->w * size->h * 4); 267 char *data = malloc(sizeof(response_header) + size->w * size->h * 4);
271 wlc_pixels_read(WLC_RGBA8888, &g, &g_out, data + sizeof(response_header)); 268 wlc_pixels_read(WLC_RGBA8888, &req->geo, &g_out, data + sizeof(response_header));
272 269
273 response_header[0] = 1; 270 response_header[0] = 1;
274 uint32_t *_size = (uint32_t *)(response_header + 1); 271 uint32_t *_size = (uint32_t *)(response_header + 1);
@@ -425,7 +422,30 @@ void ipc_client_handle_command(struct ipc_client *client) {
425 { 422 {
426 char response_header[9]; 423 char response_header[9];
427 memset(response_header, 0, sizeof(response_header)); 424 memset(response_header, 0, sizeof(response_header));
428 swayc_t *output = swayc_by_test(&root_container, output_by_name_test, buf); 425
426 json_object *obj = json_tokener_parse(buf);
427 json_object *o, *x, *y, *w, *h;
428
429 json_object_object_get_ex(obj, "output", &o);
430 json_object_object_get_ex(obj, "x", &x);
431 json_object_object_get_ex(obj, "y", &y);
432 json_object_object_get_ex(obj, "w", &w);
433 json_object_object_get_ex(obj, "h", &h);
434
435 struct wlc_geometry g = {
436 .origin = {
437 .x = json_object_get_int(x),
438 .y = json_object_get_int(y)
439 },
440 .size = {
441 .w = json_object_get_int(w),
442 .h = json_object_get_int(h)
443 }
444 };
445
446 swayc_t *output = swayc_by_test(&root_container, output_by_name_test, (void *)json_object_get_string(o));
447 json_object_put(obj);
448
429 if (!output) { 449 if (!output) {
430 sway_log(L_ERROR, "IPC GET_PIXELS request with unknown output name"); 450 sway_log(L_ERROR, "IPC GET_PIXELS request with unknown output name");
431 ipc_send_reply(client, response_header, sizeof(response_header)); 451 ipc_send_reply(client, response_header, sizeof(response_header));
@@ -434,6 +454,7 @@ void ipc_client_handle_command(struct ipc_client *client) {
434 struct get_pixels_request *req = malloc(sizeof(struct get_pixels_request)); 454 struct get_pixels_request *req = malloc(sizeof(struct get_pixels_request));
435 req->client = client; 455 req->client = client;
436 req->output = output->handle; 456 req->output = output->handle;
457 req->geo = g;
437 list_add(ipc_get_pixel_requests, req); 458 list_add(ipc_get_pixel_requests, req);
438 wlc_output_schedule_render(output->handle); 459 wlc_output_schedule_render(output->handle);
439 goto exit_cleanup; 460 goto exit_cleanup;