summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtkcssparser.c13
-rw-r--r--gtk/gtksymboliccolor.c54
-rw-r--r--gtk/gtksymboliccolor.h2
-rw-r--r--gtk/gtkwin32theme.c64
-rw-r--r--gtk/gtkwin32themeprivate.h6
5 files changed, 136 insertions, 3 deletions
diff --git a/gtk/gtkcssparser.c b/gtk/gtkcssparser.c
index 2d6a4df3d0..ff44c35748 100644
--- a/gtk/gtkcssparser.c
+++ b/gtk/gtkcssparser.c
@@ -20,6 +20,7 @@
#include "config.h"
#include "gtkcssparserprivate.h"
+#include "gtkwin32themeprivate.h"
#include <errno.h>
#include <string.h>
@@ -575,7 +576,8 @@ typedef enum {
COLOR_DARKER,
COLOR_SHADE,
COLOR_ALPHA,
- COLOR_MIX
+ COLOR_MIX,
+ COLOR_WIN32
} ColorType;
static GtkSymbolicColor *
@@ -644,6 +646,12 @@ gtk_css_parser_read_symbolic_color_function (GtkCssParser *parser,
symbolic = gtk_symbolic_color_new_literal (&rgba);
}
+ else if (color == COLOR_WIN32)
+ {
+ symbolic = _gtk_win32_theme_color_parse (parser);
+ if (symbolic == NULL)
+ return NULL;
+ }
else
{
child1 = _gtk_css_parser_read_symbolic_color (parser);
@@ -769,7 +777,8 @@ _gtk_css_parser_read_symbolic_color (GtkCssParser *parser)
{
GtkSymbolicColor *symbolic;
guint color;
- const char *names[] = {"rgba", "rgb", "lighter", "darker", "shade", "alpha", "mix" };
+ const char *names[] = {"rgba", "rgb", "lighter", "darker", "shade", "alpha", "mix",
+ GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME};
char *name;
g_return_val_if_fail (GTK_IS_CSS_PARSER (parser), NULL);
diff --git a/gtk/gtksymboliccolor.c b/gtk/gtksymboliccolor.c
index 41a81a1cab..8f44966d92 100644
--- a/gtk/gtksymboliccolor.c
+++ b/gtk/gtksymboliccolor.c
@@ -21,6 +21,7 @@
#include "gtksymboliccolor.h"
#include "gtkstyleproperties.h"
#include "gtkintl.h"
+#include "gtkwin32themeprivate.h"
/**
* SECTION:gtksymboliccolor
@@ -50,7 +51,8 @@ typedef enum {
COLOR_TYPE_NAME,
COLOR_TYPE_SHADE,
COLOR_TYPE_ALPHA,
- COLOR_TYPE_MIX
+ COLOR_TYPE_MIX,
+ COLOR_TYPE_WIN32
} ColorType;
struct _GtkSymbolicColor
@@ -75,6 +77,12 @@ struct _GtkSymbolicColor
GtkSymbolicColor *color2;
gdouble factor;
} mix;
+
+ struct
+ {
+ gchar *theme_class;
+ gint id;
+ } win32;
};
};
@@ -227,6 +235,35 @@ gtk_symbolic_color_new_mix (GtkSymbolicColor *color1,
}
/**
+ * gtk_symbolic_color_new_mix: (constructor)
+ * @theme_class: The theme class to pull color from
+ * @id: The color id
+ *
+ * Creates a symbolic color based on the current win32
+ * theme.
+ *
+ * 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_ref:
* @color: a #GtkSymbolicColor
*
@@ -279,6 +316,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;
}
@@ -557,6 +597,12 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color,
}
break;
+ case COLOR_TYPE_WIN32:
+ return _gtk_win32_theme_color_resolve (color->win32.theme_class,
+ color->win32.id,
+ resolved_color);
+
+ break;
default:
g_assert_not_reached ();
}
@@ -623,6 +669,12 @@ 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;
default:
g_assert_not_reached ();
}
diff --git a/gtk/gtksymboliccolor.h b/gtk/gtksymboliccolor.h
index 7be051a866..6bb4e76f7c 100644
--- a/gtk/gtksymboliccolor.h
+++ b/gtk/gtksymboliccolor.h
@@ -42,6 +42,8 @@ GtkSymbolicColor * gtk_symbolic_color_new_alpha (GtkSymbolicColor *color,
GtkSymbolicColor * gtk_symbolic_color_new_mix (GtkSymbolicColor *color1,
GtkSymbolicColor *color2,
gdouble factor);
+GtkSymbolicColor * gtk_symbolic_color_new_win32 (const gchar *theme_class,
+ gint id);
GtkSymbolicColor * gtk_symbolic_color_ref (GtkSymbolicColor *color);
void gtk_symbolic_color_unref (GtkSymbolicColor *color);
diff --git a/gtk/gtkwin32theme.c b/gtk/gtkwin32theme.c
index 5c4720dc5a..fb5bb47903 100644
--- a/gtk/gtkwin32theme.c
+++ b/gtk/gtkwin32theme.c
@@ -490,3 +490,67 @@ _gtk_win32_theme_int_parse (GtkCssParser *parser,
return -1;
}
+
+GtkSymbolicColor *
+_gtk_win32_theme_color_parse (GtkCssParser *parser)
+{
+ GtkSymbolicColor *color;
+ char *class;
+ int id;
+
+ class = _gtk_css_parser_try_name (parser, TRUE);
+ if (class == NULL)
+ {
+ _gtk_css_parser_error (parser,
+ "Expected name as first argument to '-gtk-win32-color'");
+ return NULL;
+ }
+
+ if (! _gtk_css_parser_try (parser, ",", TRUE))
+ {
+ g_free (class);
+ _gtk_css_parser_error (parser,
+ "Expected ','");
+ return NULL;
+ }
+
+ if (!_gtk_css_parser_try_int (parser, &id))
+ {
+ g_free (class);
+ _gtk_css_parser_error (parser, "Expected a valid integer value");
+ return NULL;
+ }
+
+ color = gtk_symbolic_color_new_win32 (class, id);
+ g_free (class);
+ return color;
+}
+
+gboolean
+_gtk_win32_theme_color_resolve (const char *theme_class,
+ gint id,
+ GdkRGBA *color)
+{
+#ifdef G_OS_WIN32
+ DWORD dcolor;
+
+ if (use_xp_theme && get_theme_sys_color != NULL)
+ {
+ HTHEME theme = lookup_htheme_by_classname (theme_class);
+
+ /* if theme is NULL, it will just return the GetSystemColor()
+ value */
+ dcolor = get_theme_sys_color (theme, id);
+ }
+ else
+ dcolor = GetSysColor (id);
+
+ color->alpha = 1.0;
+ color->red = GetRValue (dcolor) / 255.0;
+ color->green = GetGValue (dcolor) / 255.0;
+ color->blue = GetBValue (dcolor) / 255.0;
+#else
+ gdk_rgba_parse (color, "pink");
+#endif
+ return TRUE;
+}
diff --git a/gtk/gtkwin32themeprivate.h b/gtk/gtkwin32themeprivate.h
index 166c67053b..25349d2e37 100644
--- a/gtk/gtkwin32themeprivate.h
+++ b/gtk/gtkwin32themeprivate.h
@@ -26,6 +26,8 @@
G_BEGIN_DECLS
+#define GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME "-gtk-win32-color"
+
typedef struct _GtkWin32ThemePart GtkWin32ThemePart;
#define GTK_TYPE_WIN32_THEME_PART (_gtk_win32_theme_part_get_type ())
@@ -43,6 +45,10 @@ cairo_pattern_t *_gtk_win32_theme_part_render (GtkWin32ThemePart *part,
int _gtk_win32_theme_int_parse (GtkCssParser *parser,
GFile *base,
int *value);
+GtkSymbolicColor *_gtk_win32_theme_color_parse (GtkCssParser *parser);
+gboolean _gtk_win32_theme_color_resolve (const char *theme_class,
+ gint id,
+ GdkRGBA *color);
G_END_DECLS