diff options
Diffstat (limited to '')
-rw-r--r-- | src/nautilus-previewer.c | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/src/nautilus-previewer.c b/src/nautilus-previewer.c new file mode 100644 index 0000000..66074ab --- /dev/null +++ b/src/nautilus-previewer.c @@ -0,0 +1,207 @@ +/* + * nautilus-previewer: nautilus previewer DBus wrapper + * + * Copyright (C) 2011, Red Hat, Inc. + * + * Nautilus is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * Nautilus is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + * + * Author: Cosimo Cecchi <cosimoc@redhat.com> + * + */ + +#include "config.h" + +#include "nautilus-previewer.h" + +#include "nautilus-files-view.h" +#include "nautilus-window.h" +#include "nautilus-window-slot.h" + +#define DEBUG_FLAG NAUTILUS_DEBUG_PREVIEWER +#include "nautilus-debug.h" + +#include <gio/gio.h> + +#define PREVIEWER_DBUS_NAME "org.gnome.NautilusPreviewer" +#define PREVIEWER2_DBUS_IFACE "org.gnome.NautilusPreviewer2" +#define PREVIEWER_DBUS_PATH "/org/gnome/NautilusPreviewer" + +static GDBusProxy *previewer_v2_proxy = NULL; + +static gboolean +ensure_previewer_v2_proxy (void) +{ + if (previewer_v2_proxy == NULL) + { + g_autoptr (GError) error = NULL; + GDBusConnection *connection = g_application_get_dbus_connection (g_application_get_default ()); + + previewer_v2_proxy = g_dbus_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION, + NULL, + PREVIEWER_DBUS_NAME, + PREVIEWER_DBUS_PATH, + PREVIEWER2_DBUS_IFACE, + NULL, + &error); + + if (error != NULL) + { + DEBUG ("Unable to create NautilusPreviewer2 proxy: %s", error->message); + return FALSE; + } + } + + return TRUE; +} + +static void +previewer2_method_ready_cb (GObject *source, + GAsyncResult *res, + gpointer user_data) +{ + GDBusProxy *proxy = G_DBUS_PROXY (source); + g_autoptr (GError) error = NULL; + + g_dbus_proxy_call_finish (proxy, res, &error); + + if (error != NULL) + { + DEBUG ("Unable to call method on NautilusPreviewer: %s", error->message); + } +} + +void +nautilus_previewer_call_show_file (const gchar *uri, + const gchar *window_handle, + guint xid, + gboolean close_if_already_visible) +{ + if (!ensure_previewer_v2_proxy ()) + { + return; + } + + g_dbus_proxy_call (previewer_v2_proxy, + "ShowFile", + g_variant_new ("(ssb)", + uri, window_handle, close_if_already_visible), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + previewer2_method_ready_cb, + NULL); +} + +void +nautilus_previewer_call_close (void) +{ + if (!ensure_previewer_v2_proxy ()) + { + return; + } + + /* don't autostart the previewer if it's not running */ + g_dbus_proxy_call (previewer_v2_proxy, + "Close", + NULL, + G_DBUS_CALL_FLAGS_NO_AUTO_START, + -1, + NULL, + previewer2_method_ready_cb, + NULL); +} + +static void +previewer_selection_event (GDBusConnection *connection, + const gchar *sender_name, + const gchar *object_path, + const gchar *interface_name, + const gchar *signal_name, + GVariant *parameters, + gpointer user_data) +{ + GApplication *application = g_application_get_default (); + GList *l, *windows = gtk_application_get_windows (GTK_APPLICATION (application)); + NautilusWindow *window = NULL; + NautilusWindowSlot *slot; + NautilusView *view; + GtkDirectionType direction; + + for (l = windows; l != NULL; l = l->next) + { + if (NAUTILUS_IS_WINDOW (l->data)) + { + window = l->data; + break; + } + } + + if (window == NULL) + { + return; + } + + slot = nautilus_window_get_active_slot (window); + view = nautilus_window_slot_get_current_view (slot); + + if (!NAUTILUS_IS_FILES_VIEW (view)) + { + return; + } + + g_variant_get (parameters, "(u)", &direction); + nautilus_files_view_preview_selection_event (NAUTILUS_FILES_VIEW (view), direction); +} + +guint +nautilus_previewer_connect_selection_event (GDBusConnection *connection) +{ + return g_dbus_connection_signal_subscribe (connection, + PREVIEWER_DBUS_NAME, + PREVIEWER2_DBUS_IFACE, + "SelectionEvent", + PREVIEWER_DBUS_PATH, + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + previewer_selection_event, + NULL, + NULL); +} + +void +nautilus_previewer_disconnect_selection_event (GDBusConnection *connection, + guint event_id) +{ + g_dbus_connection_signal_unsubscribe (connection, event_id); +} + +gboolean +nautilus_previewer_is_visible (void) +{ + g_autoptr (GVariant) variant = NULL; + + if (!ensure_previewer_v2_proxy ()) + { + return FALSE; + } + + variant = g_dbus_proxy_get_cached_property (previewer_v2_proxy, "Visible"); + if (variant) + { + return g_variant_get_boolean (variant); + } + + return FALSE; +} |