From bc1405c9f54e19e74f973581130229ef1053ff9c Mon Sep 17 00:00:00 2001 From: Cosimo Cecchi Date: Fri, 2 Aug 2013 14:37:13 +0200 Subject: Support HiDpi icons Port the rendering of icons to cairo surfaces, so that we can apply the GDK scale factor when rendering icons. origin commit: https://gitlab.gnome.org/GNOME/nautilus/commit/0d4555d7 --- src/caja-autorun-software.c | 3 ++- src/caja-desktop-window.c | 3 ++- src/caja-emblem-sidebar.c | 11 ++++++---- src/caja-file-management-properties.c | 5 +++-- src/caja-navigation-window.c | 3 ++- src/caja-notes-viewer.c | 4 +++- src/caja-pathbar.c | 23 ++++++++++++++------ src/caja-places-sidebar.c | 9 +++++--- src/caja-property-browser.c | 8 +++++-- src/caja-sidebar-title.c | 5 ++++- src/caja-spatial-window.c | 6 +++++- src/caja-window-menus.c | 2 +- src/caja-window-toolbars.c | 2 +- src/caja-x-content-bar.c | 5 +++-- src/file-manager/fm-desktop-icon-view.c | 7 +++--- src/file-manager/fm-directory-view.c | 32 ++++++++++++++++----------- src/file-manager/fm-icon-container.c | 5 ++++- src/file-manager/fm-list-model.c | 38 ++++++++++++++++++++++++++++----- src/file-manager/fm-list-view.c | 14 ++++++++++-- src/file-manager/fm-properties-window.c | 23 ++++++++++++++------ src/file-manager/fm-tree-model.c | 10 +++++---- 21 files changed, 155 insertions(+), 63 deletions(-) (limited to 'src') diff --git a/src/caja-autorun-software.c b/src/caja-autorun-software.c index 8bd4514d..4e24fa80 100644 --- a/src/caja-autorun-software.c +++ b/src/caja-autorun-software.c @@ -230,7 +230,8 @@ present_autorun_for_software_dialog (GMount *mount) icon = g_mount_get_icon (mount); icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_DIALOG); - icon_info = caja_icon_info_lookup (icon, icon_size); + icon_info = caja_icon_info_lookup (icon, icon_size, + gtk_widget_get_scale_factor (GTK_WIDGET (dialog))); pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size); image = gtk_image_new_from_pixbuf (pixbuf); gtk_widget_set_halign (image, GTK_ALIGN_CENTER); diff --git a/src/caja-desktop-window.c b/src/caja-desktop-window.c index aae03b5e..2aa0c2f5 100644 --- a/src/caja-desktop-window.c +++ b/src/caja-desktop-window.c @@ -268,7 +268,8 @@ static CajaIconInfo * real_get_icon (CajaWindow *window, CajaWindowSlot *slot) { - return caja_icon_info_lookup_from_name (CAJA_ICON_DESKTOP, 48); + gint scale = gtk_widget_get_scale_factor (GTK_WIDGET (window)); + return caja_icon_info_lookup_from_name (CAJA_ICON_DESKTOP, 48, scale); } static void diff --git a/src/caja-emblem-sidebar.c b/src/caja-emblem-sidebar.c index 6bb0d815..ae8fcfee 100644 --- a/src/caja-emblem-sidebar.c +++ b/src/caja-emblem-sidebar.c @@ -392,14 +392,15 @@ create_emblem_widget_with_pixbuf (CajaEmblemSidebar *emblem_sidebar, { GtkWidget *image, *event_box; GdkPixbuf *prelight_pixbuf; - + gint scale; image = eel_labeled_image_new (display_name, pixbuf); + scale = gtk_widget_get_scale_factor (image); eel_labeled_image_set_fixed_image_height (EEL_LABELED_IMAGE (image), - STANDARD_EMBLEM_HEIGHT); + STANDARD_EMBLEM_HEIGHT * scale); eel_labeled_image_set_spacing (EEL_LABELED_IMAGE (image), - EMBLEM_LABEL_SPACING); + EMBLEM_LABEL_SPACING * scale); event_box = gtk_event_box_new (); gtk_container_add (GTK_CONTAINER (event_box), image); @@ -455,8 +456,10 @@ create_emblem_widget (CajaEmblemSidebar *emblem_sidebar, char *keyword; GdkPixbuf *pixbuf; CajaIconInfo *info; + gint scale; - info = caja_icon_info_lookup_from_name (name, CAJA_ICON_SIZE_STANDARD); + scale = gtk_widget_get_scale_factor (GTK_WIDGET (emblem_sidebar->details->emblems_table)); + info = caja_icon_info_lookup_from_name (name, CAJA_ICON_SIZE_STANDARD, scale); pixbuf = caja_icon_info_get_pixbuf_at_size (info, CAJA_ICON_SIZE_STANDARD); diff --git a/src/caja-file-management-properties.c b/src/caja-file-management-properties.c index 7800c7a4..dc687688 100644 --- a/src/caja-file-management-properties.c +++ b/src/caja-file-management-properties.c @@ -735,7 +735,7 @@ caja_file_management_properties_dialog_setup_media_page (GtkBuilder *builder) GIcon *icon; CajaIconInfo *icon_info; GdkPixbuf *pixbuf; - int icon_size; + int icon_size, icon_scale; if (!g_str_has_prefix (content_type, "x-content/")) continue; @@ -748,13 +748,14 @@ caja_file_management_properties_dialog_setup_media_page (GtkBuilder *builder) } icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); + icon_scale = gtk_widget_get_scale_factor (other_type_combo_box); description = g_content_type_get_description (content_type); gtk_list_store_append (other_type_list_store, &iter); icon = g_content_type_get_icon (content_type); if (icon != NULL) { - icon_info = caja_icon_info_lookup (icon, icon_size); + icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale); g_object_unref (icon); pixbuf = caja_icon_info_get_pixbuf_nodefault_at_size (icon_info, icon_size); g_object_unref (icon_info); diff --git a/src/caja-navigation-window.c b/src/caja-navigation-window.c index 08a7704b..531c9ae0 100644 --- a/src/caja-navigation-window.c +++ b/src/caja-navigation-window.c @@ -756,7 +756,8 @@ static CajaIconInfo * real_get_icon (CajaWindow *window, CajaWindowSlot *slot) { - return caja_file_get_icon (slot->viewed_file, 48, + return caja_file_get_icon (slot->viewed_file, + 48, gtk_widget_get_scale_factor (GTK_WIDGET (window)), CAJA_FILE_ICON_FLAGS_IGNORE_VISITING | CAJA_FILE_ICON_FLAGS_USE_MOUNT_ICON); } diff --git a/src/caja-notes-viewer.c b/src/caja-notes-viewer.c index b479cc56..46ffdeae 100644 --- a/src/caja-notes-viewer.c +++ b/src/caja-notes-viewer.c @@ -324,13 +324,15 @@ caja_notes_viewer_init (CajaNotesViewer *sidebar) { CajaNotesViewerDetails *details; CajaIconInfo *info; + gint scale; details = g_new0 (CajaNotesViewerDetails, 1); sidebar->details = details; details->uri = g_strdup (""); - info = caja_icon_info_lookup_from_name ("emblem-note", 16); + scale = gdk_window_get_scale_factor (gdk_get_default_root_window ()); + info = caja_icon_info_lookup_from_name ("emblem-note", 16, scale); details->icon = caja_icon_info_get_pixbuf (info); /* create the text container */ diff --git a/src/caja-pathbar.c b/src/caja-pathbar.c index 863e0623..533f2f7f 100644 --- a/src/caja-pathbar.c +++ b/src/caja-pathbar.c @@ -206,8 +206,10 @@ trash_state_changed_cb (CajaTrashMonitor *monitor, { GFile *file; GList *list; + gint scale; file = g_file_new_for_uri ("trash:///"); + scale = gtk_widget_get_scale_factor (GTK_WIDGET (path_bar)); for (list = path_bar->button_list; list; list = list->next) { ButtonData *button_data; @@ -219,7 +221,7 @@ trash_state_changed_cb (CajaTrashMonitor *monitor, GdkPixbuf *pixbuf; icon = caja_trash_monitor_get_icon (); - icon_info = caja_icon_info_lookup (icon, CAJA_PATH_BAR_ICON_SIZE); + icon_info = caja_icon_info_lookup (icon, CAJA_PATH_BAR_ICON_SIZE, scale); pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, CAJA_PATH_BAR_ICON_SIZE); gtk_image_set_from_pixbuf (GTK_IMAGE (button_data->image), pixbuf); } @@ -1339,25 +1341,30 @@ button_clicked_cb (GtkWidget *button, static CajaIconInfo * get_type_icon_info (ButtonData *button_data) { + gint icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (button_data->button)); + switch (button_data->type) { case ROOT_BUTTON: return caja_icon_info_lookup_from_name (CAJA_ICON_FILESYSTEM, - CAJA_PATH_BAR_ICON_SIZE); + CAJA_PATH_BAR_ICON_SIZE, + icon_scale); case HOME_BUTTON: return caja_icon_info_lookup_from_name (CAJA_ICON_HOME, - CAJA_PATH_BAR_ICON_SIZE); + CAJA_PATH_BAR_ICON_SIZE, + icon_scale); case DESKTOP_BUTTON: return caja_icon_info_lookup_from_name (CAJA_ICON_DESKTOP, - CAJA_PATH_BAR_ICON_SIZE); + CAJA_PATH_BAR_ICON_SIZE, + icon_scale); case NORMAL_BUTTON: if (button_data->is_base_dir) { return caja_file_get_icon (button_data->file, - CAJA_PATH_BAR_ICON_SIZE, + CAJA_PATH_BAR_ICON_SIZE, icon_scale, CAJA_FILE_ICON_FLAGS_NONE); } @@ -1529,10 +1536,12 @@ setup_file_path_mounted_mount (GFile *location, ButtonData *button_data) GIcon *icon; CajaIconInfo *info; GFile *root, *default_location; + gint scale; result = FALSE; volume_monitor = g_volume_monitor_get (); mounts = g_volume_monitor_get_mounts (volume_monitor); + scale = gtk_widget_get_scale_factor (GTK_WIDGET (button_data->button)); for (l = mounts; l != NULL; l = l->next) { mount = l->data; @@ -1556,7 +1565,7 @@ setup_file_path_mounted_mount (GFile *location, ButtonData *button_data) { icon = g_themed_icon_new (CAJA_ICON_FOLDER); } - info = caja_icon_info_lookup (icon, CAJA_PATH_BAR_ICON_SIZE); + info = caja_icon_info_lookup (icon, CAJA_PATH_BAR_ICON_SIZE, scale); g_object_unref (icon); button_data->custom_icon = caja_icon_info_get_pixbuf_at_size (info, CAJA_PATH_BAR_ICON_SIZE); g_object_unref (info); @@ -1580,7 +1589,7 @@ setup_file_path_mounted_mount (GFile *location, ButtonData *button_data) { icon = g_themed_icon_new (CAJA_ICON_FOLDER); } - info = caja_icon_info_lookup (icon, CAJA_PATH_BAR_ICON_SIZE); + info = caja_icon_info_lookup (icon, CAJA_PATH_BAR_ICON_SIZE, scale); g_object_unref (icon); button_data->custom_icon = caja_icon_info_get_pixbuf_at_size (info, CAJA_PATH_BAR_ICON_SIZE); g_object_unref (info); diff --git a/src/caja-places-sidebar.c b/src/caja-places-sidebar.c index c5566c15..1a475b17 100644 --- a/src/caja-places-sidebar.c +++ b/src/caja-places-sidebar.c @@ -233,11 +233,12 @@ get_eject_icon (gboolean highlighted) { GdkPixbuf *eject; CajaIconInfo *eject_icon_info; - int icon_size; + int icon_size, icon_scale; icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); + icon_scale = gdk_window_get_scale_factor (gdk_get_default_root_window ()); - eject_icon_info = caja_icon_info_lookup_from_name ("media-eject", icon_size); + eject_icon_info = caja_icon_info_lookup_from_name ("media-eject", icon_size, icon_scale); eject = caja_icon_info_get_pixbuf_at_size (eject_icon_info, icon_size); if (highlighted) { @@ -342,6 +343,7 @@ add_place (CajaPlacesSidebar *sidebar, GdkPixbuf *eject; CajaIconInfo *icon_info; int icon_size; + int icon_scale; gboolean show_eject; gboolean show_unmount; gboolean show_eject_button; @@ -349,7 +351,8 @@ add_place (CajaPlacesSidebar *sidebar, check_heading_for_section (sidebar, section_type); icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); - icon_info = caja_icon_info_lookup (icon, icon_size); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (sidebar)); + icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale); pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size); g_object_unref (icon_info); diff --git a/src/caja-property-browser.c b/src/caja-property-browser.c index ca161803..aee03041 100644 --- a/src/caja-property-browser.c +++ b/src/caja-property-browser.c @@ -725,6 +725,7 @@ make_drag_image (CajaPropertyBrowser *property_browser, const char* file_name) char *icon_name; gboolean is_reset; CajaIconInfo *info; + gint icon_scale; if (property_browser->details->category_type == CAJA_PROPERTY_EMBLEM) { @@ -742,7 +743,8 @@ make_drag_image (CajaPropertyBrowser *property_browser, const char* file_name) else { icon_name = caja_emblem_get_icon_name_from_keyword (file_name); - info = caja_icon_info_lookup_from_name (icon_name, CAJA_ICON_SIZE_STANDARD); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (property_browser->details->content_table)); + info = caja_icon_info_lookup_from_name (icon_name, CAJA_ICON_SIZE_STANDARD, icon_scale); pixbuf = caja_icon_info_get_pixbuf_at_size (info, CAJA_ICON_SIZE_STANDARD); g_object_unref (info); g_free (icon_name); @@ -1814,6 +1816,7 @@ make_properties_from_directories (CajaPropertyBrowser *property_browser) guint num_images; char *path; CajaIconInfo *info; + gint icon_scale; g_return_if_fail (CAJA_IS_PROPERTY_BROWSER (property_browser)); g_return_if_fail (EEL_IS_IMAGE_TABLE (property_browser->details->content_table)); @@ -1826,6 +1829,7 @@ make_properties_from_directories (CajaPropertyBrowser *property_browser) property_browser->details->keywords = NULL; icons = caja_emblem_list_available (); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (property_browser->details->content_table)); property_browser->details->has_local = FALSE; l = icons; @@ -1849,7 +1853,7 @@ make_properties_from_directories (CajaPropertyBrowser *property_browser) g_free (object_name); continue; } - info = caja_icon_info_lookup_from_name (icon_name, CAJA_ICON_SIZE_STANDARD); + info = caja_icon_info_lookup_from_name (icon_name, CAJA_ICON_SIZE_STANDARD, icon_scale); object_pixbuf = caja_icon_info_get_pixbuf_at_size (info, CAJA_ICON_SIZE_STANDARD); object_label = g_strdup (caja_icon_info_get_display_name (info)); g_object_unref (info); diff --git a/src/caja-sidebar-title.c b/src/caja-sidebar-title.c index 372e7ee1..3b257230 100644 --- a/src/caja-sidebar-title.c +++ b/src/caja-sidebar-title.c @@ -356,16 +356,18 @@ update_icon (CajaSidebarTitle *sidebar_title) CajaIconInfo *info; char *icon_name; gboolean leave_pixbuf_unchanged; + gint icon_scale; leave_pixbuf_unchanged = FALSE; /* see if the current content view is specifying an icon */ icon_name = get_property_from_component (sidebar_title, "icon_name"); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (sidebar_title)); pixbuf = NULL; if (icon_name != NULL && icon_name[0] != '\0') { - info = caja_icon_info_lookup_from_name (icon_name, CAJA_ICON_SIZE_LARGE); + info = caja_icon_info_lookup_from_name (icon_name, CAJA_ICON_SIZE_LARGE, icon_scale); pixbuf = caja_icon_info_get_pixbuf_at_size (info, CAJA_ICON_SIZE_LARGE); g_object_unref (info); } @@ -376,6 +378,7 @@ update_icon (CajaSidebarTitle *sidebar_title) pixbuf = caja_file_get_icon_pixbuf (sidebar_title->details->file, sidebar_title->details->best_icon_size, TRUE, + icon_scale, CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | CAJA_FILE_ICON_FLAGS_USE_MOUNT_ICON_AS_EMBLEM); } diff --git a/src/caja-spatial-window.c b/src/caja-spatial-window.c index 1e043b07..a9545013 100644 --- a/src/caja-spatial-window.c +++ b/src/caja-spatial-window.c @@ -356,7 +356,8 @@ static CajaIconInfo * real_get_icon (CajaWindow *window, CajaWindowSlot *slot) { - return caja_file_get_icon (slot->viewed_file, 48, + return caja_file_get_icon (slot->viewed_file, + 48, gtk_widget_get_scale_factor (GTK_WIDGET (window)), CAJA_FILE_ICON_FLAGS_IGNORE_VISITING | CAJA_FILE_ICON_FLAGS_USE_MOUNT_ICON); } @@ -581,6 +582,7 @@ got_file_info_for_location_menu_callback (CajaFile *file, pixbuf = caja_file_get_icon_pixbuf (file, caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU), TRUE, + gtk_widget_get_scale_factor (GTK_WIDGET (menu_item)), CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); if (pixbuf != NULL) @@ -785,6 +787,7 @@ location_button_drag_begin_callback (GtkWidget *widget, pixbuf = caja_file_get_icon_pixbuf (slot->viewed_file, get_dnd_icon_size (window), FALSE, + gtk_widget_get_scale_factor (widget), CAJA_FILE_ICON_FLAGS_IGNORE_VISITING | CAJA_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT); gtk_drag_set_icon_pixbuf (context, pixbuf, 0, 0); @@ -862,6 +865,7 @@ caja_spatial_window_set_location_button (CajaSpatialWindow *window, pixbuf = caja_file_get_icon_pixbuf (file, caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU), TRUE, + gtk_widget_get_scale_factor (window->details->location_button), CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); if (pixbuf != NULL) diff --git a/src/caja-window-menus.c b/src/caja-window-menus.c index d425b6d7..890c9dac 100644 --- a/src/caja-window-menus.c +++ b/src/caja-window-menus.c @@ -1051,7 +1051,7 @@ add_extension_menu_items (CajaWindow *window, g_object_get (item, "menu", &menu, NULL); - action = caja_action_from_menu_item (item); + action = caja_action_from_menu_item (item, GTK_WIDGET (window)); gtk_action_group_add_action_with_accel (action_group, action, NULL); path = g_build_path ("/", POPUP_PATH_EXTENSION_ACTIONS, subdirectory, NULL); diff --git a/src/caja-window-toolbars.c b/src/caja-window-toolbars.c index 0ad576fa..1611e16e 100644 --- a/src/caja-window-toolbars.c +++ b/src/caja-window-toolbars.c @@ -181,7 +181,7 @@ caja_navigation_window_load_extension_toolbar_items (CajaNavigationWindow *windo { item = CAJA_MENU_ITEM (l->data); - action = caja_toolbar_action_from_menu_item (item); + action = caja_toolbar_action_from_menu_item (item, GTK_WIDGET (window)); gtk_action_group_add_action (action_group, GTK_ACTION (action)); diff --git a/src/caja-x-content-bar.c b/src/caja-x-content-bar.c index 0e2c916d..e38c75d8 100644 --- a/src/caja-x-content-bar.c +++ b/src/caja-x-content-bar.c @@ -130,10 +130,11 @@ caja_x_content_bar_set_x_content_type (CajaXContentBar *bar, const char *x_conte if (icon != NULL) { GdkPixbuf *pixbuf; - int icon_size; + int icon_size, icon_scale; CajaIconInfo *icon_info; icon_size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_BUTTON); - icon_info = caja_icon_info_lookup (icon, icon_size); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (bar)); + icon_info = caja_icon_info_lookup (icon, icon_size, icon_scale); pixbuf = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size); image = gtk_image_new_from_pixbuf (pixbuf); g_object_unref (pixbuf); diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c index 98a0258e..8cbf0b62 100644 --- a/src/file-manager/fm-desktop-icon-view.c +++ b/src/file-manager/fm-desktop-icon-view.c @@ -120,11 +120,10 @@ icon_container_set_workarea (CajaIconContainer *icon_container, left = right = top = bottom = 0; - screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)); - screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)); - scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen)); - scale = scale ? scale : 1; + + screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; + screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale; for (i = 0; i < n_items; i += 4) { diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index 90697145..46a8fd42 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -4903,18 +4903,20 @@ extension_action_callback (GtkAction *action, } static GdkPixbuf * -get_menu_icon (const char *icon_name) +get_menu_icon (const char *icon_name, + GtkWidget *widget) { CajaIconInfo *info; GdkPixbuf *pixbuf; - int size; + int size, scale; size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); + scale = gtk_widget_get_scale_factor (widget); if (g_path_is_absolute (icon_name)) { - info = caja_icon_info_lookup_from_path (icon_name, size); + info = caja_icon_info_lookup_from_path (icon_name, size, scale); } else { - info = caja_icon_info_lookup_from_name (icon_name, size); + info = caja_icon_info_lookup_from_name (icon_name, size, scale); } pixbuf = caja_icon_info_get_pixbuf_nodefault_at_size (info, size); g_object_unref (info); @@ -4923,15 +4925,17 @@ get_menu_icon (const char *icon_name) } static GdkPixbuf * -get_menu_icon_for_file (CajaFile *file) +get_menu_icon_for_file (CajaFile *file, + GtkWidget *widget) { CajaIconInfo *info; GdkPixbuf *pixbuf; - int size; + int size, scale; size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); + scale = gtk_widget_get_scale_factor (widget); - info = caja_file_get_icon (file, size, 0); + info = caja_file_get_icon (file, size, scale, 0); pixbuf = caja_icon_info_get_pixbuf_nodefault_at_size (info, size); g_object_unref (info); @@ -4962,7 +4966,7 @@ add_extension_action_for_files (FMDirectoryView *view, icon); if (icon != NULL) { - pixbuf = get_menu_icon (icon); + pixbuf = get_menu_icon (icon, GTK_WIDGET (view)); if (pixbuf != NULL) { g_object_set_data_full (G_OBJECT (action), "menu-icon", pixbuf, @@ -5429,7 +5433,7 @@ add_script_to_scripts_menus (FMDirectoryView *directory_view, tip, NULL); - pixbuf = get_menu_icon_for_file (file); + pixbuf = get_menu_icon_for_file (file, GTK_WIDGET (directory_view)); if (pixbuf != NULL) { g_object_set_data_full (G_OBJECT (action), "menu-icon", pixbuf, @@ -5493,7 +5497,7 @@ add_submenu_to_directory_menus (FMDirectoryView *directory_view, ui_manager = caja_window_info_get_ui_manager (directory_view->details->window); uri = caja_file_get_uri (file); name = caja_file_get_display_name (file); - pixbuf = get_menu_icon_for_file (file); + pixbuf = get_menu_icon_for_file (file, GTK_WIDGET (directory_view)); add_submenu (ui_manager, action_group, merge_id, menu_path, uri, name, pixbuf, TRUE); add_submenu (ui_manager, action_group, merge_id, popup_path, uri, name, pixbuf, FALSE); add_submenu (ui_manager, action_group, merge_id, popup_bg_path, uri, name, pixbuf, FALSE); @@ -5680,7 +5684,7 @@ add_template_to_templates_menus (FMDirectoryView *directory_view, tip, NULL); - pixbuf = get_menu_icon_for_file (file); + pixbuf = get_menu_icon_for_file (file, GTK_WIDGET (directory_view)); if (pixbuf != NULL) { g_object_set_data_full (G_OBJECT (action), "menu-icon", pixbuf, @@ -6978,6 +6982,7 @@ action_connect_to_server_link_callback (GtkAction *action, GtkWidget *entry; GtkWidget *box; char *title; + gint scale; view = FM_DIRECTORY_VIEW (data); @@ -6989,9 +6994,10 @@ action_connect_to_server_link_callback (GtkAction *action, } file = CAJA_FILE (selection->data); + scale = gtk_widget_get_scale_factor (GTK_WIDGET (view)); uri = caja_file_get_activation_uri (file); - icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, 0); + icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, scale, 0); icon_name = caja_icon_info_get_used_name (icon); name = caja_file_get_display_name (file); @@ -7583,7 +7589,7 @@ connect_proxy (FMDirectoryView *view, if (strcmp (gtk_action_get_name (action), FM_ACTION_NEW_EMPTY_FILE) == 0 && GTK_IS_IMAGE_MENU_ITEM (proxy)) { - pixbuf = get_menu_icon ("text-x-generic"); + pixbuf = get_menu_icon ("text-x-generic", GTK_WIDGET (view)); if (pixbuf != NULL) { image = gtk_image_new_from_pixbuf (pixbuf); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy), image); diff --git a/src/file-manager/fm-icon-container.c b/src/file-manager/fm-icon-container.c index be3acee2..f744d65a 100644 --- a/src/file-manager/fm-icon-container.c +++ b/src/file-manager/fm-icon-container.c @@ -65,6 +65,7 @@ fm_icon_container_get_icon_images (CajaIconContainer *container, gboolean use_embedding; CajaFileIconFlags flags; guint emblem_size; + gint scale; file = (CajaFile *) data; @@ -119,7 +120,9 @@ fm_icon_container_get_icon_images (CajaIconContainer *container, flags |= CAJA_FILE_ICON_FLAGS_FOR_DRAG_ACCEPT; } - return caja_file_get_icon (file, size, flags); + scale = gtk_widget_get_scale_factor (GTK_WIDGET (icon_view)); + + return caja_file_get_icon (file, size, scale, flags); } static char * diff --git a/src/file-manager/fm-list-model.c b/src/file-manager/fm-list-model.c index 315fef70..715303b5 100644 --- a/src/file-manager/fm-list-model.c +++ b/src/file-manager/fm-list-model.c @@ -34,10 +34,12 @@ #include #include #include +#include enum { SUBDIRECTORY_UNLOADED, + GET_ICON_SCALE, LAST_SIGNAL }; @@ -163,7 +165,7 @@ fm_list_model_get_column_type (GtkTreeModel *tree_model, int index) case FM_LIST_MODEL_LARGE_ICON_COLUMN: case FM_LIST_MODEL_LARGER_ICON_COLUMN: case FM_LIST_MODEL_LARGEST_ICON_COLUMN: - return GDK_TYPE_PIXBUF; + return CAIRO_GOBJECT_TYPE_SURFACE; case FM_LIST_MODEL_FILE_NAME_IS_EDITABLE_COLUMN: return G_TYPE_BOOLEAN; default: @@ -259,6 +261,21 @@ fm_list_model_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter) return path; } +static gint +fm_list_model_get_icon_scale (FMListModel *model) +{ + gint retval = -1; + + g_signal_emit (model, list_model_signals[GET_ICON_SCALE], 0, + &retval); + + if (retval == -1) { + retval = gdk_screen_get_monitor_scale_factor (gdk_screen_get_default (), 0); + } + + return retval; +} + static void fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column, GValue *value) { @@ -271,12 +288,13 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column CajaIconInfo *icon_info; GEmblem *emblem; GList *emblem_icons, *l; - int icon_size; + int icon_size, icon_scale; CajaZoomLevel zoom_level; CajaFile *parent_file; char *emblems_to_ignore[3]; int i; CajaFileIconFlags flags; + cairo_surface_t *surface; model = (FMListModel *)tree_model; @@ -305,12 +323,13 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column case FM_LIST_MODEL_LARGE_ICON_COLUMN: case FM_LIST_MODEL_LARGER_ICON_COLUMN: case FM_LIST_MODEL_LARGEST_ICON_COLUMN: - g_value_init (value, GDK_TYPE_PIXBUF); + g_value_init (value, CAIRO_GOBJECT_TYPE_SURFACE); if (file != NULL) { zoom_level = fm_list_model_get_zoom_level_from_column_id (column); icon_size = caja_get_icon_size_for_zoom_level (zoom_level); + icon_scale = fm_list_model_get_icon_scale (model); flags = CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | CAJA_FILE_ICON_FLAGS_FORCE_THUMBNAIL_SIZE | @@ -376,7 +395,7 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column gicon = emblemed_icon; } - icon_info = caja_icon_info_lookup (gicon, icon_size); + icon_info = caja_icon_info_lookup (gicon, icon_size, icon_scale); icon = caja_icon_info_get_pixbuf_at_size (icon_info, icon_size); g_object_unref (icon_info); @@ -395,7 +414,8 @@ fm_list_model_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, int column } } - g_value_set_object (value, icon); + surface = gdk_cairo_surface_create_from_pixbuf (icon, icon_scale, NULL); + g_value_take_boxed (value, surface); g_object_unref (icon); } break; @@ -1675,6 +1695,14 @@ fm_list_model_class_init (FMListModelClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, CAJA_TYPE_DIRECTORY); + + list_model_signals[GET_ICON_SCALE] = + g_signal_new ("get-icon-scale", + FM_TYPE_LIST_MODEL, + G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + NULL, + G_TYPE_INT, 0); } static void diff --git a/src/file-manager/fm-list-view.c b/src/file-manager/fm-list-view.c index d2353e7a..b68b6a31 100644 --- a/src/file-manager/fm-list-view.c +++ b/src/file-manager/fm-list-view.c @@ -1638,6 +1638,13 @@ focus_in_event_callback (GtkWidget *widget, GdkEventFocus *event, gpointer user_ return FALSE; } +static gint +get_icon_scale_callback (FMListModel *model, + FMListView *view) +{ + return gtk_widget_get_scale_factor (GTK_WIDGET (view->details->tree_view)); +} + static void create_and_set_up_tree_view (FMListView *view) { @@ -1727,6 +1734,9 @@ create_and_set_up_tree_view (FMListView *view) g_signal_connect_object (view->details->model, "subdirectory_unloaded", G_CALLBACK (subdirectory_unloaded_callback), view, 0); + g_signal_connect_object (view->details->model, "get-icon-scale", + G_CALLBACK (get_icon_scale_callback), view, 0); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (view->details->tree_view), GTK_SELECTION_MULTIPLE); caja_columns = caja_get_all_columns (); @@ -1782,7 +1792,7 @@ create_and_set_up_tree_view (FMListView *view) gtk_tree_view_column_pack_start (view->details->file_name_column, cell, FALSE); gtk_tree_view_column_set_attributes (view->details->file_name_column, cell, - "pixbuf", FM_LIST_MODEL_SMALLEST_ICON_COLUMN, + "surface", FM_LIST_MODEL_SMALLEST_ICON_COLUMN, NULL); cell = gtk_cell_renderer_text_new (); @@ -2779,7 +2789,7 @@ fm_list_view_set_zoom_level (FMListView *view, column = fm_list_model_get_column_id_from_zoom_level (new_level); gtk_tree_view_column_set_attributes (view->details->file_name_column, GTK_CELL_RENDERER (view->details->pixbuf_cell), - "pixbuf", column, + "surface", column, NULL); /* Scale text. */ diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index 56af2094..6de9f98a 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -363,17 +363,24 @@ get_image_for_properties_window (FMPropertiesWindow *window, { CajaIconInfo *icon, *new_icon; GList *l; + gint icon_scale; icon = NULL; + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (window->details->notebook)); + for (l = window->details->original_files; l != NULL; l = l->next) { CajaFile *file; file = CAJA_FILE (l->data); if (!icon) { - icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); + icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, icon_scale, + CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | + CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); } else { - new_icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); + new_icon = caja_file_get_icon (file, CAJA_ICON_SIZE_STANDARD, icon_scale, + CAJA_FILE_ICON_FLAGS_USE_THUMBNAILS | + CAJA_FILE_ICON_FLAGS_IGNORE_VISITING); if (!new_icon || new_icon != icon) { g_object_unref (icon); g_object_unref (new_icon); @@ -385,7 +392,9 @@ get_image_for_properties_window (FMPropertiesWindow *window, } if (!icon) { - icon = caja_icon_info_lookup_from_name ("text-x-generic", CAJA_ICON_SIZE_STANDARD); + icon = caja_icon_info_lookup_from_name ("text-x-generic", + CAJA_ICON_SIZE_STANDARD, + icon_scale); } if (icon_name != NULL) { @@ -3412,6 +3421,7 @@ create_emblems_page (FMPropertiesWindow *window) char *label; GList *icons, *l; CajaIconInfo *info; + gint scale; /* The emblems wrapped table */ scroller = eel_scrolled_wrap_table_new (TRUE, GTK_SHADOW_NONE, &emblems_table); @@ -3427,6 +3437,7 @@ create_emblems_page (FMPropertiesWindow *window) scroller, gtk_label_new (_("Emblems"))); icons = caja_emblem_list_available (); + scale = gtk_widget_get_scale_factor (scroller); window->details->initial_emblems = get_initial_emblems (window->details->original_files); @@ -3439,7 +3450,7 @@ create_emblems_page (FMPropertiesWindow *window) continue; } - info = caja_icon_info_lookup_from_name (emblem_name, CAJA_ICON_SIZE_SMALL); + info = caja_icon_info_lookup_from_name (emblem_name, CAJA_ICON_SIZE_SMALL, scale); pixbuf = caja_icon_info_get_pixbuf_nodefault_at_size (info, CAJA_ICON_SIZE_SMALL); if (pixbuf == NULL) { @@ -3454,8 +3465,8 @@ create_emblems_page (FMPropertiesWindow *window) } button = eel_labeled_image_check_button_new (label, pixbuf); - eel_labeled_image_set_fixed_image_height (EEL_LABELED_IMAGE (gtk_bin_get_child (GTK_BIN (button))), STANDARD_EMBLEM_HEIGHT); - eel_labeled_image_set_spacing (EEL_LABELED_IMAGE (gtk_bin_get_child (GTK_BIN (button))), EMBLEM_LABEL_SPACING); + eel_labeled_image_set_fixed_image_height (EEL_LABELED_IMAGE (gtk_bin_get_child (GTK_BIN (button))), STANDARD_EMBLEM_HEIGHT * scale); + eel_labeled_image_set_spacing (EEL_LABELED_IMAGE (gtk_bin_get_child (GTK_BIN (button))), EMBLEM_LABEL_SPACING * scale); g_free (label); g_object_unref (pixbuf); diff --git a/src/file-manager/fm-tree-model.c b/src/file-manager/fm-tree-model.c index cf400375..e3bcfd3c 100644 --- a/src/file-manager/fm-tree-model.c +++ b/src/file-manager/fm-tree-model.c @@ -258,11 +258,12 @@ get_menu_icon (GIcon *icon) { CajaIconInfo *info; GdkPixbuf *pixbuf; - int size; + int size, scale; size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); + scale = gdk_window_get_scale_factor (gdk_get_default_root_window ()); - info = caja_icon_info_lookup (icon, size); + info = caja_icon_info_lookup (icon, size, scale); pixbuf = caja_icon_info_get_pixbuf_nodefault_at_size (info, size); g_object_unref (info); @@ -279,13 +280,14 @@ get_menu_icon_for_file (TreeNode *node, GEmblem *emblem; GdkPixbuf *pixbuf, *retval; gboolean highlight; - int size; + int size, scale; FMTreeModel *model; GList *emblem_icons, *l; char *emblems_to_ignore[3]; int i; size = caja_get_icon_size_for_stock_size (GTK_ICON_SIZE_MENU); + scale = gdk_window_get_scale_factor (gdk_get_default_root_window ()); gicon = caja_file_get_gicon (file, flags); @@ -321,7 +323,7 @@ get_menu_icon_for_file (TreeNode *node, g_list_free_full (emblem_icons, g_object_unref); - info = caja_icon_info_lookup (gicon, size); + info = caja_icon_info_lookup (gicon, size, scale); retval = caja_icon_info_get_pixbuf_nodefault_at_size (info, size); model = node->root->model; -- cgit v1.2.1