mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-10-31 16:32:18 +01:00 
			
		
		
		
	Add symbolic icon support to gfileinfo
https://bugzilla.gnome.org/show_bug.cgi?id=682101
This commit is contained in:
		| @@ -241,6 +241,7 @@ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME | ||||
| G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME | ||||
| G_FILE_ATTRIBUTE_STANDARD_COPY_NAME | ||||
| G_FILE_ATTRIBUTE_STANDARD_ICON | ||||
| G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON | ||||
| G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE | ||||
| G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE | ||||
| G_FILE_ATTRIBUTE_STANDARD_SIZE | ||||
| @@ -347,6 +348,7 @@ g_file_info_get_name | ||||
| g_file_info_get_display_name | ||||
| g_file_info_get_edit_name | ||||
| g_file_info_get_icon | ||||
| g_file_info_get_symbolic_icon | ||||
| g_file_info_get_content_type | ||||
| g_file_info_get_size | ||||
| g_file_info_get_modification_time | ||||
| @@ -362,6 +364,7 @@ g_file_info_set_name | ||||
| g_file_info_set_display_name | ||||
| g_file_info_set_edit_name | ||||
| g_file_info_set_icon | ||||
| g_file_info_set_symbolic_icon | ||||
| g_file_info_set_content_type | ||||
| g_file_info_set_size | ||||
| g_file_info_set_modification_time | ||||
|   | ||||
| @@ -44,6 +44,7 @@ | ||||
| #define G_FILE_ATTRIBUTE_ID_STANDARD_SYMLINK_TARGET (1048576 + 16) | ||||
| #define G_FILE_ATTRIBUTE_ID_STANDARD_TARGET_URI (1048576 + 17) | ||||
| #define G_FILE_ATTRIBUTE_ID_STANDARD_SORT_ORDER (1048576 + 18) | ||||
| #define G_FILE_ATTRIBUTE_ID_STANDARD_SYMBOLIC_ICON (1048576 + 19) | ||||
| #define G_FILE_ATTRIBUTE_ID_ETAG_VALUE (2097152 + 1) | ||||
| #define G_FILE_ATTRIBUTE_ID_ID_FILE (3145728 + 1) | ||||
| #define G_FILE_ATTRIBUTE_ID_ID_FILESYSTEM (3145728 + 2) | ||||
|   | ||||
| @@ -204,6 +204,7 @@ ensure_attribute_hash (void) | ||||
|   REGISTER_ATTRIBUTE (STANDARD_SYMLINK_TARGET); | ||||
|   REGISTER_ATTRIBUTE (STANDARD_TARGET_URI); | ||||
|   REGISTER_ATTRIBUTE (STANDARD_SORT_ORDER); | ||||
|   REGISTER_ATTRIBUTE (STANDARD_SYMBOLIC_ICON); | ||||
|   REGISTER_ATTRIBUTE (ETAG_VALUE); | ||||
|   REGISTER_ATTRIBUTE (ID_FILE); | ||||
|   REGISTER_ATTRIBUTE (ID_FILESYSTEM); | ||||
| @@ -1627,6 +1628,35 @@ g_file_info_get_icon (GFileInfo *info) | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * g_file_info_get_symbolic_icon: | ||||
|  * @info: a #GFileInfo. | ||||
|  * | ||||
|  * Gets the symbolic icon for a file. | ||||
|  * | ||||
|  * Returns: (transfer none): #GIcon for the given @info. | ||||
|  * | ||||
|  * Since: 2.34 | ||||
|  **/ | ||||
| GIcon * | ||||
| g_file_info_get_symbolic_icon (GFileInfo *info) | ||||
| { | ||||
|   static guint32 attr = 0; | ||||
|   GFileAttributeValue *value; | ||||
|   GObject *obj; | ||||
|  | ||||
|   g_return_val_if_fail (G_IS_FILE_INFO (info), NULL); | ||||
|  | ||||
|   if (attr == 0) | ||||
|     attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON); | ||||
|  | ||||
|   value = g_file_info_find_value (info, attr); | ||||
|   obj = _g_file_attribute_value_get_object (value); | ||||
|   if (G_IS_ICON (obj)) | ||||
|     return G_ICON (obj); | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * g_file_info_get_content_type: | ||||
|  * @info: a #GFileInfo. | ||||
| @@ -1954,6 +1984,34 @@ g_file_info_set_icon (GFileInfo *info, | ||||
|     _g_file_attribute_value_set_object (value, G_OBJECT (icon)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * g_file_info_set_symbolic_icon: | ||||
|  * @info: a #GFileInfo. | ||||
|  * @icon: a #GIcon. | ||||
|  * | ||||
|  * Sets the symbolic icon for a given #GFileInfo. | ||||
|  * See %G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON. | ||||
|  * | ||||
|  * Since: 2.34 | ||||
|  **/ | ||||
| void | ||||
| g_file_info_set_symbolic_icon (GFileInfo *info, | ||||
|                                GIcon     *icon) | ||||
| { | ||||
|   static guint32 attr = 0; | ||||
|   GFileAttributeValue *value; | ||||
|  | ||||
|   g_return_if_fail (G_IS_FILE_INFO (info)); | ||||
|   g_return_if_fail (G_IS_ICON (icon)); | ||||
|  | ||||
|   if (attr == 0) | ||||
|     attr = lookup_attribute (G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON); | ||||
|  | ||||
|   value = g_file_info_create_value (info, attr); | ||||
|   if (value) | ||||
|     _g_file_attribute_value_set_object (value, G_OBJECT (icon)); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * g_file_info_set_content_type: | ||||
|  * @info: a #GFileInfo. | ||||
|   | ||||
| @@ -162,6 +162,17 @@ typedef struct _GFileInfoClass   GFileInfoClass; | ||||
|  **/ | ||||
| #define G_FILE_ATTRIBUTE_STANDARD_ICON "standard::icon"                     /* object (GIcon) */ | ||||
|  | ||||
| /** | ||||
|  * G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON: | ||||
|  * | ||||
|  * A key in the "standard" namespace for getting the symbolic icon for the file. | ||||
|  * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_OBJECT. | ||||
|  * The value for this key should contain a #GIcon. | ||||
|  * | ||||
|  * Since: 2.34 | ||||
|  **/ | ||||
| #define G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON "standard::symbolic-icon"   /* object (GIcon) */ | ||||
|  | ||||
| /** | ||||
|  * G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE: | ||||
|  * | ||||
| @@ -908,6 +919,7 @@ const char *      g_file_info_get_name               (GFileInfo         *info); | ||||
| const char *      g_file_info_get_display_name       (GFileInfo         *info); | ||||
| const char *      g_file_info_get_edit_name          (GFileInfo         *info); | ||||
| GIcon *           g_file_info_get_icon               (GFileInfo         *info); | ||||
| GIcon *           g_file_info_get_symbolic_icon      (GFileInfo         *info); | ||||
| const char *      g_file_info_get_content_type       (GFileInfo         *info); | ||||
| goffset           g_file_info_get_size               (GFileInfo         *info); | ||||
| void              g_file_info_get_modification_time  (GFileInfo         *info, | ||||
| @@ -935,6 +947,8 @@ void              g_file_info_set_edit_name          (GFileInfo         *info, | ||||
| 						      const char        *edit_name); | ||||
| void              g_file_info_set_icon               (GFileInfo         *info, | ||||
| 						      GIcon             *icon); | ||||
| void              g_file_info_set_symbolic_icon      (GFileInfo         *info, | ||||
| 						      GIcon             *icon); | ||||
| void              g_file_info_set_content_type       (GFileInfo         *info, | ||||
| 						      const char        *content_type); | ||||
| void              g_file_info_set_size               (GFileInfo         *info, | ||||
|   | ||||
| @@ -422,6 +422,7 @@ g_file_info_get_name | ||||
| g_file_info_get_display_name | ||||
| g_file_info_get_edit_name | ||||
| g_file_info_get_icon | ||||
| g_file_info_get_symbolic_icon | ||||
| g_file_info_get_content_type | ||||
| g_file_info_get_size | ||||
| g_file_info_get_modification_time | ||||
| @@ -437,6 +438,7 @@ g_file_info_set_name | ||||
| g_file_info_set_display_name | ||||
| g_file_info_set_edit_name | ||||
| g_file_info_set_icon | ||||
| g_file_info_set_symbolic_icon | ||||
| g_file_info_set_content_type | ||||
| g_file_info_set_size | ||||
| g_file_info_set_modification_time | ||||
|   | ||||
| @@ -1448,6 +1448,63 @@ _g_local_file_info_get_nostat (GFileInfo              *info, | ||||
|     } | ||||
| } | ||||
|  | ||||
| static const char * | ||||
| get_icon_name (const char *path, | ||||
|                gboolean    use_symbolic, | ||||
|                gboolean   *with_fallbacks_out) | ||||
| { | ||||
|   const char *name = NULL; | ||||
|   gboolean with_fallbacks = TRUE; | ||||
|  | ||||
|   if (strcmp (path, g_get_home_dir ()) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "user-home-symbolic" : "user-home"; | ||||
|       with_fallbacks = FALSE; | ||||
|     } | ||||
|   else if (strcmp (path, g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "user-desktop-symbolic" : "user-desktop"; | ||||
|       with_fallbacks = FALSE; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-documents-symbolic" : "folder-documents"; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-download-symbolic" : "folder-download"; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-music-symbolic" : "folder-music"; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PICTURES)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-pictures-symbolic" : "folder-pictures"; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-publicshare-symbolic" : "folder-publicshare"; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_TEMPLATES)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-templates-symbolic" : "folder-templates"; | ||||
|     } | ||||
|   else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS)) == 0) | ||||
|     { | ||||
|       name = use_symbolic ? "folder-videos-symbolic" : "folder-videos"; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       name = NULL; | ||||
|     } | ||||
|  | ||||
|   if (with_fallbacks_out != NULL) | ||||
|     *with_fallbacks_out = with_fallbacks; | ||||
|  | ||||
|   return name; | ||||
| } | ||||
|  | ||||
| GFileInfo * | ||||
| _g_local_file_info_get (const char             *basename, | ||||
| 			const char             *path, | ||||
| @@ -1601,37 +1658,35 @@ _g_local_file_info_get (const char             *basename, | ||||
|   if (_g_file_attribute_matcher_matches_id (attribute_matcher, | ||||
| 					    G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE) || | ||||
|       _g_file_attribute_matcher_matches_id (attribute_matcher, | ||||
| 					    G_FILE_ATTRIBUTE_ID_STANDARD_ICON)) | ||||
| 					    G_FILE_ATTRIBUTE_ID_STANDARD_ICON) || | ||||
|       _g_file_attribute_matcher_matches_id (attribute_matcher, | ||||
| 					    G_FILE_ATTRIBUTE_ID_STANDARD_SYMBOLIC_ICON)) | ||||
|     { | ||||
|       char *content_type = get_content_type (basename, path, stat_ok ? &statbuf : NULL, is_symlink, symlink_broken, flags, FALSE); | ||||
|  | ||||
|       if (content_type) | ||||
| 	{ | ||||
|           gboolean use_symbolics = FALSE; | ||||
|  | ||||
| 	  g_file_info_set_content_type (info, content_type); | ||||
|  | ||||
| 	  if (_g_file_attribute_matcher_matches_id (attribute_matcher, | ||||
| 						    G_FILE_ATTRIBUTE_ID_STANDARD_ICON)) | ||||
|           use_symbolics = _g_file_attribute_matcher_matches_id (attribute_matcher, | ||||
|                                                                 G_FILE_ATTRIBUTE_ID_STANDARD_SYMBOLIC_ICON); | ||||
| 	  if (use_symbolics || | ||||
|               _g_file_attribute_matcher_matches_id (attribute_matcher, | ||||
|                                                     G_FILE_ATTRIBUTE_ID_STANDARD_ICON)) | ||||
| 	    { | ||||
| 	      GIcon *icon; | ||||
|               gboolean with_fallbacks = TRUE; | ||||
|               const char *icon_name = get_icon_name (path, use_symbolics, &with_fallbacks); | ||||
|  | ||||
|               if (strcmp (path, g_get_home_dir ()) == 0) | ||||
|                 icon = g_themed_icon_new ("user-home"); | ||||
|               else if (strcmp (path, g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)) == 0) | ||||
|                 icon = g_themed_icon_new ("user-desktop"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-documents"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-download"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_MUSIC)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-music"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PICTURES)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-pictures"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_PUBLIC_SHARE)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-publicshare"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_TEMPLATES)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-templates"); | ||||
|               else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_VIDEOS)) == 0) | ||||
|                 icon = g_themed_icon_new_with_default_fallbacks ("folder-videos"); | ||||
|               if (icon_name != NULL) | ||||
|                 { | ||||
|                   if (with_fallbacks) | ||||
|                     icon = g_themed_icon_new_with_default_fallbacks (icon_name); | ||||
|                   else | ||||
|                     icon = g_themed_icon_new (icon_name); | ||||
|                 } | ||||
|               else | ||||
|                 { | ||||
|                   icon = g_content_type_get_icon (content_type); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user