From ad593f3c5bbc5317dee65b9686203a3e547cb48b Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Fri, 23 Dec 2011 09:42:55 +0300 Subject: [PATCH] Added dnd support for image files. Bug 3688. --- src/image_viewer.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- src/main_window.c | 24 ++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/image_viewer.c b/src/image_viewer.c index b7f5611..b009be0 100644 --- a/src/image_viewer.c +++ b/src/image_viewer.c @@ -188,6 +188,9 @@ static void cb_rstto_image_loader_closed (GdkPixbufLoader *loader, RsttoImageViewerTransaction *transaction); static gboolean cb_rstto_image_viewer_update_pixbuf (RsttoImageViewer *viewer); +static void +cb_rstto_image_viewer_dnd (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, + guint info, guint time_, RsttoImageViewer *viewer); static gboolean rstto_scroll_event ( @@ -308,6 +311,12 @@ rstto_image_viewer_init ( GObject *object ) G_CALLBACK (cb_rstto_zoom_direction_changed), viewer); + g_signal_connect ( + G_OBJECT(viewer), + "drag-data-received", + G_CALLBACK (cb_rstto_image_viewer_dnd), + viewer); + gtk_widget_set_events (GTK_WIDGET(viewer), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | @@ -315,10 +324,10 @@ rstto_image_viewer_init ( GObject *object ) GDK_ENTER_NOTIFY_MASK | GDK_POINTER_MOTION_MASK); - /* - gtk_drag_dest_set(GTK_WIDGET(viewer), 0, drop_targets, G_N_ELEMENTS(drop_targets), + + gtk_drag_dest_set(GTK_WIDGET(viewer), GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_MOVE | GDK_ACTION_PRIVATE); - */ + gtk_drag_dest_add_uri_targets (GTK_WIDGET(viewer)); } /** @@ -369,6 +378,13 @@ rstto_image_viewer_class_init(RsttoImageViewerClass *viewer_class) NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + g_signal_new ("files-dnd", G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); } /** @@ -2476,3 +2492,26 @@ rstto_popup_menu ( } return FALSE; } + +static void +cb_rstto_image_viewer_dnd (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, + guint info, guint time_, RsttoImageViewer *viewer) +{ + g_return_if_fail ( RSTTO_IS_IMAGE_VIEWER(viewer) ); + + if ((data->length >= 0) && (data->format == 8)) + { + gchar **uris; + + uris = g_uri_list_extract_uris ((const gchar*)data->data); + + g_signal_emit_by_name(viewer, "files-dnd", uris); + + gtk_drag_finish (context, TRUE, FALSE, time_); + g_strfreev(uris); + } + else + { + gtk_drag_finish (context, FALSE, FALSE, time_); + } +} diff --git a/src/main_window.c b/src/main_window.c index 933c58b..9f1b00c 100644 --- a/src/main_window.c +++ b/src/main_window.c @@ -192,6 +192,8 @@ static void cb_rstto_main_window_save_copy (GtkWidget *widget, RsttoMainWindow *window); static void cb_rstto_main_window_delete (GtkWidget *widget, RsttoMainWindow *window); +static void +cb_rstto_main_window_dnd_files (GtkWidget *widget, gchar **uris, RsttoMainWindow *window); static void cb_rstto_main_window_set_as_wallpaper (GtkWidget *widget, RsttoMainWindow *window); @@ -707,6 +709,7 @@ rstto_main_window_init (RsttoMainWindow *window) g_signal_connect(G_OBJECT(window->priv->image_list_toolbar), "button-press-event", G_CALLBACK(cb_rstto_main_window_navigationtoolbar_button_press_event), window); g_signal_connect(G_OBJECT(window->priv->thumbnailbar), "button-press-event", G_CALLBACK(cb_rstto_main_window_navigationtoolbar_button_press_event), window); g_signal_connect(G_OBJECT(window->priv->image_viewer), "size-ready", G_CALLBACK(cb_rstto_main_window_update_statusbar), window); + g_signal_connect(G_OBJECT(window->priv->image_viewer), "files-dnd", G_CALLBACK(cb_rstto_main_window_dnd_files), window); if ( TRUE == rstto_settings_get_boolean_property (window->priv->settings_manager, "merge-toolbars")) { @@ -3006,6 +3009,27 @@ cb_rstto_main_window_delete ( g_object_unref (file); } +static void +cb_rstto_main_window_dnd_files (GtkWidget *widget, gchar **uris, RsttoMainWindow *window) +{ + RsttoFile *file; + guint n; + + for(n = 0; n < g_strv_length (uris); n++) + { + file = rstto_file_new (g_file_new_for_uri (uris[n])); + + if (g_str_has_prefix (rstto_file_get_content_type (file), "image")) + { + rstto_image_list_add_file(window->priv->image_list, file, NULL); + } + } + if(file) + { + rstto_image_list_iter_find_file (window->priv->iter, file ); + } +} + /**********************/ /* PRINTING CALLBACKS */ /**********************/ -- 1.7.5.4