# HG changeset patch # User Sean Egan # Date 1034120720 0 # Node ID 7703b2689791e8c5529369ca6bd8d1fbd6b04c4c # Parent 851f421a0f8eaec13d7487ef79ae64ed6dcecaad [gaim-migrate @ 3721] Thanks, Chip--this is just temporary--but you get nice Pangonated anti-aliased fonts. Whee! Such fun. committer: Tailor Script diff -r 851f421a0f8e -r 7703b2689791 src/gtkimhtml.c --- a/src/gtkimhtml.c Tue Oct 08 22:54:38 2002 +0000 +++ b/src/gtkimhtml.c Tue Oct 08 23:45:20 2002 +0000 @@ -39,6 +39,8 @@ #include #include +#include + #include "pixmaps/angel.xpm" #include "pixmaps/bigsmile.xpm" #include "pixmaps/burp.xpm" @@ -59,7 +61,7 @@ #define MAX_FONT_SIZE 7 #define POINT_SIZE(x) (_point_sizes [MIN ((x), MAX_FONT_SIZE) - 1]) -static gint _point_sizes [] = { 80, 100, 120, 140, 200, 300, 400 }; +static gint _point_sizes [] = { 8, 10, 12, 14, 20, 30, 40 }; #define DEFAULT_PRE_FACE "courier" @@ -273,7 +275,7 @@ GdkPixmap *pm; GdkBitmap *bm; - GdkFont *font; + PangoFontDescription *font; GdkColor *fore; GdkColor *back; GdkColor *bg; @@ -346,7 +348,7 @@ g_string_free (imhtml->selected_text, TRUE); if (imhtml->default_font) - gdk_font_unref (imhtml->default_font); + pango_font_description_free (imhtml->default_font); if (imhtml->default_fg_color) gdk_color_free (imhtml->default_fg_color); if (imhtml->default_bg_color) @@ -355,7 +357,7 @@ gdk_color_free (imhtml->default_hl_color); if (imhtml->default_hlfg_color) gdk_color_free (imhtml->default_hlfg_color); - + gdk_cursor_destroy (imhtml->hand_cursor); gdk_cursor_destroy (imhtml->arrow_cursor); @@ -409,7 +411,8 @@ gdk_window_set_cursor (widget->window, imhtml->arrow_cursor); - imhtml->default_font = gdk_font_ref (gtk_style_get_font (widget->style)); + imhtml->context = gtk_widget_get_pango_context(widget); + imhtml->default_font = pango_font_description_copy(pango_context_get_font_description(imhtml->context)); gdk_window_set_background (widget->window, &widget->style->base [GTK_STATE_NORMAL]); gdk_window_set_background (GTK_LAYOUT (imhtml)->bin_window, @@ -441,6 +444,66 @@ return FALSE; } +/* This is an expensive function! Don't blame me. I only stole it from eel */ +static gint +text_width(PangoContext *context, PangoFontDescription *desc, + const char *text, gint len) +{ + PangoLayout *layout; + int width; + + layout = pango_layout_new(context); + pango_layout_set_font_description(layout, desc); + pango_layout_set_text(layout, text, len); + pango_layout_get_pixel_size(layout, &width, NULL); + + g_object_unref(G_OBJECT(layout)); + + return width; +} + +static gint +string_width(PangoContext *context, PangoFontDescription *desc, + const char *text) +{ + return text_width(context, desc, text, -1); +} + +static void +set_layout_font(PangoLayout *layout, const char *text, guint len, + PangoFontDescription *desc) +{ + PangoAttribute *attr; + PangoAttrList *list; + + if (len == -1) + len = strlen(text); + + attr = pango_attr_font_desc_new(desc); + + attr->start_index = 0; + attr->end_index = len; + + list = pango_attr_list_new(); + pango_attr_list_insert(list, attr); + + pango_layout_set_attributes(layout, list); + pango_attr_list_unref(list); + + pango_layout_set_indent(layout, 0); + pango_layout_set_justify(layout, FALSE); + pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT); +} + +static gint +get_layout_first_baseline(PangoLayout* layout) +{ + PangoLayoutIter* iter = pango_layout_get_iter(layout); + gint result = pango_layout_iter_get_baseline(iter) / PANGO_SCALE; + pango_layout_iter_free(iter); + return result; +} + static void draw_text (GtkIMHtml *imhtml, struct line_info *line) @@ -451,6 +514,8 @@ GdkWindow *window = GTK_LAYOUT (imhtml)->bin_window; gfloat xoff, yoff; GdkColor *bg, *fg; + PangoLayout *layout; + PangoFontMetrics *metrics; gchar *start = NULL, *end = NULL; if (GTK_LAYOUT (imhtml)->freeze_count) @@ -484,7 +549,7 @@ gdk_color_alloc (cmap, bit->back); gdk_gc_set_foreground (gc, bit->back); gdk_draw_rectangle (window, gc, TRUE, line->x - xoff, line->y - yoff, - gdk_string_width (bit->font, line->text), line->height); + string_width (imhtml->context, bit->font, line->text), line->height); bg = bit->back; } @@ -504,12 +569,12 @@ if (start == NULL) x = 0; else - x = gdk_text_width (bit->font, line->text, start - line->text); + x = text_width (imhtml->context, bit->font, line->text, start - line->text); if (end == NULL) end = strchr(line->text, '\0'); - width = gdk_text_width (bit->font, line->text, end - line->text) - x; + width = text_width (imhtml->context, bit->font, line->text, end - line->text) - x; gdk_gc_set_foreground (gc, imhtml->default_hl_color); @@ -538,56 +603,89 @@ gdk_color_alloc (cmap, fg); gdk_gc_set_foreground (gc, fg); } + + metrics = pango_context_get_metrics(imhtml->context, bit->font, NULL); if (start) { int offset = 0; - gdk_draw_text (window, bit->font, gc, line->x - xoff, - line->y - yoff + line->ascent, line->text, start - line->text); - offset = gdk_text_width(bit->font, line->text, start - line->text); + + layout = gtk_widget_create_pango_layout(GTK_WIDGET(imhtml), NULL); + pango_layout_set_text(layout, line->text, start - line->text); + set_layout_font(layout, line->text, start - line->text, bit->font); + gdk_draw_layout(window, gc, line->x - xoff, + line->y - yoff + line->ascent - + get_layout_first_baseline(layout), layout); + g_object_unref(G_OBJECT(layout)); + + offset = text_width (imhtml->context, bit->font, line->text, start - line->text); if (bit->underline || bit->url) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff, line->y - yoff + line->ascent + 1, offset, 1); if (bit->strike) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff, - line->y - yoff + line->ascent - (bit->font->ascent / 2), + line->y - yoff + line->ascent - + ((pango_font_metrics_get_ascent(metrics) / PANGO_SCALE) / 2), offset, 1); gdk_gc_set_foreground (gc, imhtml->default_hlfg_color); - gdk_draw_text (window, bit->font, gc, line->x - xoff + offset, - line->y - yoff + line->ascent, start, end - start); + + layout = gtk_widget_create_pango_layout(GTK_WIDGET(imhtml), NULL); + pango_layout_set_text(layout, start, end - start); + set_layout_font(layout, start, end - start, bit->font); + gdk_draw_layout(window, gc, line->x - xoff + offset, + line->y - yoff + line->ascent - + get_layout_first_baseline(layout), layout); + g_object_unref(G_OBJECT(layout)); + if (bit->underline || bit->url) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff + offset, line->y - yoff + line->ascent + 1, - gdk_text_width(bit->font, line->text, end - start), 1); + text_width (imhtml->context, bit->font, line->text, end - start), 1); if (bit->strike) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff + offset, - line->y - yoff + line->ascent - (bit->font->ascent / 2), - gdk_text_width(bit->font, line->text, end - start), 1); - offset = gdk_text_width(bit->font, line->text, end - line->text); + line->y - yoff + line->ascent - + ((pango_font_metrics_get_ascent(metrics) / PANGO_SCALE) / 2), + text_width (imhtml->context, bit->font, line->text, end - start), 1); + offset = text_width (imhtml->context, bit->font, line->text, end - line->text); gdk_gc_set_foreground (gc, fg); - gdk_draw_string (window, bit->font, gc, line->x - xoff + offset, - line->y - yoff + line->ascent, end); + + layout = gtk_widget_create_pango_layout(GTK_WIDGET(imhtml), end); + set_layout_font(layout, end, -1, bit->font); + gdk_draw_layout(window, gc, line->x - xoff + offset, + line->y - yoff + line->ascent - + get_layout_first_baseline(layout), layout); + + g_object_unref(G_OBJECT(layout)); + if (bit->underline || bit->url) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff + offset, line->y - yoff + line->ascent + 1, - gdk_string_width(bit->font, end), 1); + string_width (imhtml->context, bit->font, end), 1); if (bit->strike) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff + offset, - line->y - yoff + line->ascent - (bit->font->ascent / 2), - gdk_string_width(bit->font, end), 1); + line->y - yoff + line->ascent - + ((pango_font_metrics_get_ascent(metrics) / PANGO_SCALE) / 2), + string_width (imhtml->context, bit->font, end), 1); } else { - gdk_draw_string (window, bit->font, gc, line->x - xoff, - line->y - yoff + line->ascent, line->text); - + layout = gtk_widget_create_pango_layout(GTK_WIDGET(imhtml), line->text); + set_layout_font(layout, line->text, -1, bit->font); + gdk_draw_layout(window, gc, line->x - xoff, + line->y - yoff + line->ascent - + get_layout_first_baseline(layout), layout); + g_object_unref(G_OBJECT(layout)); + if (bit->underline || bit->url) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff, line->y - yoff + line->ascent + 1, - gdk_string_width (bit->font, line->text), 1); + string_width (imhtml->context, bit->font, line->text), 1); if (bit->strike) gdk_draw_rectangle (window, gc, TRUE, line->x - xoff, - line->y - yoff + line->ascent - (bit->font->ascent / 2), - gdk_string_width (bit->font, line->text), 1); + line->y - yoff + line->ascent - + ((pango_font_metrics_get_ascent(metrics) / PANGO_SCALE) / 2), + string_width (imhtml->context, bit->font, line->text), 1); } + pango_font_metrics_unref(metrics); + gdk_color_free (bg); gdk_color_free (fg); @@ -813,9 +911,6 @@ imhtml->default_bg_color = gdk_color_copy (>K_WIDGET (imhtml)->style->base [GTK_STATE_NORMAL]); imhtml->default_hl_color = gdk_color_copy (>K_WIDGET (imhtml)->style->bg [GTK_STATE_SELECTED]); imhtml->default_hlfg_color=gdk_color_copy (>K_WIDGET (imhtml)->style->fg [GTK_STATE_SELECTED]); - if (imhtml->default_font) - gdk_font_unref (imhtml->default_font); - imhtml->default_font = gdk_font_ref (gtk_style_get_font (widget->style)); gdk_window_set_background (widget->window, &widget->style->base [GTK_STATE_NORMAL]); gdk_window_set_background (GTK_LAYOUT (imhtml)->bin_window, &widget->style->base [GTK_STATE_NORMAL]); @@ -1014,7 +1109,8 @@ } static gchar* -get_position (struct line_info *chunk, +get_position (GtkIMHtml *imhtml, + struct line_info *chunk, gint x, gboolean smileys) { @@ -1043,7 +1139,7 @@ return text; for (pos = text; *pos != '\0'; pos++) { - gint char_width = gdk_text_width (chunk->bit->font, pos, 1); + gint char_width = text_width (imhtml->context, chunk->bit->font, pos, 1); if ((width > total) && (width <= total + char_width)) { if (width < total + (char_width / 2)) return pos; @@ -1188,7 +1284,7 @@ switch (selection) { case 0: if (COORDS_IN_CHUNK (startx, starty)) { - new_pos = get_position (chunk, startx, smileys); + new_pos = get_position (imhtml, chunk, startx, smileys); if (!chunk->selected || (chunk->sel_start != new_pos) || (chunk->sel_end != NULL)) @@ -1206,7 +1302,7 @@ if (COORDS_IN_CHUNK (endx, endy)) { if (got_start) { - new_pos = get_position (chunk, endx, smileys); + new_pos = get_position (imhtml, chunk, endx, smileys); if (chunk->sel_end != new_pos) redraw = TRUE; if (chunk->sel_start > new_pos) { @@ -1220,7 +1316,7 @@ if (mode == 1) chunk_select_words (chunk); } else { - new_pos = get_position (chunk, endx, smileys); + new_pos = get_position (imhtml, chunk, endx, smileys); if ( !chunk->selected || (chunk->sel_start != new_pos) || (chunk->sel_end != NULL)) @@ -1247,7 +1343,7 @@ break; case 1: if (!got_start && COORDS_IN_CHUNK (startx, starty)) { - new_pos = get_position (chunk, startx, smileys); + new_pos = get_position (imhtml, chunk, startx, smileys); if ( !chunk->selected || (chunk->sel_end != new_pos) || (chunk->sel_start != chunk->text)) @@ -1260,7 +1356,7 @@ if (mode == 1) chunk_select_words (chunk); } else if (!got_end && COORDS_IN_CHUNK (endx, endy)) { - new_pos = get_position (chunk, endx, smileys); + new_pos = get_position (imhtml, chunk, endx, smileys); if ( !chunk->selected || (chunk->sel_end != new_pos) || (chunk->sel_start != chunk->text)) @@ -1326,7 +1422,7 @@ gboolean smileys = imhtml->smileys; gboolean redraw = FALSE; - new_pos = get_position (chunk, endx, smileys); + new_pos = get_position (imhtml, chunk, endx, smileys); if ((starty < chunk->y) || ((starty < chunk->y + chunk->height) && (startx < endx))) { if (chunk->sel_end != new_pos) @@ -1988,170 +2084,42 @@ #define ENCDNG 14 static const gchar* -gtk_imhtml_get_font_name (GdkFont *font) +gtk_imhtml_get_font_name (PangoFontDescription *font) { - return gdk_x11_font_get_name(font); + return pango_font_description_get_family(font); } -static GdkFont* +static PangoFontDescription * gtk_imhtml_font_load (GtkIMHtml *imhtml, gchar *name, gboolean bold, gboolean italics, gint fontsize) { - GdkFont *default_font = imhtml->default_font; - const gchar *default_name; - gchar **xnames; - gchar **pos; - gchar *tmp = NULL; - GdkFont *ret_font; - gchar *xname; - gchar **xflds; - gchar **newvals; - gchar **names = NULL; - - char *italicstrings[] = {"i","o","*"}; - int italicsind = 0, nameind = 0; - gboolean usebold = TRUE, usesize = TRUE, useregenc = TRUE; + PangoFontDescription *default_font = imhtml->default_font; + PangoFontDescription *ret_font; - /* if we're not changing anything, use the default. this is the common case */ if (!name && !bold && !italics && !fontsize) - return gdk_font_ref (default_font); + return default_font; +// return pango_font_description_copy(default_font); + + ret_font = pango_font_description_copy(default_font); + + if (name) + pango_font_description_set_family(ret_font, name); - /* base things off of the default font name */ - default_name = gtk_imhtml_get_font_name (default_font); - /* the default font name can actually be several names separated by ','. - * This is a fontset... used in foreign encodings. */ - do { - xnames = g_strsplit (default_name, ",", -1); - for (pos = xnames; pos && *pos; pos++) { - gint i, j; - gchar fs[10]; - gchar *garbage; - xname = *pos; - xname = g_strchomp (xname); - xname = g_strchug (xname); - - xflds = g_strsplit (xname, "-", -1); - - /* figure out if we have a valid name. i wish there were an - * easier way for determining how many values g_strplit gave */ - for (i = 0; xflds [i]; i++); - if (i != 15) { - int tmp; - newvals = g_malloc0 (16 * sizeof (gchar *)); - newvals [0] = ""; - for (tmp = 1; tmp < 15; tmp++) - newvals [tmp] = "*"; - } else - newvals = g_memdup (xflds, 16 * sizeof (xflds)); - - /* we force foundry as "*" because i hate them. i should give a better reason. */ - newvals [FNDRY] = "*"; - - /* if it's "*" then it defaults to (nil) anyway. some fonts don't want (nil) */ - if ((i > ADSTYL) && !xflds [ADSTYL][0]) - newvals [ADSTYL] = "*"; - - /* If the font doesn't work the first time, we try it with - * registry and encoding as "*" */ - if (!useregenc) { - newvals [RGSTRY] = "*"; - newvals [ENCDNG] = "*"; - } - /* right. */ - if (usebold && bold) - newvals [WGHT] = "bold"; - else if (!usebold) - newvals [WGHT] = "*"; - - if (italics) - /* We'll try "i" "o" to get italics and then just use "*" */ - newvals [SLANT] = italicstrings[italicsind]; - - if (usesize && fontsize) { - g_snprintf (fs, sizeof (fs), "%d", POINT_SIZE (fontsize)); - newvals [PTSZ] = fs; - newvals [PXLSZ] = "*"; - } else if (!usesize) { - newvals [PTSZ] = "*"; - newvals [PXLSZ] = "*"; - } - - if (name) { - /* we got passed a name. it might be a list of names. */ - gchar **tmp_nms = g_strsplit (name, ",", -1); - for (j = 0; tmp_nms [j]; j++); - names = g_new0 (char *, j + 2); - for (j = 0; tmp_nms [j]; j++) - names [j] = tmp_nms [j]; - g_free (tmp_nms); - /* Put the default font on the array. */ - if (i > FMLY) { - names [j] = g_strdup (xflds [FMLY]); - } - newvals [FMLY] = names[nameind]; - } else if (i > FMLY) { - /* we didn't get a name. we come here if the gtk font name is valid */ - names = g_new0 (gchar *, 2); - names [0] = g_strdup (xflds [FMLY]); - } else { - /* we got fucked */ - names = g_new0 (gchar *, 2); - names [0] = g_strdup ("*"); - } - if (!tmp) - tmp = g_strjoinv("-", newvals); - else { - /* We have to concat the xlfds in the fontset */ - garbage = tmp; - tmp = g_strconcat(garbage, ",", - g_strjoinv ("-", newvals), NULL); - g_free(garbage); - } - g_free (newvals); - g_strfreev (xflds); - } - g_strfreev (xnames); - - if (default_font->type == GDK_FONT_FONT) - ret_font = gdk_font_load (tmp); - else { - /* For some reason, fontsets must end with a single * as an xlfd */ - ret_font = gdk_fontset_load (tmp); - } - /* If the font didn't load, we change some of the xlfds one by one - * to get the closest we can. */ - if (!ret_font) { - if (useregenc) { - useregenc = FALSE; - } else if (italics && italicsind != 2) { - useregenc = TRUE; - italicsind++; - } else if (bold && usebold) { - useregenc = TRUE; - italicsind=0; - usebold = FALSE; - } else if (usesize) { - useregenc = TRUE; - italicsind = 0; - usebold = TRUE; - usesize = FALSE; - } else if (names && names[nameind++]) { - useregenc = TRUE; - italicsind = 0; - usebold = TRUE; - usesize = TRUE; - } else { - ret_font = gdk_font_ref(default_font); - } - } - g_strfreev (names); - names = NULL; - g_free(tmp); - tmp=NULL; - } while (!ret_font); /* Loop with the new options */ + if (italics) + pango_font_description_set_style(ret_font, PANGO_STYLE_ITALIC); + + if (bold) + pango_font_description_set_weight(ret_font, PANGO_WEIGHT_BOLD); + + if (fontsize) + { + pango_font_description_set_size(ret_font, + POINT_SIZE(fontsize) * PANGO_SCALE); + } + return ret_font; } @@ -2278,7 +2246,7 @@ void gtk_imhtml_set_defaults (GtkIMHtml *imhtml, - GdkFont *font, + PangoFontDescription *font, GdkColor *fg_color, GdkColor *bg_color) { @@ -2287,8 +2255,8 @@ if (font) { if (imhtml->default_font) - gdk_font_unref (imhtml->default_font); - imhtml->default_font = gdk_font_ref (font); + pango_font_description_free(imhtml->default_font); + imhtml->default_font = pango_font_description_copy(font); } if (fg_color) { @@ -2378,7 +2346,7 @@ struct line_info *li; struct clickable *uw; struct im_image *img; - + if (height > imhtml->llheight) { diff = height - imhtml->llheight; @@ -2424,20 +2392,23 @@ { struct line_info *li; struct clickable *uw; + PangoFontMetrics *metrics; gint width; if (text) - width = gdk_string_width (bit->font, text); + width = string_width (imhtml->context, bit->font, text); else width = 0; + metrics = pango_context_get_metrics(imhtml->context, bit->font, NULL); + li = g_new0 (struct line_info, 1); li->x = imhtml->x; li->y = imhtml->y; li->width = width; li->height = imhtml->llheight; if (text) - li->ascent = MAX (imhtml->llascent, bit->font->ascent); + li->ascent = MAX (imhtml->llascent, pango_font_metrics_get_ascent(metrics) / PANGO_SCALE); else li->ascent = 0; li->text = text; @@ -2456,6 +2427,8 @@ bit->chunks = g_list_append (bit->chunks, li); imhtml->line = g_list_append (imhtml->line, li); + + pango_font_metrics_unref(metrics); } static void @@ -2498,12 +2471,15 @@ gtk_imhtml_draw_bit (GtkIMHtml *imhtml, GtkIMHtmlBit *bit) { + PangoFontMetrics *metrics; gint width, height; g_return_if_fail (imhtml != NULL); g_return_if_fail (GTK_IS_IMHTML (imhtml)); g_return_if_fail (bit != NULL); + metrics = pango_context_get_metrics(imhtml->context, bit->font, NULL); + if ( ((bit->type == TYPE_TEXT) || ((bit->type == TYPE_SMILEY) && !imhtml->smileys) || ((bit->type == TYPE_COMMENT) && imhtml->comments)) && @@ -2513,12 +2489,12 @@ gboolean seenspace = FALSE; gchar *tmp; - height = bit->font->ascent + bit->font->descent; - width = gdk_string_width (bit->font, bit->text); + height = (pango_font_metrics_get_ascent(metrics) + pango_font_metrics_get_descent(metrics)) / PANGO_SCALE; + width = string_width (imhtml->context, bit->font, bit->text); if ((imhtml->x != 0) && ((imhtml->x + width) > imhtml->xsize)) { gint remain = imhtml->xsize - imhtml->x; - while (gdk_text_width (bit->font, copy, pos) < remain) { + while (text_width (imhtml->context, bit->font, copy, pos) < remain) { if (copy [pos] == ' ') seenspace = TRUE; pos++; @@ -2528,7 +2504,7 @@ tmp = g_strndup (copy, pos); - backwards_update (imhtml, bit, height, bit->font->ascent); + backwards_update (imhtml, bit, height, pango_font_metrics_get_ascent(metrics) / PANGO_SCALE); add_text_renderer (imhtml, bit, tmp); } else pos = 0; @@ -2536,14 +2512,14 @@ new_line (imhtml); } - backwards_update (imhtml, bit, height, bit->font->ascent); + backwards_update (imhtml, bit, height, pango_font_metrics_get_ascent(metrics) / PANGO_SCALE); while (pos < strlen (bit->text)) { - width = gdk_string_width (bit->font, copy + pos); + width = string_width (imhtml->context, bit->font, copy + pos); if (imhtml->x + width > imhtml->xsize) { gint newpos = 0; gint remain = imhtml->xsize - imhtml->x; - while (gdk_text_width (bit->font, copy + pos, newpos) < remain) { + while (text_width (imhtml->context, bit->font, copy + pos, newpos) < remain) { if (copy [pos + newpos] == ' ') seenspace = TRUE; newpos++; @@ -2558,7 +2534,7 @@ tmp = g_strndup (copy + pos, newpos); pos += newpos; - backwards_update (imhtml, bit, height, bit->font->ascent); + backwards_update (imhtml, bit, height, pango_font_metrics_get_ascent(metrics) / PANGO_SCALE); add_text_renderer (imhtml, bit, tmp); seenspace = FALSE; @@ -2566,7 +2542,7 @@ } else { tmp = g_strdup (copy + pos); - backwards_update (imhtml, bit, height, bit->font->ascent); + backwards_update (imhtml, bit, height, pango_font_metrics_get_ascent(metrics) / PANGO_SCALE); add_text_renderer (imhtml, bit, tmp); pos = strlen (bit->text); @@ -2636,6 +2612,8 @@ new_line (imhtml); add_text_renderer (imhtml, bit, NULL); } + + pango_font_metrics_unref(metrics); } void @@ -2739,7 +2717,8 @@ if (((bit->type == TYPE_TEXT) || (bit->type == TYPE_SMILEY) || (bit->type == TYPE_COMMENT)) && (bit->font == NULL)) - bit->font = gdk_font_ref (imhtml->default_font); + bit->font = pango_font_description_copy (imhtml->default_font); +// bit->font = gdk_font_ref (imhtml->default_font); if (bg != NULL) bit->bg = gdk_color_copy (bg); @@ -3539,7 +3518,8 @@ if (bit->text) g_free (bit->text); if (bit->font) - gdk_font_unref (bit->font); + pango_font_description_free(bit->font); + //gdk_font_unref (bit->font); if (bit->fore) gdk_color_free (bit->fore); if (bit->back) diff -r 851f421a0f8e -r 7703b2689791 src/gtkimhtml.h --- a/src/gtkimhtml.h Tue Oct 08 22:54:38 2002 +0000 +++ b/src/gtkimhtml.h Tue Oct 08 23:45:20 2002 +0000 @@ -45,8 +45,9 @@ struct _GtkIMHtml { GtkLayout layout; - GdkFont *default_font; - // PangoFontDescription *default_font; + PangoContext *context; + PangoFontDescription *default_font; + //GdkFont *default_font; GdkColor *default_fg_color; GdkColor *default_bg_color; GdkColor *default_hl_color; @@ -111,8 +112,7 @@ GtkAdjustment *vadj); void gtk_imhtml_set_defaults (GtkIMHtml *imhtml, - GdkFont *font, - //PangoFontDescription *font, + PangoFontDescription *font, GdkColor *fg_color, GdkColor *bg_color);