From bcff6a22baa9e87b406416e83d7775720d38ca99 Mon Sep 17 00:00:00 2001 From: Marijn van Vliet Date: Tue, 17 Nov 2009 11:49:15 +0000 Subject: [PATCH] Integrated the glk_data->default_font_desc and glk_data->monospace_font_desc fields with the style system. Textgrid calculations now follow the syles overrides given in the CSS file. git-svn-id: http://lassie.dyndns-server.com/svn/gargoyle-gtk@170 ddfedd41-794f-dd11-ae45-00112f111e67 --- libchimara/style.c | 80 +++++++++++++++++++++++++++++++++++++++++---- libchimara/style.h | 1 + libchimara/window.c | 8 ++--- 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/libchimara/style.c b/libchimara/style.c index 5b388f1..034dfd5 100644 --- a/libchimara/style.c +++ b/libchimara/style.c @@ -84,6 +84,8 @@ style_init_textbuffer(GtkTextBuffer *buffer) if( G_UNLIKELY(!glk_data->style_initialized) ) { style_init(); } + + /* 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)); } @@ -97,6 +99,8 @@ style_init_textgrid(GtkTextBuffer *buffer) if( G_UNLIKELY(!glk_data->style_initialized) ) { style_init(); } + + /* 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)); } @@ -183,8 +187,10 @@ style_init() scanner->config->cpair_comment_single = NULL; scanner->config->scan_float = FALSE; - /* Initialise the default styles */ - g_hash_table_insert(default_text_grid_styles, "normal", gtk_text_tag_new("normal")); + /* Initialise the default styles for a text grid */ + tag = gtk_text_tag_new("normal"); + g_object_set(tag, "font-desc", glk_data->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); @@ -195,11 +201,11 @@ style_init() g_hash_table_insert(default_text_grid_styles, "preformatted", tag); tag = gtk_text_tag_new("header"); - g_object_set(tag, "size-points", 18.0, "weight", PANGO_WEIGHT_BOLD, NULL); + 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, "size-points", 14.0, "weight", PANGO_WEIGHT_BOLD, NULL); + 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"); @@ -211,14 +217,50 @@ style_init() g_hash_table_insert(default_text_grid_styles, "note", tag); tag = gtk_text_tag_new("block-quote"); - g_object_set(tag, "justification", GTK_JUSTIFY_CENTER, "style", PANGO_STYLE_ITALIC, NULL); + g_object_set(tag, "style", PANGO_STYLE_ITALIC, 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")); - g_hash_table_foreach(default_text_grid_styles, style_table_copy, default_text_buffer_styles); + /* Tags for the textbuffer */ + tag = gtk_text_tag_new("normal"); + g_object_set(tag, "font-desc", glk_data->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", glk_data->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, 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")); + glk_data->default_styles->text_grid = default_text_grid_styles; glk_data->default_styles->text_buffer = default_text_buffer_styles; @@ -774,3 +816,29 @@ glk_style_measure(winid_t win, glui32 styl, glui32 hint, glui32 *result) return TRUE; } + +/* Internal function returning the current default font for a window type + * This can be used later for size calculations. Only wintype_TextGrid and wintype_TextBuffer are + * supported for now */ +PangoFontDescription* +get_current_font(guint32 wintype) +{ + ChimaraGlkPrivate *glk_data = g_private_get(glk_data_key); + GtkTextTag *normal; + + switch(wintype) { + case wintype_TextGrid: + normal = g_hash_table_lookup(glk_data->default_styles->text_grid, "normal"); + break; + case wintype_TextBuffer: + normal = g_hash_table_lookup(glk_data->default_styles->text_buffer, "normal"); + break; + default: + return NULL; + } + + PangoFontDescription *font; + g_object_get( G_OBJECT(normal), "font-desc", &font, NULL ); + + return font; +} diff --git a/libchimara/style.h b/libchimara/style.h index 7b56760..9a16c1a 100644 --- a/libchimara/style.h +++ b/libchimara/style.h @@ -14,6 +14,7 @@ G_GNUC_INTERNAL void style_init_textbuffer(GtkTextBuffer *buffer); G_GNUC_INTERNAL void style_init_textgrid(GtkTextBuffer *buffer); G_GNUC_INTERNAL void style_init(); +G_GNUC_INTERNAL PangoFontDescription* get_current_font(guint32 wintype); typedef struct StyleSet { GHashTable *text_grid; diff --git a/libchimara/window.c b/libchimara/window.c index 87264c1..5740690 100644 --- a/libchimara/window.c +++ b/libchimara/window.c @@ -475,14 +475,14 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, gtk_widget_show(textview); /* Set the window's font */ - gtk_widget_modify_font(textview, glk_data->monospace_font_desc); + gtk_widget_modify_font( textview, get_current_font(wintype) ); win->widget = textview; win->frame = textview; /* Determine the size of a "0" character in pixels */ PangoLayout *zero = gtk_widget_create_pango_layout(textview, "0"); - pango_layout_set_font_description(zero, glk_data->monospace_font_desc); + pango_layout_set_font_description( zero, get_current_font(wintype) ); pango_layout_get_pixel_size(zero, &(win->unit_width), &(win->unit_height)); g_object_unref(zero); /* width and height are set later */ @@ -520,14 +520,14 @@ glk_window_open(winid_t split, glui32 method, glui32 size, glui32 wintype, gtk_widget_show_all(scrolledwindow); /* Set the window's font */ - gtk_widget_modify_font(textview, glk_data->default_font_desc); + gtk_widget_modify_font( textview, get_current_font(wintype) ); win->widget = textview; win->frame = scrolledwindow; /* Determine the size of a "0" character in pixels */ PangoLayout *zero = gtk_widget_create_pango_layout(textview, "0"); - pango_layout_set_font_description(zero, glk_data->default_font_desc); + pango_layout_set_font_description( zero, get_current_font(wintype) ); pango_layout_get_pixel_size(zero, &(win->unit_width), &(win->unit_height)); g_object_unref(zero); -- 2.30.2