Add symbolic icons to TextureCache's load_icon_name()
Icons can be loaded as St.Icon.SYMBOLIC, FULLCOLOR, APPLICATION or DOCUMENT. The first will look for a symbolic equivalent, the second looks for a full-color version (and does fallback, eg, from "drive-harddisk-usb" to "drive-harddisk"). APPLICATION and DOCUMENT do full-color icons without fallback (as specified by the icon spec). And update various callers to use the right flags. Based on a patch from Matt Novenstern. https://bugzilla.gnome.org/show_bug.cgi?id=621311
This commit is contained in:
parent
4b781ae7e6
commit
a6e4bab990
@ -678,7 +678,8 @@ LookingGlass.prototype = {
|
|||||||
|
|
||||||
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
|
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
|
||||||
this.actor.add_actor(toolbar);
|
this.actor.add_actor(toolbar);
|
||||||
let inspectIcon = St.TextureCache.get_default().load_gicon(new Gio.ThemedIcon({ name: 'gtk-color-picker' }),
|
let inspectIcon = St.TextureCache.get_default().load_icon_name('gtk-color-picker',
|
||||||
|
St.IconType.SYMBOLIC,
|
||||||
24);
|
24);
|
||||||
toolbar.add_actor(inspectIcon);
|
toolbar.add_actor(inspectIcon);
|
||||||
inspectIcon.reactive = true;
|
inspectIcon.reactive = true;
|
||||||
|
@ -346,7 +346,7 @@ Notification.prototype = {
|
|||||||
|
|
||||||
if (Gtk.IconTheme.get_default().has_icon(id)) {
|
if (Gtk.IconTheme.get_default().has_icon(id)) {
|
||||||
button.add_style_class_name('notification-icon-button');
|
button.add_style_class_name('notification-icon-button');
|
||||||
button.child = St.TextureCache.get_default().load_icon_name(id, BUTTON_ICON_SIZE);
|
button.child = St.TextureCache.get_default().load_icon_name(id, St.IconType.SYMBOLIC, BUTTON_ICON_SIZE);
|
||||||
} else {
|
} else {
|
||||||
button.add_style_class_name('notification-button');
|
button.add_style_class_name('notification-button');
|
||||||
button.label = label;
|
button.label = label;
|
||||||
|
@ -148,7 +148,7 @@ NotificationDaemon.prototype = {
|
|||||||
let uri = GLib.filename_to_uri(icon, null);
|
let uri = GLib.filename_to_uri(icon, null);
|
||||||
return textureCache.load_uri_async(uri, size, size);
|
return textureCache.load_uri_async(uri, size, size);
|
||||||
} else
|
} else
|
||||||
return textureCache.load_icon_name(icon, size);
|
return textureCache.load_icon_name(icon, St.IconType.FULLCOLOR, size);
|
||||||
} else if (hints.icon_data) {
|
} else if (hints.icon_data) {
|
||||||
let [width, height, rowStride, hasAlpha,
|
let [width, height, rowStride, hasAlpha,
|
||||||
bitsPerSample, nChannels, data] = hints.icon_data;
|
bitsPerSample, nChannels, data] = hints.icon_data;
|
||||||
@ -165,7 +165,7 @@ NotificationDaemon.prototype = {
|
|||||||
stockIcon = 'gtk-dialog-error';
|
stockIcon = 'gtk-dialog-error';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return textureCache.load_icon_name(stockIcon, size);
|
return textureCache.load_icon_name(stockIcon, St.IconType.FULLCOLOR, size);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ SystemStatusButton.prototype = {
|
|||||||
this._iconName = iconName;
|
this._iconName = iconName;
|
||||||
if (this._iconActor)
|
if (this._iconActor)
|
||||||
this._iconActor.destroy();
|
this._iconActor.destroy();
|
||||||
this._iconActor = St.TextureCache.get_default().load_icon_name(this._iconName, 24);
|
this._iconActor = St.TextureCache.get_default().load_icon_name(this._iconName, St.IconType.SYMBOLIC, 24);
|
||||||
this.actor.set_child(this._iconActor);
|
this.actor.set_child(this._iconActor);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ PlacesManager.prototype = {
|
|||||||
|
|
||||||
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
|
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
|
||||||
function (size) {
|
function (size) {
|
||||||
return St.TextureCache.get_default().load_icon_name('applications-internet', size);
|
return St.TextureCache.get_default().load_icon_name('applications-internet', St.IconType.FULLCOLOR, size);
|
||||||
},
|
},
|
||||||
function () {
|
function () {
|
||||||
new Shell.Process({ args: ['nautilus-connect-server'] }).run();
|
new Shell.Process({ args: ['nautilus-connect-server'] }).run();
|
||||||
@ -432,7 +432,7 @@ DashPlaceDisplayItem.prototype = {
|
|||||||
box.add(text, { expand: true, x_fill: true });
|
box.add(text, { expand: true, x_fill: true });
|
||||||
|
|
||||||
if (info.isRemovable()) {
|
if (info.isRemovable()) {
|
||||||
let removeIcon = St.TextureCache.get_default().load_icon_name ('media-eject', PLACES_ICON_SIZE);
|
let removeIcon = St.TextureCache.get_default().load_icon_name ('media-eject', St.IconType.FULLCOLOR, PLACES_ICON_SIZE);
|
||||||
let removeIconBox = new St.Clickable({ child: removeIcon,
|
let removeIconBox = new St.Clickable({ child: removeIcon,
|
||||||
reactive: true });
|
reactive: true });
|
||||||
box.add(removeIconBox);
|
box.add(removeIconBox);
|
||||||
|
@ -252,7 +252,7 @@ PopupImageMenuItem.prototype = {
|
|||||||
if (!show) {
|
if (!show) {
|
||||||
this._imageBin.hide();
|
this._imageBin.hide();
|
||||||
} else {
|
} else {
|
||||||
let img = St.TextureCache.get_default().load_icon_name(this._iconName, this._size);
|
let img = St.TextureCache.get_default().load_icon_name(this._iconName, St.IconType.SYMBOLIC, this._size);
|
||||||
this._imageBin.set_child(img);
|
this._imageBin.set_child(img);
|
||||||
this._imageBin.show();
|
this._imageBin.show();
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,10 @@ StatusMenuButton.prototype = {
|
|||||||
box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
|
box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
|
||||||
|
|
||||||
let textureCache = St.TextureCache.get_default();
|
let textureCache = St.TextureCache.get_default();
|
||||||
this._availableIcon = textureCache.load_icon_name('user-available', 16);
|
this._availableIcon = textureCache.load_icon_name('user-available', St.IconType.SYMBOLIC, 16);
|
||||||
this._busyIcon = textureCache.load_icon_name('user-busy', 16);
|
this._busyIcon = textureCache.load_icon_name('user-busy', St.IconType.SYMBOLIC, 16);
|
||||||
this._invisibleIcon = textureCache.load_icon_name('user-invisible', 16);
|
this._invisibleIcon = textureCache.load_icon_name('user-invisible', St.IconType.SYMBOLIC, 16);
|
||||||
this._idleIcon = textureCache.load_icon_name('user-idle', 16);
|
this._idleIcon = textureCache.load_icon_name('user-idle', St.IconType.SYMBOLIC, 16);
|
||||||
|
|
||||||
this._presence.connect('StatusChanged', Lang.bind(this, this._updatePresenceIcon));
|
this._presence.connect('StatusChanged', Lang.bind(this, this._updatePresenceIcon));
|
||||||
this._presence.getStatus(Lang.bind(this, this._updatePresenceIcon));
|
this._presence.getStatus(Lang.bind(this, this._updatePresenceIcon));
|
||||||
|
@ -347,7 +347,7 @@ ContactManager.prototype = {
|
|||||||
let uri = GLib.filename_to_uri(file, null);
|
let uri = GLib.filename_to_uri(file, null);
|
||||||
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
|
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
|
||||||
} else {
|
} else {
|
||||||
iconBox.child = textureCache.load_icon_name('stock_person', iconBox._size);
|
iconBox.child = textureCache.load_icon_name('stock_person', St.IconType.FULLCOLOR, iconBox._size);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -927,9 +927,16 @@ create_texture_and_ensure_request (StTextureCache *cache,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* st_texture_cache_load_gicon:
|
* st_texture_cache_load_gicon:
|
||||||
|
* @cache: The texture cache instance
|
||||||
|
* @icon: the #GIcon to load
|
||||||
|
* @size: Size of themed
|
||||||
*
|
*
|
||||||
* This method returns a new #ClutterClone for a given #GIcon. If the
|
* This method returns a new #ClutterActor for a given #GIcon. If the
|
||||||
* icon isn't loaded already, the texture will be filled asynchronously.
|
* icon isn't loaded already, the texture will be filled
|
||||||
|
* asynchronously.
|
||||||
|
*
|
||||||
|
* This will load @icon as a full-color icon; if you want a symbolic
|
||||||
|
* icon, you must use st_texture_cache_load_icon_name().
|
||||||
*
|
*
|
||||||
* Return Value: (transfer none): A new #ClutterActor for the icon
|
* Return Value: (transfer none): A new #ClutterActor for the icon
|
||||||
*/
|
*/
|
||||||
@ -1122,29 +1129,78 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
|
|||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* StIconType:
|
||||||
|
* @ST_ICON_SYMBOLIC: a symbolic (ie, mostly monochrome) icon
|
||||||
|
* @ST_ICON_FULLCOLOR: a full-color icon
|
||||||
|
* @ST_ICON_APPLICATION: a full-color icon, which is expected
|
||||||
|
* to be an application icon
|
||||||
|
* @ST_ICON_DOCUMENT: a full-color icon, which is expected
|
||||||
|
* to be a document (MIME type) icon
|
||||||
|
*
|
||||||
|
* Describes what style of icon is desired in a call to
|
||||||
|
* st_texture_cache_load_icon_name() or st_texture_cache_load_gicon().
|
||||||
|
* Use %ST_ICON_SYMBOLIC for symbolic icons (eg, for the panel and
|
||||||
|
* much of the rest of the shell chrome) or %ST_ICON_FULLCOLOR for a
|
||||||
|
* full-color icon.
|
||||||
|
*
|
||||||
|
* If you know that the requested icon is either an application icon
|
||||||
|
* or a document type icon, you should use %ST_ICON_APPLICATION or
|
||||||
|
* %ST_ICON_DOCUMENT, which may do a better job of selecting the
|
||||||
|
* correct theme icon for those types. If you are unsure what kind of
|
||||||
|
* icon you are loading, use %ST_ICON_FULLCOLOR.
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* st_texture_cache_load_icon_name:
|
* st_texture_cache_load_icon_name:
|
||||||
* @cache: The texture cache instance
|
* @cache: The texture cache instance
|
||||||
* @name: Name of a themed icon
|
* @name: Name of a themed icon
|
||||||
|
* @icon_type: the type of icon to load
|
||||||
* @size: Size of themed
|
* @size: Size of themed
|
||||||
*
|
*
|
||||||
* Load a themed icon into a texture.
|
* Load a themed icon into a texture. See the #StIconType documentation
|
||||||
|
* for an explanation of how @icon_type affects the returned icon.
|
||||||
*
|
*
|
||||||
* Return Value: (transfer none): A new #ClutterTexture for the icon
|
* Return Value: (transfer none): A new #ClutterTexture for the icon
|
||||||
*/
|
*/
|
||||||
ClutterActor *
|
ClutterActor *
|
||||||
st_texture_cache_load_icon_name (StTextureCache *cache,
|
st_texture_cache_load_icon_name (StTextureCache *cache,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
StIconType icon_type,
|
||||||
gint size)
|
gint size)
|
||||||
{
|
{
|
||||||
ClutterActor *texture;
|
ClutterActor *texture;
|
||||||
GIcon *themed;
|
GIcon *themed;
|
||||||
|
char *symbolic;
|
||||||
|
|
||||||
|
switch (icon_type)
|
||||||
|
{
|
||||||
|
case ST_ICON_APPLICATION:
|
||||||
|
case ST_ICON_DOCUMENT:
|
||||||
themed = g_themed_icon_new (name);
|
themed = g_themed_icon_new (name);
|
||||||
texture = st_texture_cache_load_gicon (cache, themed, size);
|
texture = st_texture_cache_load_gicon (cache, themed, size);
|
||||||
g_object_unref (themed);
|
g_object_unref (themed);
|
||||||
|
|
||||||
return CLUTTER_ACTOR (texture);
|
return CLUTTER_ACTOR (texture);
|
||||||
|
break;
|
||||||
|
case ST_ICON_SYMBOLIC:
|
||||||
|
symbolic = g_strconcat (name, "-symbolic", NULL);
|
||||||
|
themed = g_themed_icon_new_with_default_fallbacks ((const gchar*)symbolic);
|
||||||
|
g_free (symbolic);
|
||||||
|
texture = st_texture_cache_load_gicon (cache, themed, size);
|
||||||
|
g_object_unref (themed);
|
||||||
|
|
||||||
|
return CLUTTER_ACTOR (texture);
|
||||||
|
break;
|
||||||
|
case ST_ICON_FULLCOLOR:
|
||||||
|
themed = g_themed_icon_new_with_default_fallbacks (name);
|
||||||
|
texture = st_texture_cache_load_gicon (cache, themed, size);
|
||||||
|
|
||||||
|
return CLUTTER_ACTOR (texture);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,6 +32,13 @@ struct _StTextureCacheClass
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ST_ICON_SYMBOLIC,
|
||||||
|
ST_ICON_FULLCOLOR,
|
||||||
|
ST_ICON_APPLICATION,
|
||||||
|
ST_ICON_DOCUMENT
|
||||||
|
} StIconType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ST_TEXTURE_CACHE_POLICY_NONE,
|
ST_TEXTURE_CACHE_POLICY_NONE,
|
||||||
ST_TEXTURE_CACHE_POLICY_FOREVER
|
ST_TEXTURE_CACHE_POLICY_FOREVER
|
||||||
@ -53,6 +60,7 @@ ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
|
|||||||
|
|
||||||
ClutterActor *st_texture_cache_load_icon_name (StTextureCache *cache,
|
ClutterActor *st_texture_cache_load_icon_name (StTextureCache *cache,
|
||||||
const char *name,
|
const char *name,
|
||||||
|
StIconType icon_type,
|
||||||
gint size);
|
gint size);
|
||||||
|
|
||||||
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
|
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
|
||||||
|
Loading…
Reference in New Issue
Block a user