[gnome-screenshot] Port screenshot area selection to GNOME Shell's DBus API



commit 56065725542e36bdde6acd66b8b071fbd0b08e6f
Author: Kalev Lember <kalevlember gmail com>
Date:   Thu Oct 23 16:09:35 2014 +0200

    Port screenshot area selection to GNOME Shell's DBus API
    
    ... to make screenshot selection work under Wayland.
    
    In order to keep gnome-screenshot working with other window managers,
    this keeps the old, X11 based area selection code around as a fallback
    when the DBus interface is unavailable.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=738972

 src/screenshot-area-selection.c |   74 ++++++++++++++++++++++++++++++++++----
 1 files changed, 66 insertions(+), 8 deletions(-)
---
diff --git a/src/screenshot-area-selection.c b/src/screenshot-area-selection.c
index cb7c986..5411830 100644
--- a/src/screenshot-area-selection.c
+++ b/src/screenshot-area-selection.c
@@ -222,13 +222,11 @@ emit_select_callback_in_idle (gpointer user_data)
   return FALSE;
 }
 
-void
-screenshot_select_area_async (SelectAreaCallback callback,
-                              gpointer callback_data)
+static void
+screenshot_select_area_x11_async (CallbackData *cb_data)
 {
   GdkCursor *cursor;
   select_area_filter_data  data;
-  CallbackData *cb_data;
   GdkDeviceManager *manager;
   GdkDevice *pointer, *keyboard;
   GdkGrabStatus res;
@@ -241,10 +239,6 @@ screenshot_select_area_async (SelectAreaCallback callback,
   data.aborted = FALSE;
   data.window = create_select_window();
 
-  cb_data = g_slice_new0 (CallbackData);
-  cb_data->callback = callback;
-  cb_data->callback_data = callback_data;
-
   g_signal_connect (data.window, "key-press-event", G_CALLBACK (select_area_key_press), &data);
   g_signal_connect (data.window, "button-press-event", G_CALLBACK (select_area_button_press), &data);
   g_signal_connect (data.window, "button-release-event", G_CALLBACK (select_area_button_release), &data);
@@ -300,3 +294,67 @@ screenshot_select_area_async (SelectAreaCallback callback,
    */
   g_timeout_add (200, emit_select_callback_in_idle, cb_data);
 }
+
+static void
+select_area_done (GObject *source_object,
+                  GAsyncResult *res,
+                  gpointer user_data)
+{
+  CallbackData *cb_data = user_data;
+  GError *error = NULL;
+  GVariant *ret;
+
+  ret = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object), res, &error);
+  if (error != NULL)
+    {
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+        {
+          g_error_free (error);
+          cb_data->aborted = TRUE;
+          g_idle_add (emit_select_callback_in_idle, cb_data);
+          return;
+        }
+
+      g_message ("Unable to select area using GNOME Shell's builtin screenshot "
+                 "interface, resorting to fallback X11.");
+      g_error_free (error);
+
+      screenshot_select_area_x11_async (cb_data);
+      return;
+    }
+
+  g_variant_get (ret, "(iiii)",
+                 &cb_data->rectangle.x,
+                 &cb_data->rectangle.y,
+                 &cb_data->rectangle.width,
+                 &cb_data->rectangle.height);
+  g_variant_unref (ret);
+
+  g_idle_add (emit_select_callback_in_idle, cb_data);
+}
+
+void
+screenshot_select_area_async (SelectAreaCallback callback,
+                              gpointer callback_data)
+{
+  CallbackData *cb_data;
+  GDBusConnection *connection;
+
+  cb_data = g_slice_new0 (CallbackData);
+  cb_data->callback = callback;
+  cb_data->callback_data = callback_data;
+
+  connection = g_application_get_dbus_connection (g_application_get_default ());
+  g_dbus_connection_call (connection,
+                          "org.gnome.Shell.Screenshot",
+                          "/org/gnome/Shell/Screenshot",
+                          "org.gnome.Shell.Screenshot",
+                          "SelectArea",
+                          NULL,
+                          NULL,
+                          G_DBUS_CALL_FLAGS_NONE,
+                          G_MAXINT,
+                          NULL,
+                          select_area_done,
+                          cb_data);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]