Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/gtk-engine/src/olpc_rc_style.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk-engine/src/olpc_rc_style.c')
-rw-r--r--gtk-engine/src/olpc_rc_style.c398
1 files changed, 398 insertions, 0 deletions
diff --git a/gtk-engine/src/olpc_rc_style.c b/gtk-engine/src/olpc_rc_style.c
new file mode 100644
index 0000000..8601bdd
--- /dev/null
+++ b/gtk-engine/src/olpc_rc_style.c
@@ -0,0 +1,398 @@
+#include "olpc_rc_style.h"
+#include "olpc_style.h"
+
+static void olpc_rc_style_init (OlpcRcStyle *style);
+static void olpc_rc_style_class_init (OlpcRcStyleClass *klass);
+static guint olpc_rc_style_parse (GtkRcStyle *rc_style,
+ GtkSettings *settings,
+ GScanner *scanner);
+static void olpc_rc_style_merge (GtkRcStyle *dest,
+ GtkRcStyle *src);
+
+static GtkStyle *olpc_rc_style_create_style (GtkRcStyle *rc_style);
+
+
+static struct
+ {
+ gchar *name;
+ guint token;
+ }
+olpc_rc_symbols[] =
+{
+ { "rect_scrollbar", TOKEN_RECTSCROLLBAR },
+ { "scrollbar_marks", TOKEN_SCROLLBARMARKS },
+ { "scroll_button_marks", TOKEN_SCROLLBUTTONMARKS },
+ { "handlebox_marks", TOKEN_HANDLEBOXMARKS },
+ { "mark_type1", TOKEN_MARKTYPE1 },
+ { "mark_type2", TOKEN_MARKTYPE2 },
+ { "paned_dots", TOKEN_PANEDDOTS },
+
+ { "TRUE", TOKEN_TRUE },
+ { "FALSE", TOKEN_FALSE },
+
+ { "NOTHING", TOKEN_NOTHING },
+ { "SLASH", TOKEN_SLASH },
+ { "INVSLASH", TOKEN_INVSLASH },
+ { "DOT", TOKEN_DOT },
+ { "INVDOT", TOKEN_INVDOT },
+ { "ARROW", TOKEN_ARROW },
+
+ { "FULL", TOKEN_FULL },
+ { "SOME", TOKEN_SOME },
+ { "NONE", TOKEN_NONE },
+
+};
+
+static guint n_olpc_rc_symbols = sizeof(olpc_rc_symbols) / sizeof(olpc_rc_symbols[0]);
+
+static GtkRcStyleClass *olpc_parent_rc_style_class;
+
+GType olpc_type_rc_style = 0;
+
+void
+olpc_rc_style_register_type (GTypeModule *module)
+{
+ static const GTypeInfo object_info =
+ {
+ sizeof (OlpcRcStyleClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) olpc_rc_style_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof (OlpcRcStyle),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) olpc_rc_style_init,
+ };
+
+ olpc_type_rc_style = g_type_module_register_type (module,
+ GTK_TYPE_RC_STYLE,
+ "OlpcRcStyle",
+ &object_info, 0);
+}
+
+static void
+olpc_rc_style_init (OlpcRcStyle *style)
+{
+}
+
+static void
+olpc_rc_style_class_init (OlpcRcStyleClass *klass)
+{
+ GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass);
+
+ olpc_parent_rc_style_class = g_type_class_peek_parent (klass);
+
+ rc_style_class->parse = olpc_rc_style_parse;
+ rc_style_class->merge = olpc_rc_style_merge;
+ rc_style_class->create_style = olpc_rc_style_create_style;
+}
+
+#if 0
+static guint
+olpc_rc_parse_int(GScanner *scanner,
+ GTokenType wanted_token,
+ guint *retval)
+{
+ guint token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != wanted_token)
+ return wanted_token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
+ return wanted_token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_INT)
+ return G_TOKEN_INT;
+
+ *retval = g_scanner_cur_value(scanner).v_int;
+
+ return G_TOKEN_NONE;
+}
+#endif
+
+static guint
+olpc_rc_parse_boolean(GScanner *scanner,
+ GTokenType wanted_token,
+ guint *retval)
+{
+ guint token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != wanted_token)
+ return wanted_token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
+ return G_TOKEN_EQUAL_SIGN;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token == TOKEN_TRUE)
+ *retval = TRUE;
+ else if (token == TOKEN_FALSE)
+ *retval = FALSE;
+ else
+ return TOKEN_TRUE;
+
+ return G_TOKEN_NONE;
+}
+
+static guint
+olpc_rc_parse_marktype(GScanner *scanner,
+ GTokenType wanted_token,
+ guint *retval)
+{
+ guint token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != wanted_token)
+ return wanted_token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
+ return G_TOKEN_EQUAL_SIGN;
+
+ token = g_scanner_get_next_token(scanner);
+ switch (token)
+ {
+ case TOKEN_NOTHING:
+ *retval = MARKS_NOTHING;
+ break;
+ case TOKEN_SLASH:
+ *retval = MARKS_SLASH;
+ break;
+ case TOKEN_INVSLASH:
+ *retval = MARKS_INVSLASH;
+ break;
+ case TOKEN_DOT:
+ *retval = MARKS_DOT;
+ break;
+ case TOKEN_INVDOT:
+ *retval = MARKS_INVDOT;
+ break;
+ case TOKEN_ARROW:
+ *retval = MARKS_ARROW;
+ break;
+ default:
+ return TOKEN_NOTHING;
+ }
+
+ return G_TOKEN_NONE;
+}
+
+static guint
+olpc_rc_parse_paned(GScanner *scanner,
+ GTokenType wanted_token,
+ guint *retval)
+{
+ guint token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != wanted_token)
+ return wanted_token;
+
+ token = g_scanner_get_next_token(scanner);
+ if (token != G_TOKEN_EQUAL_SIGN)
+ return G_TOKEN_EQUAL_SIGN;
+
+ token = g_scanner_get_next_token(scanner);
+ switch (token)
+ {
+ case TOKEN_NONE:
+ *retval = PANED_DOTSNONE;
+ break;
+ case TOKEN_SOME:
+ *retval = PANED_DOTSSOME;
+ break;
+ case TOKEN_FULL:
+ *retval = PANED_DOTSFULL;
+ break;
+ default:
+ return TOKEN_NOTHING;
+ }
+
+ return G_TOKEN_NONE;
+}
+
+static guint
+olpc_rc_style_parse (GtkRcStyle *rc_style,
+ GtkSettings *settings,
+ GScanner *scanner)
+{
+ static GQuark scope_id = 0;
+ OlpcRcStyle *theme_data = OLPC_RC_STYLE (rc_style);
+ guint old_scope;
+ guint token;
+ guint i;
+
+ /* Set up a new scope in this scanner. */
+
+ /*
+ g_print("olpc_rc_parse_rc_style(\"%s\")\n", rc_style->name);
+ */
+ if (!scope_id)
+ scope_id = g_quark_from_string("theme_engine");
+
+ /* If we bail out due to errors, we *don't* reset the scope, so the
+ * error messaging code can make sense of our tokens.
+ */
+ old_scope = g_scanner_set_scope(scanner, scope_id);
+
+ /* Now check if we already added our symbols to this scope
+ * (in some previous call to olpc_rc_parse_rc_style for the
+ * same scanner.
+ */
+
+ if (!g_scanner_lookup_symbol(scanner, olpc_rc_symbols[0].name))
+ {
+ for (i = 0; i < n_olpc_rc_symbols; i++)
+ {
+ g_scanner_scope_add_symbol(scanner, scope_id,
+ olpc_rc_symbols[i].name,
+ GINT_TO_POINTER(olpc_rc_symbols[i].token));
+ }
+ }
+
+ /* We're ready to go, now parse the top level */
+
+ /* theme_data = g_new0(OlpcRcStyle, 1); */
+ theme_data->scrollbar_type = DEFAULT_SCROLLSHAPE;
+ theme_data->scrollbar_marks = DEFAULT_SCROLLBARMARKS;
+ theme_data->scroll_button_marks = DEFAULT_SCROLLBUTTONMARKS;
+ theme_data->handlebox_marks = DEFAULT_HANDLEBOXMARKS;
+ theme_data->mark_type1 = DEFAULT_MARKTYPE1;
+ theme_data->mark_type2 = DEFAULT_MARKTYPE2;
+
+ token = g_scanner_peek_next_token(scanner);
+ while (token != G_TOKEN_RIGHT_CURLY)
+ {
+ switch (token)
+ {
+ case TOKEN_RECTSCROLLBAR:
+ token = olpc_rc_parse_boolean(scanner, TOKEN_RECTSCROLLBAR, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ if (i == FALSE)
+ theme_data->scrollbar_type = SCROLL_SHAPED;
+ else
+ theme_data->scrollbar_type = SCROLL_RECT;
+ break;
+
+ case TOKEN_SCROLLBUTTONMARKS:
+ token = olpc_rc_parse_boolean(scanner, TOKEN_SCROLLBUTTONMARKS, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ if (i == TRUE)
+ theme_data->mark_type2 = MARKS_SLASH;
+ else
+ theme_data->mark_type2 = MARKS_NOTHING;
+ /*
+ if (i == TRUE)
+ theme_data->scroll_button_marks = MARKS_ON;
+ else
+ theme_data->scroll_button_marks = MARKS_OFF;
+ */
+ break;
+
+ case TOKEN_SCROLLBARMARKS:
+ token = olpc_rc_parse_boolean(scanner, TOKEN_SCROLLBARMARKS, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ if (i == TRUE)
+ theme_data->mark_type1 = MARKS_SLASH;
+ else
+ theme_data->mark_type1 = MARKS_NOTHING;
+ /*
+ if (i == TRUE)
+ theme_data->scrollbar_marks = MARKS_ON;
+ else
+ theme_data->scrollbar_marks = MARKS_OFF;
+ */
+ break;
+
+ case TOKEN_HANDLEBOXMARKS:
+ token = olpc_rc_parse_boolean(scanner, TOKEN_HANDLEBOXMARKS, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ if (i == TRUE)
+ theme_data->handlebox_marks = MARKS_ON;
+ else
+ theme_data->handlebox_marks = MARKS_OFF;
+ break;
+
+ case TOKEN_MARKTYPE1:
+ token = olpc_rc_parse_marktype(scanner, TOKEN_MARKTYPE1, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ theme_data->mark_type1 = i;
+ break;
+
+ case TOKEN_MARKTYPE2:
+ token = olpc_rc_parse_marktype(scanner, TOKEN_MARKTYPE2, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ theme_data->mark_type2 = i;
+ break;
+
+ case TOKEN_PANEDDOTS:
+ token = olpc_rc_parse_paned(scanner, TOKEN_PANEDDOTS, &i);
+ if (token != G_TOKEN_NONE)
+ break;
+ theme_data->paned_dots = i;
+ break;
+
+ default:
+ g_scanner_get_next_token(scanner);
+ token = G_TOKEN_RIGHT_CURLY;
+ break;
+ }
+
+ if (token != G_TOKEN_NONE)
+ {
+// g_free(theme_data);
+ return token;
+ }
+ token = g_scanner_peek_next_token(scanner);
+ }
+
+ g_scanner_get_next_token(scanner);
+
+ g_scanner_set_scope(scanner, old_scope);
+
+ return G_TOKEN_NONE;
+}
+
+static void
+olpc_rc_style_merge (GtkRcStyle * dest,
+ GtkRcStyle * src)
+{
+ if (OLPC_IS_RC_STYLE (src)) {
+ OlpcRcStyle *src_data = OLPC_RC_STYLE (src);
+ OlpcRcStyle *dest_data = OLPC_RC_STYLE (dest);
+
+ /*
+ g_print("theme_merge_rc_style(\"%s\", \"%s\")\n", dest->name, src->name);
+ */
+
+ dest_data->scrollbar_type = src_data->scrollbar_type;
+ dest_data->scrollbar_marks = src_data->scrollbar_marks;
+ dest_data->scroll_button_marks = src_data->scroll_button_marks;
+ dest_data->handlebox_marks = src_data->handlebox_marks;
+ dest_data->mark_type1 = src_data->mark_type1;
+ dest_data->mark_type2 = src_data->mark_type2;
+ dest_data->paned_dots = src_data->paned_dots;
+ }
+
+ olpc_parent_rc_style_class->merge (dest, src);
+}
+
+/* Create an empty style suitable to this RC style
+ */
+static GtkStyle *
+olpc_rc_style_create_style (GtkRcStyle *rc_style)
+{
+ return GTK_STYLE (g_object_new (OLPC_TYPE_STYLE, NULL));
+}