From 7618fdc67de8369f4126d76313106155f302a98b Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 12 Dec 2018 22:29:57 +0100 Subject: [PATCH] First commit --- README.md | 25 +++++++++++++++++++++++++ include/xdpw.h | 9 +++++++++ main.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ meson.build | 41 +++++++++++++++++++++++++++++++++++++++++ screenshot.c | 26 ++++++++++++++++++++++++++ wlr.portal | 4 ++++ 6 files changed, 153 insertions(+) create mode 100644 include/xdpw.h create mode 100644 main.c create mode 100644 meson.build create mode 100644 screenshot.c create mode 100644 wlr.portal diff --git a/README.md b/README.md index 5c943d9..ed3e67b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ # xdg-desktop-portal-wlr + xdg-desktop-portal backend for wlroots + +## Building + +```sh +meson build +ninja -C build +``` + +## Installing + +```sh +ninja -C build install +``` + +Make sure `XDG_CURRENT_DESKTOP=sway` is set. + +```sh +/usr/lib/xdg-desktop-portal -r & +xdg-desktop-portal-wlr +``` + +## License + +MIT diff --git a/include/xdpw.h b/include/xdpw.h new file mode 100644 index 0000000..e5f81a4 --- /dev/null +++ b/include/xdpw.h @@ -0,0 +1,9 @@ +#ifndef XDPW_H +#define XDPW_H + +#include +#include + +int init_screenshot(sd_bus *bus); + +#endif diff --git a/main.c b/main.c new file mode 100644 index 0000000..d380b75 --- /dev/null +++ b/main.c @@ -0,0 +1,48 @@ +#include +#include +#include "xdpw.h" + +static const char service_name[] = "org.freedesktop.impl.portal.desktop.wlr"; + +int main(int argc, char *argv[]) { + int ret = 0; + + sd_bus *bus = NULL; + ret = sd_bus_open_user(&bus); + if (ret < 0) { + fprintf(stderr, "Failed to connect to user bus: %s\n", strerror(-ret)); + goto error; + } + + init_screenshot(bus); + + ret = sd_bus_request_name(bus, service_name, 0); + if (ret < 0) { + fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-ret)); + goto error; + } + + while (1) { + ret = sd_bus_process(bus, NULL); + if (ret < 0) { + fprintf(stderr, "sd_bus_process failed: %s\n", strerror(-ret)); + } else if (ret > 0) { + // We processed a request, try to process another one, right-away + continue; + } + + ret = sd_bus_wait(bus, (uint64_t)-1); + if (ret < 0) { + fprintf(stderr, "sd_bus_wait failed: %s\n", strerror(-ret)); + goto error; + } + } + + // TODO: cleanup + + return EXIT_SUCCESS; + +error: + sd_bus_unref(bus); + return EXIT_FAILURE; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..debda67 --- /dev/null +++ b/meson.build @@ -0,0 +1,41 @@ +project( + 'xdg-desktop-portal-wlr', + 'c', + version: '0.0.0', + license: 'MIT', + meson_version: '>=0.43.0', + default_options: [ + 'c_std=c11', + 'warning_level=2', + 'werror=true', + ], +) + +add_project_arguments('-Wno-unused-parameter', language: 'c') + +xdpw_inc = include_directories('include') + +wayland_client = dependency('wayland-client') +wayland_protos = dependency('wayland-protocols', version: '>=1.14') +systemd = dependency('libsystemd') + +# subdir('protocol') + +executable( + 'xdg-desktop-portal-wlr', + files([ + 'main.c', + 'screenshot.c', + ]), + dependencies: [ + wayland_client, + systemd, + ], + include_directories: [xdpw_inc], + install: true, +) + +install_data( + 'wlr.portal', + install_dir: join_paths(get_option('datadir'), 'xdg-desktop-portal', 'portals'), +) diff --git a/screenshot.c b/screenshot.c new file mode 100644 index 0000000..ce3de9a --- /dev/null +++ b/screenshot.c @@ -0,0 +1,26 @@ +#include +#include +#include "xdpw.h" + +static const char object_path[] = "/org/freedesktop/portal/desktop"; +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"); + return 0; +} + +static const sd_bus_vtable screenshot_vtable[] = { + SD_BUS_VTABLE_START(0), + SD_BUS_METHOD("Screenshot", "ossa{sv}", "ua{sv}", method_screenshot, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_VTABLE_END +}; + +int init_screenshot(sd_bus *bus) { + // TODO: cleanup + sd_bus_slot *slot = NULL; + return sd_bus_add_object_vtable(bus, &slot, object_path, interface_name, + screenshot_vtable, NULL); +} diff --git a/wlr.portal b/wlr.portal new file mode 100644 index 0000000..44b8de4 --- /dev/null +++ b/wlr.portal @@ -0,0 +1,4 @@ +[portal] +DBusName=org.freedesktop.impl.portal.desktop.wlr +Interfaces=org.freedesktop.impl.portal.Screenshot;org.freedesktop.impl.portal.ScreenCast; +UseIn=sway