X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-sidebar-attachments.c;h=5d2beff317e1ab722450284b9654eeca99f03846;hb=217797d63b2d3b1c9a7a0511af1bbf3d99f0d482;hp=aac63cf7a5158fd3f67d73ad9b2f4a1ac79cd770;hpb=29efb6155a64a2ada423861ace5637a49a2732b0;p=evince.git diff --git a/shell/ev-sidebar-attachments.c b/shell/ev-sidebar-attachments.c index aac63cf7..5d2beff3 100644 --- a/shell/ev-sidebar-attachments.c +++ b/shell/ev-sidebar-attachments.c @@ -29,8 +29,8 @@ #include #include #include -#include +#include "ev-file-helpers.h" #include "ev-sidebar-attachments.h" #include "ev-sidebar-page.h" @@ -42,7 +42,6 @@ enum { N_COLS }; - enum { PROP_0, PROP_WIDGET, @@ -83,8 +82,8 @@ G_DEFINE_TYPE_EXTENDED (EvSidebarAttachments, /* Icon cache */ static void ev_sidebar_attachments_icon_cache_add (EvSidebarAttachments *ev_attachbar, - const gchar *mime_type, - const GdkPixbuf *pixbuf) + const gchar *mime_type, + const GdkPixbuf *pixbuf) { g_assert (mime_type != NULL); g_assert (GDK_IS_PIXBUF (pixbuf)); @@ -99,26 +98,34 @@ static GdkPixbuf * icon_theme_get_pixbuf_from_mime_type (GtkIconTheme *icon_theme, const gchar *mime_type) { - GdkPixbuf *pixbuf = NULL; - gchar *icon; - - icon = gnome_icon_lookup (icon_theme, - NULL, NULL, - NULL, NULL, - mime_type, - GNOME_ICON_LOOKUP_FLAGS_NONE, - NULL); - - pixbuf = gtk_icon_theme_load_icon (icon_theme, - icon, 48, 0, NULL); - g_free (icon); - + const char *separator; + GString *icon_name; + GdkPixbuf *pixbuf; + + separator = strchr (mime_type, '/'); + if (!separator) + return NULL; /* maybe we should return a GError with "invalid MIME-type" */ + + icon_name = g_string_new ("gnome-mime-"); + g_string_append_len (icon_name, mime_type, separator - mime_type); + g_string_append_c (icon_name, '-'); + g_string_append (icon_name, separator + 1); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, 48, 0, NULL); + g_string_free (icon_name, TRUE); + if (pixbuf) + return pixbuf; + + icon_name = g_string_new ("gnome-mime-"); + g_string_append_len (icon_name, mime_type, separator - mime_type); + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name->str, 48, 0, NULL); + g_string_free (icon_name, TRUE); + return pixbuf; } static GdkPixbuf * ev_sidebar_attachments_icon_cache_get (EvSidebarAttachments *ev_attachbar, - const gchar *mime_type) + const gchar *mime_type) { GdkPixbuf *pixbuf = NULL; @@ -135,15 +142,15 @@ ev_sidebar_attachments_icon_cache_get (EvSidebarAttachments *ev_attachbar, if (GDK_IS_PIXBUF (pixbuf)) ev_sidebar_attachments_icon_cache_add (ev_attachbar, - mime_type, - pixbuf); + mime_type, + pixbuf); return pixbuf; } static gboolean -icon_cache_update_icon (gchar *key, - GdkPixbuf *value, +icon_cache_update_icon (gchar *key, + GdkPixbuf *value, EvSidebarAttachments *ev_attachbar) { GdkPixbuf *pixbuf = NULL; @@ -152,8 +159,8 @@ icon_cache_update_icon (gchar *key, key); ev_sidebar_attachments_icon_cache_add (ev_attachbar, - key, - pixbuf); + key, + pixbuf); return FALSE; } @@ -168,8 +175,8 @@ ev_sidebar_attachments_icon_cache_refresh (EvSidebarAttachments *ev_attachbar) static EvAttachment * ev_sidebar_attachments_get_attachment_at_pos (EvSidebarAttachments *ev_attachbar, - gint x, - gint y) + gint x, + gint y) { GtkTreePath *path = NULL; GtkTreeIter iter; @@ -197,8 +204,8 @@ ev_sidebar_attachments_get_attachment_at_pos (EvSidebarAttachments *ev_attachbar static gboolean ev_sidebar_attachments_popup_menu_show (EvSidebarAttachments *ev_attachbar, - gint x, - gint y) + gint x, + gint y) { GtkIconView *icon_view; GtkTreePath *path; @@ -254,7 +261,7 @@ static gboolean ev_sidebar_attachments_popup_menu (GtkWidget *widget) { EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (widget); - gint x, y; + gint x, y; gtk_widget_get_pointer (widget, &x, &y); @@ -263,8 +270,8 @@ ev_sidebar_attachments_popup_menu (GtkWidget *widget) static gboolean ev_sidebar_attachments_button_press (EvSidebarAttachments *ev_attachbar, - GdkEventButton *event, - GtkWidget *icon_view) + GdkEventButton *event, + GtkWidget *icon_view) { if (!GTK_WIDGET_HAS_FOCUS (icon_view)) { gtk_widget_grab_focus (icon_view); @@ -274,31 +281,31 @@ ev_sidebar_attachments_button_press (EvSidebarAttachments *ev_attachbar, return FALSE; switch (event->button) { - case 1: - if (event->type == GDK_2BUTTON_PRESS) { - GError *error = NULL; - EvAttachment *attachment; - - attachment = ev_sidebar_attachments_get_attachment_at_pos (ev_attachbar, - event->x, - event->y); - if (!attachment) - return FALSE; - - ev_attachment_open (attachment, &error); - - if (error) { - g_warning (error->message); - g_error_free (error); + case 1: + if (event->type == GDK_2BUTTON_PRESS) { + GError *error = NULL; + EvAttachment *attachment; + + attachment = ev_sidebar_attachments_get_attachment_at_pos (ev_attachbar, + event->x, + event->y); + if (!attachment) + return FALSE; + + ev_attachment_open (attachment, &error); + + if (error) { + g_warning (error->message); + g_error_free (error); + } + + g_object_unref (attachment); + + return TRUE; } - - g_object_unref (attachment); - - return TRUE; - } - break; - case 3: - return ev_sidebar_attachments_popup_menu_show (ev_attachbar, event->x, event->y); + break; + case 3: + return ev_sidebar_attachments_popup_menu_show (ev_attachbar, event->x, event->y); } return FALSE; @@ -306,7 +313,7 @@ ev_sidebar_attachments_button_press (EvSidebarAttachments *ev_attachbar, static void ev_sidebar_attachments_update_icons (EvSidebarAttachments *ev_attachbar, - gpointer user_data) + gpointer user_data) { GtkTreeIter iter; gboolean valid; @@ -332,7 +339,7 @@ ev_sidebar_attachments_update_icons (EvSidebarAttachments *ev_attachbar, g_object_unref (attachment); pixbuf = ev_sidebar_attachments_icon_cache_get (ev_attachbar, - mime_type); + mime_type); gtk_list_store_set (ev_attachbar->priv->model, &iter, COLUMN_ICON, pixbuf, @@ -344,18 +351,50 @@ ev_sidebar_attachments_update_icons (EvSidebarAttachments *ev_attachbar, } } +static void +ev_sidebar_attachments_screen_changed (GtkWidget *widget, + GdkScreen *old_screen) +{ + EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (widget); + GdkScreen *screen; + + if (!ev_attachbar->priv->icon_theme) + return; + + screen = gtk_widget_get_screen (widget); + if (screen == old_screen) + return; + + if (old_screen) { + g_signal_handlers_disconnect_by_func ( + gtk_icon_theme_get_for_screen (old_screen), + G_CALLBACK (ev_sidebar_attachments_update_icons), + ev_attachbar); + } + + ev_attachbar->priv->icon_theme = gtk_icon_theme_get_for_screen (screen); + g_signal_connect_swapped (ev_attachbar->priv->icon_theme, + "changed", + G_CALLBACK (ev_sidebar_attachments_update_icons), + (gpointer) ev_attachbar); + + if (GTK_WIDGET_CLASS (ev_sidebar_attachments_parent_class)->screen_changed) { + GTK_WIDGET_CLASS (ev_sidebar_attachments_parent_class)->screen_changed (widget, old_screen); + } +} + static void ev_sidebar_attachments_drag_data_get (GtkWidget *widget, - GdkDragContext *drag_context, - GtkSelectionData *data, - guint info, - guint time, - gpointer user_data) + GdkDragContext *drag_context, + GtkSelectionData *data, + guint info, + guint time, + gpointer user_data) { EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (user_data); - GString *uri_list; - gchar *uris = NULL; - GList *selected = NULL, *l; + GString *uri_list; + gchar *uris = NULL; + GList *selected = NULL, *l; selected = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (ev_attachbar->priv->icon_view)); if (!selected) @@ -378,7 +417,7 @@ ev_sidebar_attachments_drag_data_get (GtkWidget *widget, COLUMN_ATTACHMENT, &attachment, -1); - filename = g_build_filename (g_get_tmp_dir (), + filename = g_build_filename (ev_tmp_dir (), ev_attachment_get_name (attachment), NULL); @@ -422,14 +461,13 @@ ev_sidebar_attachments_get_property (GObject *object, ev_sidebar_attachments = EV_SIDEBAR_ATTACHMENTS (object); - switch (prop_id) - { - case PROP_WIDGET: - g_value_set_object (value, ev_sidebar_attachments->priv->icon_view); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + switch (prop_id) { + case PROP_WIDGET: + g_value_set_object (value, ev_sidebar_attachments->priv->icon_view); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } @@ -438,6 +476,14 @@ ev_sidebar_attachments_destroy (GtkObject *object) { EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (object); + if (ev_attachbar->priv->icon_theme) { + g_signal_handlers_disconnect_by_func ( + ev_attachbar->priv->icon_theme, + G_CALLBACK (ev_sidebar_attachments_update_icons), + ev_attachbar); + ev_attachbar->priv->icon_theme = NULL; + } + if (ev_attachbar->priv->model) { g_object_unref (ev_attachbar->priv->model); ev_attachbar->priv->model = NULL; @@ -465,6 +511,7 @@ ev_sidebar_attachments_class_init (EvSidebarAttachmentsClass *ev_attachbar_class g_object_class->get_property = ev_sidebar_attachments_get_property; gtk_object_class->destroy = ev_sidebar_attachments_destroy; gtk_widget_class->popup_menu = ev_sidebar_attachments_popup_menu; + gtk_widget_class->screen_changed = ev_sidebar_attachments_screen_changed; g_type_class_add_private (g_object_class, sizeof (EvSidebarAttachmentsPrivate)); @@ -521,18 +568,13 @@ ev_sidebar_attachments_init (EvSidebarAttachments *ev_attachbar) gtk_container_add (GTK_CONTAINER (swindow), ev_attachbar->priv->icon_view); - gtk_widget_show (ev_attachbar->priv->icon_view); gtk_container_add (GTK_CONTAINER (ev_attachbar), swindow); - gtk_widget_show (swindow); + gtk_widget_show_all (GTK_WIDGET (ev_attachbar)); /* Icon Theme */ - ev_attachbar->priv->icon_theme = gtk_icon_theme_get_default (); - g_signal_connect_swapped (G_OBJECT (ev_attachbar->priv->icon_theme), - "changed", - G_CALLBACK (ev_sidebar_attachments_update_icons), - (gpointer) ev_attachbar); + ev_attachbar->priv->icon_theme = NULL; /* Icon Cache */ ev_attachbar->priv->icon_cache = g_hash_table_new_full (g_str_hash, @@ -541,14 +583,13 @@ ev_sidebar_attachments_init (EvSidebarAttachments *ev_attachbar) g_object_unref); /* Drag and Drop */ -#ifdef HAVE_GTK_ICON_VIEW_ENABLE_MODEL_DRAG_SOURCE 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), - GDK_ACTION_COPY); -#endif + GDK_BUTTON1_MASK, + drag_targets, + G_N_ELEMENTS (drag_targets), + GDK_ACTION_COPY); + g_signal_connect (G_OBJECT (ev_attachbar->priv->icon_view), "drag-data-get", G_CALLBACK (ev_sidebar_attachments_drag_data_get), @@ -576,6 +617,17 @@ ev_sidebar_attachments_set_document (EvSidebarPage *page, if (!ev_document_has_attachments (document)) return; + if (!ev_attachbar->priv->icon_theme) { + GdkScreen *screen; + + 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), + "changed", + G_CALLBACK (ev_sidebar_attachments_update_icons), + (gpointer) ev_attachbar); + } + attachments = ev_document_get_attachments (document); gtk_list_store_clear (ev_attachbar->priv->model); @@ -590,7 +642,7 @@ ev_sidebar_attachments_set_document (EvSidebarPage *page, mime_type = ev_attachment_get_mime_type (attachment); pixbuf = ev_sidebar_attachments_icon_cache_get (ev_attachbar, - mime_type); + mime_type); gtk_list_store_append (ev_attachbar->priv->model, &iter); gtk_list_store_set (ev_attachbar->priv->model, &iter, @@ -607,7 +659,7 @@ ev_sidebar_attachments_set_document (EvSidebarPage *page, static gboolean ev_sidebar_attachments_support_document (EvSidebarPage *sidebar_page, - EvDocument *document) + EvDocument *document) { return ev_document_has_attachments (document); } @@ -615,7 +667,7 @@ ev_sidebar_attachments_support_document (EvSidebarPage *sidebar_page, static const gchar* ev_sidebar_attachments_get_label (EvSidebarPage *sidebar_page) { - return _("Attachments"); + return _("Attachments"); } static void