From 187e23a5b183d6fea5d7d23bbf35188601a6a612 Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Wed, 5 Jan 2011 14:19:50 -0500 Subject: [PATCH] Fix stylehint size bug The "size" stylehint should use the GtkTextTag "scale" property, not the "size" property - this way, the relative size is independent of the default font size. The bug was that the "size" property should be given in Pango units, not points, but now the "size" property isn't used at all. --- libchimara/style.c | 26 +++++++++++++++++++++++--- tests/test-userstyle.c | 4 ++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/libchimara/style.c b/libchimara/style.c index 9779a37..f7bce7f 100644 --- a/libchimara/style.c +++ b/libchimara/style.c @@ -1,5 +1,6 @@ #include #include +#include #include "chimara-glk-private.h" #include "glk.h" #include "style.h" @@ -214,6 +215,7 @@ gtk_text_tag_copy(GtkTextTag *tag) _COPY_FLAG (invisible_set); _COPY_FLAG (editable_set); _COPY_FLAG (language_set); + _COPY_FLAG (scale_set); #undef _COPY_FLAG /* Copy the data that was added manually */ @@ -732,7 +734,24 @@ apply_stylehint_to_tag(GtkTextTag *tag, GtkTextTag *default_tag, glui32 wintype, break; case stylehint_Size: - g_object_set(tag_object, "size", 14+(2*val), "size-set", TRUE, NULL); + { + gdouble scale = PANGO_SCALE_MEDIUM; + switch(val) { + case -3: scale = PANGO_SCALE_XX_SMALL; break; + case -2: scale = PANGO_SCALE_X_SMALL; break; + case -1: scale = PANGO_SCALE_SMALL; break; + case 0: scale = PANGO_SCALE_MEDIUM; break; + case 1: scale = PANGO_SCALE_LARGE; break; + case 2: scale = PANGO_SCALE_X_LARGE; break; + case 3: scale = PANGO_SCALE_XX_LARGE; break; + default: + /* We follow Pango's convention of having each magnification + step be a scaling of 1.2 */ + scale = pow(1.2, (double)val); + } + g_printerr("Setting tag to %f\n", scale); + g_object_set(tag_object, "scale", scale, "scale-set", TRUE, NULL); + } break; case stylehint_Oblique: @@ -813,6 +832,7 @@ static gint query_tag(GtkTextTag *tag, glui32 wintype, glui32 hint) { gint intval; + gdouble doubleval; GdkColor *colval; g_return_val_if_fail(tag != NULL, 0); @@ -850,8 +870,8 @@ query_tag(GtkTextTag *tag, glui32 wintype, glui32 hint) } case stylehint_Size: - g_object_get(tag, "size", &intval, NULL); - return (intval/2)-14; + g_object_get(tag, "scale", &doubleval, NULL); + return (gint)round(log(doubleval) / log(1.2)); case stylehint_Oblique: g_object_get(tag, "style", &intval , NULL); diff --git a/tests/test-userstyle.c b/tests/test-userstyle.c index c3a32c4..4f7b5f6 100644 --- a/tests/test-userstyle.c +++ b/tests/test-userstyle.c @@ -7,7 +7,7 @@ glk_main(void) { /* Create user style before creating windows */ glk_stylehint_set(wintype_AllTypes, style_User1, stylehint_Size, -1); - glk_stylehint_set(wintype_AllTypes, style_User2, stylehint_Size, 0); + glk_stylehint_set(wintype_AllTypes, style_User2, stylehint_Size, +1); mainwin = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); if(!mainwin) @@ -19,7 +19,7 @@ glk_main(void) glk_set_style(style_Normal); glk_put_string(".\n"); glk_set_style(style_User2); - glk_put_string("This test is in User2 at normal size"); + glk_put_string("This text is in User2 and slightly larger"); glk_set_style(style_Normal); glk_put_string(".\n"); } -- 2.30.2