Implemented output buffering.
[rodin/chimara.git] / libchimara / style.c
index f6093d9a0884c6d3dc5ca8134aaf4326a82506fa..cf20f0ca1ccbe58f77805b96db02016e55a61207 100644 (file)
@@ -3,7 +3,6 @@
 #include <fcntl.h>
 
 extern GPrivate *glk_data_key;
-static gboolean chimara_style_initialized = FALSE;
 
 static gboolean style_accept(GScanner *scanner, GTokenType token);
 static gboolean style_accept_style_selector(GScanner *scanner);
@@ -33,6 +32,20 @@ glk_set_style(glui32 styl)
        glk_set_style_stream(glk_data->current_stream, styl);
 }
 
+static const gchar* TAG_NAMES[] = {
+       "normal",
+       "emphasized",
+       "preformatted",
+       "header",
+       "subheader",
+       "alert",
+       "note",
+       "block-quote",
+       "input",
+       "user1",
+       "user2"
+};
+
 /* Internal function: mapping from style enum to tag name */
 static gchar*
 get_tag_name(glui32 style)
@@ -54,6 +67,10 @@ get_tag_name(glui32 style)
  */
 void
 glk_set_style_stream(strid_t str, glui32 styl) {
+       if(str->window == NULL)
+               return;
+
+       flush_window_buffer(str->window);
        str->style = get_tag_name(styl);
 }
 
@@ -63,11 +80,10 @@ style_init_textbuffer(GtkTextBuffer *buffer)
 {
        g_return_if_fail(buffer != NULL);
 
-       if( G_UNLIKELY(!chimara_style_initialized) ) {
+       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+       if( G_UNLIKELY(!glk_data->style_initialized) ) {
                style_init();
        }
-
-       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
        g_hash_table_foreach(glk_data->current_styles->text_buffer, style_add_tag_to_textbuffer, gtk_text_buffer_get_tag_table(buffer));
 }
 
@@ -76,12 +92,11 @@ void
 style_init_textgrid(GtkTextBuffer *buffer)
 {
        g_return_if_fail(buffer != NULL);
-
-       if( G_UNLIKELY(!chimara_style_initialized) ) {
+       
+       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
+       if( G_UNLIKELY(!glk_data->style_initialized) ) {
                style_init();
        }
-
-       ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
        g_hash_table_foreach(glk_data->current_styles->text_grid, style_add_tag_to_textbuffer, gtk_text_buffer_get_tag_table(buffer));
 }
 
@@ -159,8 +174,8 @@ style_init()
        g_return_if_fail(f != -1);
        g_scanner_input_file(scanner, f);
        scanner->input_name = glk_data->css_file;
-       scanner->config->cset_identifier_first = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#";
-       scanner->config->cset_identifier_nth = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_0123456789";
+       scanner->config->cset_identifier_first = G_CSET_a_2_z G_CSET_A_2_Z "#";
+       scanner->config->cset_identifier_nth = G_CSET_a_2_z G_CSET_A_2_Z "-_" G_CSET_DIGITS;
        scanner->config->symbol_2_token = TRUE;
        scanner->config->cpair_comment_single = NULL;
        scanner->config->scan_float = FALSE;
@@ -218,7 +233,7 @@ style_init()
 
        g_scanner_destroy(scanner);
 
-       chimara_style_initialized = TRUE;
+       glk_data->style_initialized = TRUE;
 }
 
 /* Internal function: parses a token */
@@ -664,7 +679,7 @@ glk_stylehint_set(glui32 wintype, glui32 styl, glui32 hint, glsi32 val)
 {
        ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key);
 
-       if( G_UNLIKELY(!chimara_style_initialized) ) {
+       if( G_UNLIKELY(!glk_data->style_initialized) ) {
                style_init();
        }
 
@@ -680,6 +695,20 @@ glk_stylehint_set(glui32 wintype, glui32 styl, glui32 hint, glsi32 val)
        }
 }
 
+/**
+ * glk_stylehint_clear:
+ * @wintype: The window type to set a style hint on, or %wintype_AllTypes.
+ * @styl: The style to set a hint for.
+ * @hint: The type of style hint, one of the <code>stylehint_</code> constants.
+ *
+ * Resets a hint about the appearance of one style for a particular type of 
+ * window to it's default value. You can also set wintype to %wintype_AllTypes, which resets a hint for 
+ * all types of window.
+ * <note><para>
+ *  There is no equivalent constant to reset a hint for all styles of a single 
+ *  window type.
+ * </para></note>
+ */
 void
 glk_stylehint_clear(glui32 wintype, glui32 styl, glui32 hint)
 {
@@ -699,12 +728,31 @@ glk_stylehint_clear(glui32 wintype, glui32 styl, glui32 hint)
        }
 }
 
+/**
+ * glk_style_distinguish:
+ * @win: The window in which the styles are to be distinguished.
+ * @styl1: The first style to be distinguished from the second style.
+ * @styl2: The second styel to be distinguished from the first style.
+ * 
+ * Returns: TRUE if the two styles are visually distinguishable in the given window.
+ * If they are not, it returns FALSE.
+ */
 glui32
 glk_style_distinguish(winid_t win, glui32 styl1, glui32 styl2)
 {
        return styl1 != styl2;
 }
 
+/**
+ * glk_style_measure:
+ * @win: The window from which to take the style.
+ * @styl: The style to perform the measurement on.
+ * @hint: The stylehint to measure.
+ * @result: Address to write the result to.
+ * 
+ * This function can be used to query the current value of a particular style hint.
+ * Returns: TRUE upon successul retrievel, otherwise FALSE.
+ */
 glui32
 glk_style_measure(winid_t win, glui32 styl, glui32 hint, glui32 *result)
 {