diff options
Diffstat (limited to 'sway/ipc-server.c')
-rw-r--r-- | sway/ipc-server.c | 35 |
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; | |||
43 | struct get_pixels_request { | 43 | struct 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 | ||
48 | struct sockaddr_un *ipc_user_sockaddr(void); | 49 | struct 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; |