diff --git a/include/xdpw.h b/include/xdpw.h index e5f81a4..c5b5512 100644 --- a/include/xdpw.h +++ b/include/xdpw.h @@ -4,6 +4,13 @@ #include #include +struct xdpw_request { + sd_bus_slot *slot; +}; + int init_screenshot(sd_bus *bus); +struct xdpw_request *request_create(sd_bus *bus, const char *object_path); +void request_destroy(struct xdpw_request *req); + #endif diff --git a/meson.build b/meson.build index debda67..2bd704f 100644 --- a/meson.build +++ b/meson.build @@ -25,6 +25,7 @@ executable( 'xdg-desktop-portal-wlr', files([ 'main.c', + 'request.c', 'screenshot.c', ]), dependencies: [ diff --git a/screenshot.c b/screenshot.c index ce3de9a..787eee9 100644 --- a/screenshot.c +++ b/screenshot.c @@ -1,5 +1,6 @@ -#include +#include #include +#include #include "xdpw.h" static const char object_path[] = "/org/freedesktop/portal/desktop"; @@ -7,8 +8,80 @@ static const char interface_name[] = "org.freedesktop.impl.portal.Screenshot"; static int method_screenshot(sd_bus_message *msg, void *data, sd_bus_error *ret_error) { - // TODO - printf("Screenshot\n"); + int ret = 0; + + char *handle, *app_id, *parent_window; + ret = sd_bus_message_read(msg, "oss", &handle, &app_id, &parent_window); + if (ret < 0) { + return ret; + } + // TODO: read options + + // TODO: cleanup this + struct xdpw_request *req = + request_create(sd_bus_message_get_bus(msg), handle); + if (req == NULL) { + return -ENOMEM; + } + + sd_bus_message *reply = NULL; + ret = sd_bus_message_new_method_return(msg, &reply); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_append(reply, "u", 0); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_open_container(reply, 'a', "{sv}"); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_open_container(reply, 'e', "sv"); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_append_basic(reply, 's', "uri"); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_open_container(reply, 'v', "s"); + if (ret < 0) { + return ret; + } + + // TODO: take an actual screenshot + ret = sd_bus_message_append_basic(reply, 's', "file:///tmp/out.png"); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_close_container(reply); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_close_container(reply); + if (ret < 0) { + return ret; + } + + ret = sd_bus_message_close_container(reply); + if (ret < 0) { + return ret; + } + + ret = sd_bus_send(NULL, reply, NULL); + if (ret < 0) { + return ret; + } + + sd_bus_message_unref(reply); return 0; }