]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtksymboliccolor.c
Change FSF Address
[~andy/gtk] / gtk / gtksymboliccolor.c
index 8f44966d9209705c473459267ec9e0f4fc033e42..bb4c2b8e898e6202e1d1a0f2ceda974cd36a1c30 100644 (file)
  * 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, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
-#include "gtksymboliccolor.h"
+#include "gtksymboliccolorprivate.h"
 #include "gtkstyleproperties.h"
 #include "gtkintl.h"
 #include "gtkwin32themeprivate.h"
@@ -52,7 +50,8 @@ typedef enum {
   COLOR_TYPE_SHADE,
   COLOR_TYPE_ALPHA,
   COLOR_TYPE_MIX,
-  COLOR_TYPE_WIN32
+  COLOR_TYPE_WIN32,
+  COLOR_TYPE_CURRENT_COLOR
 } ColorType;
 
 struct _GtkSymbolicColor
@@ -235,20 +234,24 @@ gtk_symbolic_color_new_mix (GtkSymbolicColor *color1,
 }
 
 /**
- * gtk_symbolic_color_new_mix: (constructor)
+ * gtk_symbolic_color_new_win32: (constructor)
  * @theme_class: The theme class to pull color from
  * @id: The color id
  *
  * Creates a symbolic color based on the current win32
  * theme.
  *
+ * Note that while this call is available on all platforms
+ * the actual value returned is not reliable on non-win32
+ * platforms.
+ *
  * Returns: A newly created #GtkSymbolicColor
  *
  * Since: 3.4
- **/
+ */
 GtkSymbolicColor *
-gtk_symbolic_color_new_win32 (const gchar        *theme_class,
-                             gint                id)
+gtk_symbolic_color_new_win32 (const gchar *theme_class,
+                              gint         id)
 {
   GtkSymbolicColor *symbolic_color;
 
@@ -263,6 +266,30 @@ gtk_symbolic_color_new_win32 (const gchar        *theme_class,
   return symbolic_color;
 }
 
+/**
+ * _gtk_symbolic_color_get_current_color:
+ *
+ * Gets the color representing the CSS 'currentColor' keyword.
+ * This color will resolve to the color set for the color property.
+ *
+ * Returns: (transfer none): The singleton representing the
+ *     'currentColor' keyword
+ **/
+GtkSymbolicColor *
+_gtk_symbolic_color_get_current_color (void)
+{
+  static GtkSymbolicColor *current_color = NULL;
+
+  if (G_UNLIKELY (current_color == NULL))
+    {
+      current_color = g_slice_new0 (GtkSymbolicColor);
+      current_color->type = COLOR_TYPE_CURRENT_COLOR;
+      current_color->ref_count = 1;
+    }
+
+  return current_color;
+}
+
 /**
  * gtk_symbolic_color_ref:
  * @color: a #GtkSymbolicColor
@@ -502,6 +529,15 @@ _shade_color (GdkRGBA *color,
   *color = temp;
 }
 
+static GtkSymbolicColor *
+resolve_lookup_color (gpointer data, const char *name)
+{
+  if (data == NULL)
+    return NULL;
+
+  return gtk_style_properties_lookup_color (data, name);
+}
+
 /**
  * gtk_symbolic_color_resolve:
  * @color: a #GtkSymbolicColor
@@ -531,6 +567,22 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
   g_return_val_if_fail (resolved_color != NULL, FALSE);
   g_return_val_if_fail (props == NULL || GTK_IS_STYLE_PROPERTIES (props), FALSE);
 
+  return _gtk_symbolic_color_resolve_full (color,
+                                           resolve_lookup_color,
+                                           props,
+                                           resolved_color);
+}
+
+gboolean
+_gtk_symbolic_color_resolve_full (GtkSymbolicColor           *color,
+                                  GtkSymbolicColorLookupFunc  func,
+                                  gpointer                    data,
+                                  GdkRGBA                    *resolved_color)
+{
+  g_return_val_if_fail (color != NULL, FALSE);
+  g_return_val_if_fail (resolved_color != NULL, FALSE);
+  g_return_val_if_fail (func != NULL, FALSE);
+
   switch (color->type)
     {
     case COLOR_TYPE_LITERAL:
@@ -540,15 +592,12 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
       {
         GtkSymbolicColor *named_color;
 
-        if (props == NULL)
-          return FALSE;
-
-        named_color = gtk_style_properties_lookup_color (props, color->name);
+        named_color = func (data, color->name);
 
         if (!named_color)
           return FALSE;
 
-        return gtk_symbolic_color_resolve (named_color, props, resolved_color);
+        return _gtk_symbolic_color_resolve_full (named_color, func, data, resolved_color);
       }
 
       break;
@@ -556,7 +605,7 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
       {
         GdkRGBA shade;
 
-        if (!gtk_symbolic_color_resolve (color->shade.color, props, &shade))
+        if (!_gtk_symbolic_color_resolve_full (color->shade.color, func, data, &shade))
           return FALSE;
 
         _shade_color (&shade, color->shade.factor);
@@ -570,7 +619,7 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
       {
         GdkRGBA alpha;
 
-        if (!gtk_symbolic_color_resolve (color->alpha.color, props, &alpha))
+        if (!_gtk_symbolic_color_resolve_full (color->alpha.color, func, data, &alpha))
           return FALSE;
 
         *resolved_color = alpha;
@@ -582,10 +631,10 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
       {
         GdkRGBA color1, color2;
 
-        if (!gtk_symbolic_color_resolve (color->mix.color1, props, &color1))
+        if (!_gtk_symbolic_color_resolve_full (color->mix.color1, func, data, &color1))
           return FALSE;
 
-        if (!gtk_symbolic_color_resolve (color->mix.color2, props, &color2))
+        if (!_gtk_symbolic_color_resolve_full (color->mix.color2, func, data, &color2))
           return FALSE;
 
         resolved_color->red = CLAMP (color1.red + ((color2.red - color1.red) * color->mix.factor), 0, 1);
@@ -602,6 +651,9 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
                                             color->win32.id,
                                             resolved_color);
 
+      break;
+    case COLOR_TYPE_CURRENT_COLOR:
+      return FALSE;
       break;
     default:
       g_assert_not_reached ();
@@ -675,6 +727,9 @@ gtk_symbolic_color_to_string (GtkSymbolicColor *color)
                             color->win32.theme_class, color->win32.id);
       }
       break;
+    case COLOR_TYPE_CURRENT_COLOR:
+      s = g_strdup ("currentColor");
+      break;
     default:
       g_assert_not_reached ();
     }