diff --git a/src/st/st-icon.c b/src/st/st-icon.c
index c9e29ee3f..122999893 100644
--- a/src/st/st-icon.c
+++ b/src/st/st-icon.c
@@ -31,6 +31,7 @@
#include "st-texture-cache.h"
#include "st-theme-context.h"
#include "st-private.h"
+#include "st-image-content-private.h"
enum
{
@@ -43,6 +44,8 @@ enum
PROP_ICON_SIZE,
PROP_FALLBACK_ICON_NAME,
+ PROP_IS_SYMBOLIC,
+
N_PROPS
};
@@ -62,6 +65,7 @@ struct _StIconPrivate
GIcon *fallback_gicon;
gboolean needs_update;
gboolean is_themed;
+ gboolean is_symbolic;
StIconColors *colors;
@@ -155,6 +159,10 @@ st_icon_get_property (GObject *gobject,
g_value_set_string (value, st_icon_get_fallback_icon_name (icon));
break;
+ case PROP_IS_SYMBOLIC:
+ g_value_set_boolean (value, st_icon_get_is_symbolic (icon));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
@@ -359,6 +367,18 @@ st_icon_class_init (StIconClass *klass)
NULL,
ST_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+ /**
+ * StIcon:symbolic:
+ *
+ * Whether the #StIcon is symbolic.
+ */
+ props[PROP_IS_SYMBOLIC] =
+ g_param_spec_boolean ("is-symbolic",
+ "Is Symbolic",
+ "Whether the icon is symbolic",
+ FALSE,
+ ST_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY);
+
g_object_class_install_properties (object_class, N_PROPS, props);
}
@@ -428,12 +448,33 @@ st_icon_update_shadow_pipeline (StIcon *icon)
}
}
+static void
+st_icon_update_is_symbolic (StIcon *icon)
+{
+ StIconPrivate *priv = icon->priv;
+ gboolean is_symbolic = FALSE;
+ ClutterContent *content = NULL;
+
+ if (priv->icon_texture)
+ content = clutter_actor_get_content (priv->icon_texture);
+
+ if (ST_IS_IMAGE_CONTENT (content))
+ is_symbolic = st_image_content_get_is_symbolic (ST_IMAGE_CONTENT (content));
+
+ if (priv->is_symbolic != is_symbolic)
+ {
+ priv->is_symbolic = is_symbolic;
+ g_object_notify_by_pspec (G_OBJECT (icon), props[PROP_IS_SYMBOLIC]);
+ }
+}
+
static void
on_content_changed (ClutterActor *actor,
GParamSpec *pspec,
StIcon *icon)
{
st_icon_clear_shadow_pipeline (icon);
+ st_icon_update_is_symbolic (icon);
}
static void
@@ -459,6 +500,7 @@ st_icon_finish_update (StIcon *icon)
g_object_unref (priv->icon_texture);
st_icon_clear_shadow_pipeline (icon);
+ st_icon_update_is_symbolic (icon);
g_signal_connect_object (priv->icon_texture, "notify::content",
G_CALLBACK (on_content_changed), icon, 0);
@@ -879,3 +921,17 @@ st_icon_set_fallback_icon_name (StIcon *icon,
g_object_thaw_notify (G_OBJECT (icon));
}
+
+/**
+ * st_icon_get_is_symbolic:
+ * @icon: an #StIcon
+ *
+ * Returns: Whether the displayed icon is symbolic
+ */
+gboolean
+st_icon_get_is_symbolic (StIcon *icon)
+{
+ g_return_val_if_fail (ST_IS_ICON (icon), FALSE);
+
+ return icon->priv->is_symbolic;
+}
diff --git a/src/st/st-icon.h b/src/st/st-icon.h
index 8714ef931..2b27ec8af 100644
--- a/src/st/st-icon.h
+++ b/src/st/st-icon.h
@@ -76,6 +76,8 @@ gint st_icon_get_icon_size (StIcon *icon);
void st_icon_set_icon_size (StIcon *icon,
gint size);
+gboolean st_icon_get_is_symbolic (StIcon *icon);
+
G_END_DECLS
#endif /* _ST_ICON */
diff --git a/src/st/st-image-content-private.h b/src/st/st-image-content-private.h
new file mode 100644
index 000000000..b68082af8
--- /dev/null
+++ b/src/st/st-image-content-private.h
@@ -0,0 +1,30 @@
+/*
+ * st-image-content-private.h: Private StImageContent methods
+ *
+ * Copyright 2024 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include "st-image-content.h"
+
+G_BEGIN_DECLS
+
+void st_image_content_set_is_symbolic (StImageContent *content,
+ gboolean is_symbolic);
+
+gboolean st_image_content_get_is_symbolic (StImageContent *content);
+
+G_END_DECLS
diff --git a/src/st/st-image-content.c b/src/st/st-image-content.c
index 01a39f4f2..9ab48f96e 100644
--- a/src/st/st-image-content.c
+++ b/src/st/st-image-content.c
@@ -18,7 +18,7 @@
* along with this program. If not, see .
*/
-#include "st-image-content.h"
+#include "st-image-content-private.h"
#include "st-private.h"
#include
@@ -34,6 +34,7 @@ struct _StImageContentPrivate
{
int width;
int height;
+ gboolean is_symbolic;
};
enum
@@ -346,3 +347,26 @@ st_image_content_new_with_preferred_size (int width,
"preferred-height", height,
NULL);
}
+
+void
+st_image_content_set_is_symbolic (StImageContent *content,
+ gboolean is_symbolic)
+{
+ StImageContentPrivate *priv;
+
+ g_return_if_fail (ST_IS_IMAGE_CONTENT (content));
+
+ priv = st_image_content_get_instance_private (content);
+ priv->is_symbolic = is_symbolic;
+}
+
+gboolean
+st_image_content_get_is_symbolic (StImageContent *content)
+{
+ StImageContentPrivate *priv;
+
+ g_return_val_if_fail (ST_IS_IMAGE_CONTENT (content), FALSE);
+
+ priv = st_image_content_get_instance_private (content);
+ return priv->is_symbolic;
+}
diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c
index b93db94b5..a137480ad 100644
--- a/src/st/st-texture-cache.c
+++ b/src/st/st-texture-cache.c
@@ -21,7 +21,7 @@
#include "config.h"
-#include "st-image-content.h"
+#include "st-image-content-private.h"
#include "st-texture-cache.h"
#include "st-private.h"
#include "st-settings.h"
@@ -724,6 +724,10 @@ finish_texture_load (AsyncTextureLoadData *data,
goto out;
}
+ if (data->icon_info)
+ st_image_content_set_is_symbolic (ST_IMAGE_CONTENT (image),
+ st_icon_info_is_symbolic (data->icon_info));
+
for (iter = data->actors; iter; iter = iter->next)
{
ClutterActor *actor = iter->data;