]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtksymboliccolor.c
Change FSF Address
[~andy/gtk] / gtk / gtksymboliccolor.c
index a359fe1fea18b6f91183ad71dd0bb4e2a311915f..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"
 
 /**
  * SECTION:gtksymboliccolor
@@ -50,7 +49,9 @@ typedef enum {
   COLOR_TYPE_NAME,
   COLOR_TYPE_SHADE,
   COLOR_TYPE_ALPHA,
-  COLOR_TYPE_MIX
+  COLOR_TYPE_MIX,
+  COLOR_TYPE_WIN32,
+  COLOR_TYPE_CURRENT_COLOR
 } ColorType;
 
 struct _GtkSymbolicColor
@@ -75,6 +76,12 @@ struct _GtkSymbolicColor
       GtkSymbolicColor *color2;
       gdouble factor;
     } mix;
+
+    struct
+    {
+      gchar *theme_class;
+      gint id;
+    } win32;
   };
 };
 
@@ -131,7 +138,7 @@ gtk_symbolic_color_new_name (const gchar *name)
 }
 
 /**
- * gtk_symbolic_color_new_shade:
+ * gtk_symbolic_color_new_shade: (constructor)
  * @color: another #GtkSymbolicColor
  * @factor: shading factor to apply to @color
  *
@@ -162,7 +169,7 @@ gtk_symbolic_color_new_shade (GtkSymbolicColor *color,
 }
 
 /**
- * gtk_symbolic_color_new_alpha:
+ * gtk_symbolic_color_new_alpha: (constructor)
  * @color: another #GtkSymbolicColor
  * @factor: factor to apply to @color alpha
  *
@@ -193,7 +200,7 @@ gtk_symbolic_color_new_alpha (GtkSymbolicColor *color,
 }
 
 /**
- * gtk_symbolic_color_new_mix:
+ * gtk_symbolic_color_new_mix: (constructor)
  * @color1: color to mix
  * @color2: another color to mix
  * @factor: mix factor
@@ -226,6 +233,63 @@ gtk_symbolic_color_new_mix (GtkSymbolicColor *color1,
   return symbolic_color;
 }
 
+/**
+ * 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)
+{
+  GtkSymbolicColor *symbolic_color;
+
+  g_return_val_if_fail (theme_class != NULL, NULL);
+
+  symbolic_color = g_slice_new0 (GtkSymbolicColor);
+  symbolic_color->type = COLOR_TYPE_WIN32;
+  symbolic_color->win32.theme_class = g_strdup (theme_class);
+  symbolic_color->win32.id = id;
+  symbolic_color->ref_count = 1;
+
+  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
@@ -279,6 +343,9 @@ gtk_symbolic_color_unref (GtkSymbolicColor *color)
           gtk_symbolic_color_unref (color->mix.color1);
           gtk_symbolic_color_unref (color->mix.color2);
           break;
+        case COLOR_TYPE_WIN32:
+          g_free (color->win32.theme_class);
+          break;
         default:
           break;
         }
@@ -462,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
@@ -474,8 +550,9 @@ _shade_color (GdkRGBA *color,
  * if @color can't be resolved, it is due to it being defined on
  * top of a named color that doesn't exist in @props.
  *
- * @props must be non-%NULL if @color was created using
- * gtk_symbolic_color_named_new(), but can be omitted in other cases.
+ * When @props is %NULL, resolving of named colors will fail, so if
+ * your @color is or references such a color, this function will
+ * return %FALSE.
  *
  * Returns: %TRUE if the color has been resolved
  *
@@ -488,6 +565,23 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
 {
   g_return_val_if_fail (color != NULL, FALSE);
   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)
     {
@@ -498,14 +592,12 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
       {
         GtkSymbolicColor *named_color;
 
-        g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), 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;
@@ -513,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);
@@ -527,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;
@@ -539,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);
@@ -553,6 +645,15 @@ gtk_symbolic_color_resolve (GtkSymbolicColor   *color,
         return TRUE;
       }
 
+      break;
+    case COLOR_TYPE_WIN32:
+      return _gtk_win32_theme_color_resolve (color->win32.theme_class,
+                                            color->win32.id,
+                                            resolved_color);
+
+      break;
+    case COLOR_TYPE_CURRENT_COLOR:
+      return FALSE;
       break;
     default:
       g_assert_not_reached ();
@@ -620,6 +721,15 @@ gtk_symbolic_color_to_string (GtkSymbolicColor *color)
         g_free (color_string2);
       }
       break;
+    case COLOR_TYPE_WIN32:
+      {
+        s = g_strdup_printf (GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME"(%s, %d)", 
+                            color->win32.theme_class, color->win32.id);
+      }
+      break;
+    case COLOR_TYPE_CURRENT_COLOR:
+      s = g_strdup ("currentColor");
+      break;
     default:
       g_assert_not_reached ();
     }