]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-attachments.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / shell / ev-sidebar-attachments.c
index fa64fbce9561b4835e0c7a4bd9036903953dca8c..5b717896ac1a913732a58c6dcaaa8d3040ca4e81 100644 (file)
@@ -18,7 +18,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -31,6 +31,7 @@
 #include <glib/gstdio.h>
 #include <gtk/gtk.h>
 
+#include "ev-document-attachments.h"
 #include "ev-jobs.h"
 #include "ev-job-scheduler.h"
 #include "ev-file-helpers.h"
@@ -55,10 +56,6 @@ enum {
        N_SIGNALS
 };
 
-static const GtkTargetEntry drag_targets[] = {
-       { "text/uri-list", 0, 0 }
-};
-
 static guint signals[N_SIGNALS];
 
 struct _EvSidebarAttachmentsPrivate {
@@ -70,7 +67,7 @@ struct _EvSidebarAttachmentsPrivate {
        GHashTable     *icon_cache;
 };
 
-static void ev_sidebar_attachments_page_iface_init (EvSidebarPageIface *iface);
+static void ev_sidebar_attachments_page_iface_init (EvSidebarPageInterface *iface);
 
 G_DEFINE_TYPE_EXTENDED (EvSidebarAttachments,
                         ev_sidebar_attachments,
@@ -276,7 +273,7 @@ ev_sidebar_attachments_button_press (EvSidebarAttachments *ev_attachbar,
                                     GdkEventButton       *event,
                                     GtkWidget            *icon_view)
 {
-       if (!GTK_WIDGET_HAS_FOCUS (icon_view)) {
+       if (!gtk_widget_has_focus (icon_view)) {
                gtk_widget_grab_focus (icon_view);
        }
        
@@ -295,7 +292,10 @@ ev_sidebar_attachments_button_press (EvSidebarAttachments *ev_attachbar,
                                if (!attachment)
                                        return FALSE;
                                
-                               ev_attachment_open (attachment, &error);
+                               ev_attachment_open (attachment,
+                                                   gtk_widget_get_screen (GTK_WIDGET (ev_attachbar)),
+                                                   event->time,
+                                                   &error);
                                
                                if (error) {
                                        g_warning ("%s", error->message);
@@ -395,22 +395,22 @@ ev_sidebar_attachments_drag_data_get (GtkWidget        *widget,
                                      gpointer          user_data)
 {
        EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (user_data);
-       GString              *uri_list;
-       gchar                *uris = NULL;
        GList                *selected = NULL, *l;
+        GPtrArray            *uris;
+        char                **uri_list;
 
        selected = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (ev_attachbar->priv->icon_view));
        if (!selected)
                return;
 
-       uri_list = g_string_new (NULL);
+        uris = g_ptr_array_new ();
        
        for (l = selected; l && l->data; l = g_list_next (l)) {
                EvAttachment *attachment;
                GtkTreePath  *path;
                GtkTreeIter   iter;
                GFile        *file;
-               gchar        *filename;
+               gchar        *template;
                GError       *error = NULL;
                
                path = (GtkTreePath *) l->data;
@@ -421,19 +421,16 @@ ev_sidebar_attachments_drag_data_get (GtkWidget        *widget,
                                    COLUMN_ATTACHMENT, &attachment,
                                    -1);
 
-               filename = g_build_filename (ev_tmp_dir (),
-                                            ev_attachment_get_name (attachment),
-                                            NULL);
-               file = g_file_new_for_path (filename);
-               g_free (filename);
+                /* FIXMEchpe: convert to filename encoding first! */
+                template = g_strdup_printf ("%s.XXXXXX", ev_attachment_get_name (attachment));
+                file = ev_mkstemp_file (template, &error);
+                g_free (template);
                
-               if (ev_attachment_save (attachment, file, &error)) {
+               if (file != NULL && ev_attachment_save (attachment, file, &error)) {
                        gchar *uri;
 
                        uri = g_file_get_uri (file);
-                       g_string_append (uri_list, uri);
-                       g_string_append_c (uri_list, '\n');
-                       g_free (uri);
+                        g_ptr_array_add (uris, uri);
                }
        
                if (error) {
@@ -446,15 +443,10 @@ ev_sidebar_attachments_drag_data_get (GtkWidget        *widget,
                g_object_unref (attachment);
        }
 
-       uris = g_string_free (uri_list, FALSE);
-
-       if (uris) {
-               gtk_selection_data_set (data,
-                                       data->target,
-                                       8,
-                                       (guchar *)uris,
-                                       strlen (uris));
-       }
+        g_ptr_array_add (uris, NULL); /* NULL-terminate */
+        uri_list = (char **) g_ptr_array_free (uris, FALSE);
+        gtk_selection_data_set_uris (data, uri_list);
+        g_strfreev (uri_list);
 
        g_list_free (selected);
 }
@@ -480,7 +472,7 @@ ev_sidebar_attachments_get_property (GObject    *object,
 }
 
 static void
-ev_sidebar_attachments_destroy (GtkObject *object)
+ev_sidebar_attachments_dispose (GObject *object)
 {
        EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (object);
 
@@ -502,22 +494,20 @@ ev_sidebar_attachments_destroy (GtkObject *object)
                ev_attachbar->priv->icon_cache = NULL;
        }
 
-       (* GTK_OBJECT_CLASS (ev_sidebar_attachments_parent_class)->destroy) (object);
+       G_OBJECT_CLASS (ev_sidebar_attachments_parent_class)->dispose (object);
 }
 
 static void
 ev_sidebar_attachments_class_init (EvSidebarAttachmentsClass *ev_attachbar_class)
 {
        GObjectClass   *g_object_class;
-       GtkObjectClass *gtk_object_class;
        GtkWidgetClass *gtk_widget_class;
 
        g_object_class = G_OBJECT_CLASS (ev_attachbar_class);
-       gtk_object_class = GTK_OBJECT_CLASS (ev_attachbar_class);
        gtk_widget_class = GTK_WIDGET_CLASS (ev_attachbar_class);
 
        g_object_class->get_property = ev_sidebar_attachments_get_property;
-       gtk_object_class->destroy = ev_sidebar_attachments_destroy;
+       g_object_class->dispose = ev_sidebar_attachments_dispose;
        gtk_widget_class->popup_menu = ev_sidebar_attachments_popup_menu;
        gtk_widget_class->screen_changed = ev_sidebar_attachments_screen_changed;
 
@@ -569,7 +559,7 @@ ev_sidebar_attachments_init (EvSidebarAttachments *ev_attachbar)
                      "text-column", COLUMN_NAME,
                      "pixbuf-column", COLUMN_ICON,
                      NULL);
-       g_signal_connect_swapped (G_OBJECT (ev_attachbar->priv->icon_view),
+       g_signal_connect_swapped (ev_attachbar->priv->icon_view,
                                  "button-press-event",
                                  G_CALLBACK (ev_sidebar_attachments_button_press),
                                  (gpointer) ev_attachbar);
@@ -594,11 +584,11 @@ ev_sidebar_attachments_init (EvSidebarAttachments *ev_attachbar)
        gtk_icon_view_enable_model_drag_source (
                GTK_ICON_VIEW (ev_attachbar->priv->icon_view),
                GDK_BUTTON1_MASK,
-               drag_targets,
-               G_N_ELEMENTS (drag_targets),
+               NULL, 0,
                GDK_ACTION_COPY);
+        gtk_drag_source_add_uri_targets (ev_attachbar->priv->icon_view);
 
-       g_signal_connect (G_OBJECT (ev_attachbar->priv->icon_view),
+       g_signal_connect (ev_attachbar->priv->icon_view,
                          "drag-data-get",
                          G_CALLBACK (ev_sidebar_attachments_drag_data_get),
                          (gpointer) ev_attachbar);     
@@ -643,14 +633,19 @@ job_finished_callback (EvJobAttachments     *job,
        g_object_unref (job);
 }
 
+
 static void
-ev_sidebar_attachments_set_document (EvSidebarPage   *page,
-                                    EvDocument      *document)
+ev_sidebar_attachments_document_changed_cb (EvDocumentModel      *model,
+                                           GParamSpec           *pspec,
+                                           EvSidebarAttachments *ev_attachbar)
 {
-       EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (page);
+       EvDocument *document = ev_document_model_get_document (model);
        EvJob *job;
-       
-       if (!ev_document_has_attachments (document))
+
+       if (!EV_IS_DOCUMENT_ATTACHMENTS (document))
+               return;
+
+       if (!ev_document_attachments_has_attachments (EV_DOCUMENT_ATTACHMENTS (document)))
                return;
 
        if (!ev_attachbar->priv->icon_theme) {
@@ -658,7 +653,7 @@ ev_sidebar_attachments_set_document (EvSidebarPage   *page,
 
                screen = gtk_widget_get_screen (GTK_WIDGET (ev_attachbar));
                ev_attachbar->priv->icon_theme = gtk_icon_theme_get_for_screen (screen);
-               g_signal_connect_swapped (G_OBJECT (ev_attachbar->priv->icon_theme),
+               g_signal_connect_swapped (ev_attachbar->priv->icon_theme,
                                          "changed",
                                          G_CALLBACK (ev_sidebar_attachments_update_icons),
                                          (gpointer) ev_attachbar);
@@ -677,11 +672,21 @@ ev_sidebar_attachments_set_document (EvSidebarPage   *page,
        ev_job_scheduler_push_job (job, EV_JOB_PRIORITY_NONE);
 }
 
+static void
+ev_sidebar_attachments_set_model (EvSidebarPage   *page,
+                                 EvDocumentModel *model)
+{
+       g_signal_connect (model, "notify::document",
+                         G_CALLBACK (ev_sidebar_attachments_document_changed_cb),
+                         page);
+}
+
 static gboolean
 ev_sidebar_attachments_support_document (EvSidebarPage   *sidebar_page,
                                         EvDocument      *document)
 {
-       return ev_document_has_attachments (document);
+       return (EV_IS_DOCUMENT_ATTACHMENTS (document) &&
+               ev_document_attachments_has_attachments (EV_DOCUMENT_ATTACHMENTS (document)));
 }
 
 static const gchar*
@@ -691,10 +696,10 @@ ev_sidebar_attachments_get_label (EvSidebarPage *sidebar_page)
 }
 
 static void
-ev_sidebar_attachments_page_iface_init (EvSidebarPageIface *iface)
+ev_sidebar_attachments_page_iface_init (EvSidebarPageInterface *iface)
 {
        iface->support_document = ev_sidebar_attachments_support_document;
-       iface->set_document = ev_sidebar_attachments_set_document;
+       iface->set_model = ev_sidebar_attachments_set_model;
        iface->get_label = ev_sidebar_attachments_get_label;
 }