+ ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+
+ /* Copy the current text tags to the textbuffer's tag table */
+ g_hash_table_foreach(glk_data->current_styles->text_buffer, style_add_tag_to_textbuffer, gtk_text_buffer_get_tag_table(buffer));
+}
+
+
+/* Internal function: call this to initialize the default styles to a textgrid. */
+void
+style_init_textgrid(GtkTextBuffer *buffer)
+{
+ g_return_if_fail(buffer != NULL);
+
+ ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+
+ /* Copy the current text tags to the textgrid's tag table */
+ g_hash_table_foreach(glk_data->current_styles->text_grid, style_add_tag_to_textbuffer, gtk_text_buffer_get_tag_table(buffer));
+}
+
+/* Internal function used to iterate over the default text tag table, applying them to a textbuffer */
+static void
+style_add_tag_to_textbuffer(gpointer key, gpointer tag, gpointer tag_table)
+{
+ gtk_text_tag_table_add( tag_table, gtk_text_tag_copy(tag) );
+}
+
+/* Internal function used to iterate over a style table, copying it */
+static void
+style_table_copy(gpointer key, gpointer tag, gpointer target_table)
+{
+ g_return_if_fail(key != NULL);
+ g_return_if_fail(tag != NULL);
+ g_return_if_fail(target_table != NULL);
+
+ g_hash_table_insert(target_table, key, gtk_text_tag_copy( GTK_TEXT_TAG(tag) ));
+}
+
+/* Internal function that copies a text tag */
+GtkTextTag *
+gtk_text_tag_copy(GtkTextTag *tag)
+{
+ GtkTextTag *copy;
+
+ g_return_val_if_fail(tag != NULL, NULL);
+
+ copy = gtk_text_tag_new(tag->name);
+ gtk_text_attributes_copy_values(tag->values, copy->values);
+
+ #define _COPY_FLAG(flag) copy->flag = tag->flag
+ _COPY_FLAG (bg_color_set);
+ _COPY_FLAG (bg_color_set);
+ _COPY_FLAG (bg_stipple_set);
+ _COPY_FLAG (fg_color_set);
+ _COPY_FLAG (fg_stipple_set);
+ _COPY_FLAG (justification_set);
+ _COPY_FLAG (left_margin_set);
+ _COPY_FLAG (indent_set);
+ _COPY_FLAG (rise_set);
+ _COPY_FLAG (strikethrough_set);
+ _COPY_FLAG (right_margin_set);
+ _COPY_FLAG (pixels_above_lines_set);
+ _COPY_FLAG (pixels_below_lines_set);
+ _COPY_FLAG (pixels_inside_wrap_set);
+ _COPY_FLAG (tabs_set);
+ _COPY_FLAG (underline_set);
+ _COPY_FLAG (wrap_mode_set);
+ _COPY_FLAG (bg_full_height_set);
+ _COPY_FLAG (invisible_set);
+ _COPY_FLAG (editable_set);
+ _COPY_FLAG (language_set);
+ #undef _COPY_FLAG
+
+ /* Copy the data that was added manually */
+ gpointer reverse_color = g_object_get_data( G_OBJECT(tag), "reverse_color" );
+
+ if(reverse_color)
+ g_object_set_data( G_OBJECT(copy), "reverse_color", reverse_color );
+
+ return copy;
+}
+
+/* Internal function that reads the default styles from a CSS file */
+void
+style_init(ChimaraGlk *glk)
+{
+ CHIMARA_GLK_USE_PRIVATE(glk, priv);
+
+ GHashTable *default_text_grid_styles = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_object_unref);
+ GHashTable *default_text_buffer_styles = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_object_unref);
+ GHashTable *current_text_grid_styles = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_object_unref);
+ GHashTable *current_text_buffer_styles = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_object_unref);
+ GtkTextTag *tag;
+
+ PangoFontDescription *default_font_desc = pango_font_description_from_string("Serif");
+ PangoFontDescription *monospace_font_desc = pango_font_description_from_string("Monospace");
+
+ /* Initialise the default styles for a text grid */
+ tag = gtk_text_tag_new("normal");
+ g_object_set(tag, "font-desc", monospace_font_desc, NULL);
+ g_hash_table_insert(default_text_grid_styles, "normal", tag);
+
+ tag = gtk_text_tag_new("emphasized");
+ g_object_set(tag, "style", PANGO_STYLE_ITALIC, "style-set", TRUE, NULL);
+ g_hash_table_insert(default_text_grid_styles, "emphasized", tag);
+
+ tag = gtk_text_tag_new("preformatted");
+ g_object_set(tag, "font-desc", monospace_font_desc, NULL);
+ g_hash_table_insert(default_text_grid_styles, "preformatted", tag);
+
+ tag = gtk_text_tag_new("header");
+ g_object_set(tag, "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_grid_styles, "header", tag);
+
+ tag = gtk_text_tag_new("subheader");
+ g_object_set(tag, "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_grid_styles, "subheader", tag);
+
+ tag = gtk_text_tag_new("alert");
+ g_object_set(tag, "foreground", "#aa0000", "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_grid_styles, "alert", tag);
+
+ tag = gtk_text_tag_new("note");
+ g_object_set(tag, "foreground", "#aaaa00", "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_grid_styles, "note", tag);
+
+ tag = gtk_text_tag_new("block-quote");
+ g_object_set(tag, "style", PANGO_STYLE_ITALIC, "style-set", TRUE, NULL);
+ g_hash_table_insert(default_text_grid_styles, "block-quote", tag);
+
+ g_hash_table_insert(default_text_grid_styles, "input", gtk_text_tag_new("input"));
+ g_hash_table_insert(default_text_grid_styles, "user1", gtk_text_tag_new("user1"));
+ g_hash_table_insert(default_text_grid_styles, "user2", gtk_text_tag_new("user2"));
+
+ tag = gtk_text_tag_new("hyperlink");
+ g_object_set(tag, "foreground", "#0000ff", "underline", PANGO_UNDERLINE_SINGLE, "underline-set", TRUE, NULL);
+ g_hash_table_insert(default_text_grid_styles, "hyperlink", tag);
+
+ /* Tags for the textbuffer */
+ tag = gtk_text_tag_new("normal");
+ g_object_set(tag, "font-desc", default_font_desc, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "normal", tag);
+
+ tag = gtk_text_tag_new("emphasized");
+ g_object_set(tag, "style", PANGO_STYLE_ITALIC, "style-set", TRUE, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "emphasized", tag);
+
+ tag = gtk_text_tag_new("preformatted");
+ g_object_set(tag, "font-desc", monospace_font_desc, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "preformatted", tag);
+
+ tag = gtk_text_tag_new("header");
+ g_object_set(tag, "size-points", 18.0, "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "header", tag);
+
+ tag = gtk_text_tag_new("subheader");
+ g_object_set(tag, "size-points", 14.0, "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "subheader", tag);
+
+ tag = gtk_text_tag_new("alert");
+ g_object_set(tag, "foreground", "#aa0000", "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "alert", tag);
+
+ tag = gtk_text_tag_new("note");
+ g_object_set(tag, "foreground", "#aaaa00", "weight", PANGO_WEIGHT_BOLD, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "note", tag);
+
+ tag = gtk_text_tag_new("block-quote");
+ g_object_set(tag, "justification", GTK_JUSTIFY_CENTER, "style", PANGO_STYLE_ITALIC, "style-set", TRUE, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "block-quote", tag);
+
+ g_hash_table_insert(default_text_buffer_styles, "input", gtk_text_tag_new("input"));
+ g_hash_table_insert(default_text_buffer_styles, "user1", gtk_text_tag_new("user1"));
+ g_hash_table_insert(default_text_buffer_styles, "user2", gtk_text_tag_new("user2"));
+
+ tag = gtk_text_tag_new("hyperlink");
+ g_object_set(tag, "foreground", "#0000ff", "underline", PANGO_UNDERLINE_SINGLE, "underline-set", TRUE, NULL);
+ g_hash_table_insert(default_text_buffer_styles, "hyperlink", tag);
+
+ GtkTextTag *pager_tag = gtk_text_tag_new("pager");
+ g_object_set(pager_tag, "foreground", "#ffffff", "background", "#000000", NULL);
+ g_hash_table_insert(default_text_buffer_styles, "pager", pager_tag);
+
+ pango_font_description_free(default_font_desc);
+ pango_font_description_free(monospace_font_desc);
+
+ priv->default_styles->text_grid = default_text_grid_styles;
+ priv->default_styles->text_buffer = default_text_buffer_styles;
+ priv->current_styles->text_grid = current_text_grid_styles;
+ priv->current_styles->text_buffer = current_text_buffer_styles;
+
+ /* Set the current style to a copy of the default style */
+ copy_default_styles_to_current_styles(glk);
+
+ text_tag_to_attr_list(pager_tag, priv->pager_attr_list);
+}
+
+/* Reset style tables to the library's internal defaults */
+void
+reset_default_styles(ChimaraGlk *glk)
+{
+ /* TODO: write this function */