forked from AuroraMiddleware/gtk
dd83f9ca86
This API was only used in GtkModifierStyle and GtkStyleProperties and they are both on their way out. CSS properties must now be set using strings via the regular parser API.
278 lines
8.5 KiB
C
278 lines
8.5 KiB
C
/*
|
|
* Copyright © 2011 Red Hat Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that 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 library. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Authors: Benjamin Otte <otte@gnome.org>
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include "gtkcsscustompropertyprivate.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include "gtkcssstylefuncsprivate.h"
|
|
#include "gtkcsstypedvalueprivate.h"
|
|
|
|
#include "deprecated/gtksymboliccolor.h"
|
|
|
|
G_DEFINE_TYPE (GtkCssCustomProperty, _gtk_css_custom_property, GTK_TYPE_CSS_STYLE_PROPERTY)
|
|
|
|
static GtkCssValue *
|
|
gtk_css_custom_property_parse_value (GtkStyleProperty *property,
|
|
GtkCssParser *parser)
|
|
{
|
|
_gtk_css_parser_error_full (parser,
|
|
GTK_CSS_PROVIDER_ERROR_NAME,
|
|
"Custom CSS properties are no longer supported.");
|
|
return NULL;
|
|
}
|
|
|
|
static void
|
|
gtk_css_custom_property_query (GtkStyleProperty *property,
|
|
GValue *value,
|
|
GtkStyleQueryFunc query_func,
|
|
gpointer query_data)
|
|
{
|
|
GtkCssStyleProperty *style = GTK_CSS_STYLE_PROPERTY (property);
|
|
GtkCssCustomProperty *custom = GTK_CSS_CUSTOM_PROPERTY (property);
|
|
GtkCssValue *css_value;
|
|
|
|
css_value = (* query_func) (_gtk_css_style_property_get_id (style), query_data);
|
|
if (css_value == NULL)
|
|
css_value = _gtk_css_style_property_get_initial_value (style);
|
|
|
|
g_value_init (value, custom->pspec->value_type);
|
|
g_value_copy (_gtk_css_typed_value_get (css_value), value);
|
|
}
|
|
|
|
static void
|
|
_gtk_css_custom_property_class_init (GtkCssCustomPropertyClass *klass)
|
|
{
|
|
GtkStylePropertyClass *property_class = GTK_STYLE_PROPERTY_CLASS (klass);
|
|
|
|
property_class->parse_value = gtk_css_custom_property_parse_value;
|
|
property_class->query = gtk_css_custom_property_query;
|
|
}
|
|
|
|
static void
|
|
_gtk_css_custom_property_init (GtkCssCustomProperty *custom)
|
|
{
|
|
}
|
|
|
|
static GtkCssValue *
|
|
gtk_css_custom_property_create_initial_value (GParamSpec *pspec)
|
|
{
|
|
GValue value = G_VALUE_INIT;
|
|
GtkCssValue *result;
|
|
|
|
g_value_init (&value, pspec->value_type);
|
|
|
|
|
|
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
|
if (pspec->value_type == PANGO_TYPE_FONT_DESCRIPTION)
|
|
g_value_take_boxed (&value, pango_font_description_from_string ("Sans 10"));
|
|
else if (pspec->value_type == GDK_TYPE_RGBA)
|
|
{
|
|
GdkRGBA color;
|
|
gdk_rgba_parse (&color, "pink");
|
|
g_value_set_boxed (&value, &color);
|
|
}
|
|
else if (pspec->value_type == GDK_TYPE_COLOR)
|
|
{
|
|
GdkColor color;
|
|
gdk_color_parse ("pink", &color);
|
|
g_value_set_boxed (&value, &color);
|
|
}
|
|
else if (pspec->value_type == GTK_TYPE_BORDER)
|
|
{
|
|
g_value_take_boxed (&value, gtk_border_new ());
|
|
}
|
|
else
|
|
g_param_value_set_default (pspec, &value);
|
|
G_GNUC_END_IGNORE_DEPRECATIONS
|
|
|
|
result = _gtk_css_typed_value_new (&value);
|
|
g_value_unset (&value);
|
|
|
|
return result;
|
|
}
|
|
|
|
/* Property registration functions */
|
|
|
|
/**
|
|
* gtk_theming_engine_register_property: (skip)
|
|
* @name_space: namespace for the property name
|
|
* @parse_func: (nullable): parsing function to use, or %NULL
|
|
* @pspec: the #GParamSpec for the new property
|
|
*
|
|
* Registers a property so it can be used in the CSS file format,
|
|
* on the CSS file the property will look like
|
|
* "-${@name_space}-${property_name}". being
|
|
* ${property_name} the given to @pspec. @name_space will usually
|
|
* be the theme engine name.
|
|
*
|
|
* For any type a @parse_func may be provided, being this function
|
|
* used for turning any property value (between “:” and “;”) in
|
|
* CSS to the #GValue needed. For basic types there is already
|
|
* builtin parsing support, so %NULL may be provided for these
|
|
* cases.
|
|
*
|
|
* Engines must ensure property registration happens exactly once,
|
|
* usually GTK+ deals with theming engines as singletons, so this
|
|
* should be guaranteed to happen once, but bear this in mind
|
|
* when creating #GtkThemeEngines yourself.
|
|
*
|
|
* In order to make use of the custom registered properties in
|
|
* the CSS file, make sure the engine is loaded first by specifying
|
|
* the engine property, either in a previous rule or within the same
|
|
* one.
|
|
* |[
|
|
* * {
|
|
* engine: someengine;
|
|
* -SomeEngine-custom-property: 2;
|
|
* }
|
|
* ]|
|
|
*
|
|
* Since: 3.0
|
|
*
|
|
* Deprecated: 3.8: Code should use the default properties provided by CSS.
|
|
**/
|
|
void
|
|
gtk_theming_engine_register_property (const gchar *name_space,
|
|
GtkStylePropertyParser parse_func,
|
|
GParamSpec *pspec)
|
|
{
|
|
GtkCssCustomProperty *node;
|
|
GtkCssValue *initial;
|
|
gchar *name;
|
|
|
|
g_return_if_fail (name_space != NULL);
|
|
g_return_if_fail (strchr (name_space, ' ') == NULL);
|
|
g_return_if_fail (G_IS_PARAM_SPEC (pspec));
|
|
|
|
name = g_strdup_printf ("-%s-%s", name_space, pspec->name);
|
|
|
|
/* This also initializes the default properties */
|
|
if (_gtk_style_property_lookup (pspec->name))
|
|
{
|
|
g_warning ("a property with name '%s' already exists", name);
|
|
g_free (name);
|
|
return;
|
|
}
|
|
|
|
initial = gtk_css_custom_property_create_initial_value (pspec);
|
|
|
|
node = g_object_new (GTK_TYPE_CSS_CUSTOM_PROPERTY,
|
|
"initial-value", initial,
|
|
"name", name,
|
|
"value-type", pspec->value_type,
|
|
NULL);
|
|
node->pspec = pspec;
|
|
node->property_parse_func = parse_func;
|
|
|
|
_gtk_css_value_unref (initial);
|
|
g_free (name);
|
|
}
|
|
|
|
/**
|
|
* gtk_style_properties_register_property: (skip)
|
|
* @parse_func: (nullable): parsing function to use, or %NULL
|
|
* @pspec: the #GParamSpec for the new property
|
|
*
|
|
* Registers a property so it can be used in the CSS file format.
|
|
* This function is the low-level equivalent of
|
|
* gtk_theming_engine_register_property(), if you are implementing
|
|
* a theming engine, you want to use that function instead.
|
|
*
|
|
* Since: 3.0
|
|
*
|
|
* Deprecated: 3.8: Code should use the default properties provided by CSS.
|
|
**/
|
|
void
|
|
gtk_style_properties_register_property (GtkStylePropertyParser parse_func,
|
|
GParamSpec *pspec)
|
|
{
|
|
GtkCssCustomProperty *node;
|
|
GtkCssValue *initial;
|
|
|
|
g_return_if_fail (G_IS_PARAM_SPEC (pspec));
|
|
|
|
/* This also initializes the default properties */
|
|
if (_gtk_style_property_lookup (pspec->name))
|
|
{
|
|
g_warning ("a property with name '%s' already exists", pspec->name);
|
|
return;
|
|
}
|
|
|
|
initial = gtk_css_custom_property_create_initial_value (pspec);
|
|
|
|
node = g_object_new (GTK_TYPE_CSS_CUSTOM_PROPERTY,
|
|
"initial-value", initial,
|
|
"name", pspec->name,
|
|
"value-type", pspec->value_type,
|
|
NULL);
|
|
node->pspec = pspec;
|
|
node->property_parse_func = parse_func;
|
|
|
|
_gtk_css_value_unref (initial);
|
|
}
|
|
|
|
/**
|
|
* gtk_style_properties_lookup_property: (skip)
|
|
* @property_name: property name to look up
|
|
* @parse_func: (out): return location for the parse function
|
|
* @pspec: (out) (transfer none): return location for the #GParamSpec
|
|
*
|
|
* Returns %TRUE if a property has been registered, if @pspec or
|
|
* @parse_func are not %NULL, the #GParamSpec and parsing function
|
|
* will be respectively returned.
|
|
*
|
|
* Returns: %TRUE if the property is registered, %FALSE otherwise
|
|
*
|
|
* Since: 3.0
|
|
*
|
|
* Deprecated: 3.8: This code could only look up custom properties and
|
|
* those are deprecated.
|
|
**/
|
|
gboolean
|
|
gtk_style_properties_lookup_property (const gchar *property_name,
|
|
GtkStylePropertyParser *parse_func,
|
|
GParamSpec **pspec)
|
|
{
|
|
GtkStyleProperty *node;
|
|
gboolean found = FALSE;
|
|
|
|
g_return_val_if_fail (property_name != NULL, FALSE);
|
|
|
|
node = _gtk_style_property_lookup (property_name);
|
|
|
|
if (GTK_IS_CSS_CUSTOM_PROPERTY (node))
|
|
{
|
|
GtkCssCustomProperty *custom = GTK_CSS_CUSTOM_PROPERTY (node);
|
|
|
|
if (pspec)
|
|
*pspec = custom->pspec;
|
|
|
|
if (parse_func)
|
|
*parse_func = custom->property_parse_func;
|
|
|
|
found = TRUE;
|
|
}
|
|
|
|
return found;
|
|
}
|
|
|