diff --git a/data/org.cinnamon.Screenshot.xml b/data/org.gnome.Shell.Screenshot.xml similarity index 98% rename from data/org.cinnamon.Screenshot.xml rename to data/org.gnome.Shell.Screenshot.xml index 0f7e329..c367f26 100644 --- a/data/org.cinnamon.Screenshot.xml +++ b/data/org.gnome.Shell.Screenshot.xml @@ -9,7 +9,7 @@ The interface used to capture pictures of the screen contents. --> - + + diff --git a/src/meson.build b/src/meson.build index 88d47ec..48b678b 100644 --- a/src/meson.build +++ b/src/meson.build @@ -34,7 +34,7 @@ built_sources = gnome.gdbus_codegen( desktop_dbus_interfaces = files( top_srcdir / 'data' / 'org.freedesktop.ScreenSaver.xml', top_srcdir / 'data' / 'org.gnome.SessionManager.xml', - top_srcdir / 'data' / 'org.cinnamon.Screenshot.xml', + top_srcdir / 'data' / 'org.gnome.Shell.Screenshot.xml', top_srcdir / 'data' / 'org.cinnamon.ScreenSaver.xml', top_srcdir / 'data' / 'org.gnome.ScreenSaver.xml', top_srcdir / 'data' / 'org.mate.ScreenSaver.xml' diff --git a/src/screenshot.c b/src/screenshot.c index f4809b8..dfa8bbc 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -19,7 +19,7 @@ #include "request.h" #include "utils.h" -static OrgCinnamonScreenshot *cinnamon; +static OrgGnomeShellScreenshot *cinnamon; typedef struct { XdpImplScreenshot *impl; @@ -28,6 +28,7 @@ typedef struct { int response; char *uri; + double red, green, blue; const char *retval; char *save_path; } ScreenshotHandle; @@ -62,6 +63,21 @@ send_response (ScreenshotHandle *handle) handle->response, g_variant_builder_end (&opt_builder)); } + else + { + GVariantBuilder opt_builder; + + g_variant_builder_init (&opt_builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_add (&opt_builder, "{sv}", "color", g_variant_new ("(ddd)", + handle->red, + handle->green, + handle->blue)); + + xdp_impl_screenshot_complete_pick_color (handle->impl, + handle->invocation, + handle->response, + g_variant_builder_end (&opt_builder)); + } screenshot_handle_free (handle); } @@ -89,6 +105,42 @@ xfce4_screenshooter_finished (GSubprocess *proc, send_response (handle); } +static void +cinnamon_color_pick_done (GObject *source, + GAsyncResult *result, + gpointer data) +{ + ScreenshotHandle *handle = data; + GError *error; + GVariant *ret; + + error = NULL; + + if (!org_gnome_shell_screenshot_call_pick_color_finish (cinnamon, + &ret, + result, + &error)) + { + g_print ("Failed to pick color: %s\n", error->message); + g_clear_error (&error); + handle->response = 1; + return; + } + else + if (!g_variant_lookup (ret, "color", "(ddd)", + &handle->red, + &handle->green, + &handle->blue)) + { + g_warning ("PickColor didn't return a color"); + handle->response = 2; + } + + handle->response = 0; + + send_response (handle); +} + static void cinnamon_screenshot_done (GObject *source, GAsyncResult *result, @@ -99,7 +151,7 @@ cinnamon_screenshot_done (GObject *source, g_autofree char *filename = NULL; g_autoptr(GError) error = NULL; - if (!org_cinnamon_screenshot_call_screenshot_finish (cinnamon, + if (!org_gnome_shell_screenshot_call_screenshot_finish (cinnamon, &success, &filename, result, @@ -156,6 +208,40 @@ construct_filename (void) return filename; } + +static gboolean +handle_pick_color (XdpImplScreenshot *object, + GDBusMethodInvocation *invocation, + const char *arg_handle, + const char *arg_app_id, + const char *arg_parent_window, + GVariant *arg_options) +{ + g_autoptr(Request) request = NULL; + const char *sender; + ScreenshotHandle *handle; + + sender = g_dbus_method_invocation_get_sender (invocation); + request = request_new (sender, arg_app_id, arg_handle); + + handle = g_new0 (ScreenshotHandle, 1); + handle->impl = object; + handle->invocation = invocation; + handle->request = g_object_ref (request); + handle->retval = "color"; + handle->response = 2; + + g_signal_connect (request, "handle-close", G_CALLBACK (handle_close), handle); + request_export (request, g_dbus_method_invocation_get_connection (invocation)); + org_gnome_shell_screenshot_call_pick_color (cinnamon, + NULL, + cinnamon_color_pick_done, + handle); + + return TRUE; +} + + static gboolean handle_screenshot (XdpImplScreenshot *object, GDBusMethodInvocation *invocation, @@ -213,7 +299,7 @@ handle_screenshot (XdpImplScreenshot *object, else if (CINNAMON_MODE) { - org_cinnamon_screenshot_call_screenshot (cinnamon, + org_gnome_shell_screenshot_call_screenshot (cinnamon, FALSE, TRUE, "Screenshot", @@ -239,13 +325,11 @@ screenshot_init (GDBusConnection *bus, helper = G_DBUS_INTERFACE_SKELETON (xdp_impl_screenshot_skeleton_new ()); - g_object_set (helper, "version", 1, NULL); + g_object_set (helper, "version", 2, NULL); // TODO: Need to implement dialog (or maybe interact with screenshot app). g_signal_connect (helper, "handle-screenshot", G_CALLBACK (handle_screenshot), NULL); - - // TODO: Need to implement in Cinnamon - // g_signal_connect (helper, "handle-pick-color", G_CALLBACK (handle_pick_color), NULL); + g_signal_connect (helper, "handle-pick-color", G_CALLBACK (handle_pick_color), NULL); if (!g_dbus_interface_skeleton_export (helper, bus, @@ -253,10 +337,10 @@ screenshot_init (GDBusConnection *bus, error)) return FALSE; - cinnamon = org_cinnamon_screenshot_proxy_new_sync (bus, + cinnamon = org_gnome_shell_screenshot_proxy_new_sync (bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, - "org.cinnamon.Screenshot", - "/org/cinnamon/Screenshot", + "org.Cinnamon", + "/org/gnome/Shell/Screenshot", NULL, error); if (cinnamon == NULL)