[gnome-screenshot] Port screenshot area selection to GNOME Shell's DBus API
- From: Kalev Lember <klember src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-screenshot] Port screenshot area selection to GNOME Shell's DBus API
- Date: Thu, 23 Oct 2014 17:51:12 +0000 (UTC)
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]