mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-05 02:36:19 +01:00
Add symbolic icon support to gfileinfo
https://bugzilla.gnome.org/show_bug.cgi?id=682101
This commit is contained in:
parent
a2dca48bf7
commit
a15a071f35
@ -241,6 +241,7 @@ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME
|
|||||||
G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME
|
G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME
|
||||||
G_FILE_ATTRIBUTE_STANDARD_COPY_NAME
|
G_FILE_ATTRIBUTE_STANDARD_COPY_NAME
|
||||||
G_FILE_ATTRIBUTE_STANDARD_ICON
|
G_FILE_ATTRIBUTE_STANDARD_ICON
|
||||||
|
G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON
|
||||||
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE
|
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE
|
||||||
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE
|
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE
|
||||||
G_FILE_ATTRIBUTE_STANDARD_SIZE
|
G_FILE_ATTRIBUTE_STANDARD_SIZE
|
||||||
@ -347,6 +348,7 @@ g_file_info_get_name
|
|||||||
g_file_info_get_display_name
|
g_file_info_get_display_name
|
||||||
g_file_info_get_edit_name
|
g_file_info_get_edit_name
|
||||||
g_file_info_get_icon
|
g_file_info_get_icon
|
||||||
|
g_file_info_get_symbolic_icon
|
||||||
g_file_info_get_content_type
|
g_file_info_get_content_type
|
||||||
g_file_info_get_size
|
g_file_info_get_size
|
||||||
g_file_info_get_modification_time
|
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_display_name
|
||||||
g_file_info_set_edit_name
|
g_file_info_set_edit_name
|
||||||
g_file_info_set_icon
|
g_file_info_set_icon
|
||||||
|
g_file_info_set_symbolic_icon
|
||||||
g_file_info_set_content_type
|
g_file_info_set_content_type
|
||||||
g_file_info_set_size
|
g_file_info_set_size
|
||||||
g_file_info_set_modification_time
|
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_SYMLINK_TARGET (1048576 + 16)
|
||||||
#define G_FILE_ATTRIBUTE_ID_STANDARD_TARGET_URI (1048576 + 17)
|
#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_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_ETAG_VALUE (2097152 + 1)
|
||||||
#define G_FILE_ATTRIBUTE_ID_ID_FILE (3145728 + 1)
|
#define G_FILE_ATTRIBUTE_ID_ID_FILE (3145728 + 1)
|
||||||
#define G_FILE_ATTRIBUTE_ID_ID_FILESYSTEM (3145728 + 2)
|
#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_SYMLINK_TARGET);
|
||||||
REGISTER_ATTRIBUTE (STANDARD_TARGET_URI);
|
REGISTER_ATTRIBUTE (STANDARD_TARGET_URI);
|
||||||
REGISTER_ATTRIBUTE (STANDARD_SORT_ORDER);
|
REGISTER_ATTRIBUTE (STANDARD_SORT_ORDER);
|
||||||
|
REGISTER_ATTRIBUTE (STANDARD_SYMBOLIC_ICON);
|
||||||
REGISTER_ATTRIBUTE (ETAG_VALUE);
|
REGISTER_ATTRIBUTE (ETAG_VALUE);
|
||||||
REGISTER_ATTRIBUTE (ID_FILE);
|
REGISTER_ATTRIBUTE (ID_FILE);
|
||||||
REGISTER_ATTRIBUTE (ID_FILESYSTEM);
|
REGISTER_ATTRIBUTE (ID_FILESYSTEM);
|
||||||
@ -1627,6 +1628,35 @@ g_file_info_get_icon (GFileInfo *info)
|
|||||||
return NULL;
|
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:
|
* g_file_info_get_content_type:
|
||||||
* @info: a #GFileInfo.
|
* @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_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:
|
* g_file_info_set_content_type:
|
||||||
* @info: a #GFileInfo.
|
* @info: a #GFileInfo.
|
||||||
|
@ -162,6 +162,17 @@ typedef struct _GFileInfoClass GFileInfoClass;
|
|||||||
**/
|
**/
|
||||||
#define G_FILE_ATTRIBUTE_STANDARD_ICON "standard::icon" /* object (GIcon) */
|
#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:
|
* 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_display_name (GFileInfo *info);
|
||||||
const char * g_file_info_get_edit_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_icon (GFileInfo *info);
|
||||||
|
GIcon * g_file_info_get_symbolic_icon (GFileInfo *info);
|
||||||
const char * g_file_info_get_content_type (GFileInfo *info);
|
const char * g_file_info_get_content_type (GFileInfo *info);
|
||||||
goffset g_file_info_get_size (GFileInfo *info);
|
goffset g_file_info_get_size (GFileInfo *info);
|
||||||
void g_file_info_get_modification_time (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);
|
const char *edit_name);
|
||||||
void g_file_info_set_icon (GFileInfo *info,
|
void g_file_info_set_icon (GFileInfo *info,
|
||||||
GIcon *icon);
|
GIcon *icon);
|
||||||
|
void g_file_info_set_symbolic_icon (GFileInfo *info,
|
||||||
|
GIcon *icon);
|
||||||
void g_file_info_set_content_type (GFileInfo *info,
|
void g_file_info_set_content_type (GFileInfo *info,
|
||||||
const char *content_type);
|
const char *content_type);
|
||||||
void g_file_info_set_size (GFileInfo *info,
|
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_display_name
|
||||||
g_file_info_get_edit_name
|
g_file_info_get_edit_name
|
||||||
g_file_info_get_icon
|
g_file_info_get_icon
|
||||||
|
g_file_info_get_symbolic_icon
|
||||||
g_file_info_get_content_type
|
g_file_info_get_content_type
|
||||||
g_file_info_get_size
|
g_file_info_get_size
|
||||||
g_file_info_get_modification_time
|
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_display_name
|
||||||
g_file_info_set_edit_name
|
g_file_info_set_edit_name
|
||||||
g_file_info_set_icon
|
g_file_info_set_icon
|
||||||
|
g_file_info_set_symbolic_icon
|
||||||
g_file_info_set_content_type
|
g_file_info_set_content_type
|
||||||
g_file_info_set_size
|
g_file_info_set_size
|
||||||
g_file_info_set_modification_time
|
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 *
|
GFileInfo *
|
||||||
_g_local_file_info_get (const char *basename,
|
_g_local_file_info_get (const char *basename,
|
||||||
const char *path,
|
const char *path,
|
||||||
@ -1601,37 +1658,35 @@ _g_local_file_info_get (const char *basename,
|
|||||||
if (_g_file_attribute_matcher_matches_id (attribute_matcher,
|
if (_g_file_attribute_matcher_matches_id (attribute_matcher,
|
||||||
G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE) ||
|
G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE) ||
|
||||||
_g_file_attribute_matcher_matches_id (attribute_matcher,
|
_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);
|
char *content_type = get_content_type (basename, path, stat_ok ? &statbuf : NULL, is_symlink, symlink_broken, flags, FALSE);
|
||||||
|
|
||||||
if (content_type)
|
if (content_type)
|
||||||
{
|
{
|
||||||
|
gboolean use_symbolics = FALSE;
|
||||||
|
|
||||||
g_file_info_set_content_type (info, content_type);
|
g_file_info_set_content_type (info, content_type);
|
||||||
|
|
||||||
if (_g_file_attribute_matcher_matches_id (attribute_matcher,
|
use_symbolics = _g_file_attribute_matcher_matches_id (attribute_matcher,
|
||||||
G_FILE_ATTRIBUTE_ID_STANDARD_ICON))
|
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;
|
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)
|
if (icon_name != NULL)
|
||||||
icon = g_themed_icon_new ("user-home");
|
{
|
||||||
else if (strcmp (path, g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)) == 0)
|
if (with_fallbacks)
|
||||||
icon = g_themed_icon_new ("user-desktop");
|
icon = g_themed_icon_new_with_default_fallbacks (icon_name);
|
||||||
else if (g_strcmp0 (path, g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS)) == 0)
|
else
|
||||||
icon = g_themed_icon_new_with_default_fallbacks ("folder-documents");
|
icon = g_themed_icon_new (icon_name);
|
||||||
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");
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
icon = g_content_type_get_icon (content_type);
|
icon = g_content_type_get_icon (content_type);
|
||||||
|
Loading…
Reference in New Issue
Block a user