summaryrefslogtreecommitdiff
path: root/pango/pangox-fontmap.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2000-06-06 00:49:23 +0000
committerOwen Taylor <otaylor@src.gnome.org>2000-06-06 00:49:23 +0000
commit7d1548546ec01ec01b7d8c9b2d47299e3c77b7ba (patch)
tree6e9faf238b1d9893c04d604f9c1664347aece7dc /pango/pangox-fontmap.c
parent7b428440247958a9c52fe29c4aeeecfd6f43f39b (diff)
downloadpango-7d1548546ec01ec01b7d8c9b2d47299e3c77b7ba.tar.gz
Add a function to free cached information for a particular display. (This
Mon Jun 5 20:45:12 2000 Owen Taylor <otaylor@redhat.com> * pango/pangox-fontmap.c (pango_x_shutdown_display): Add a function to free cached information for a particular display. (This is basically pango_x_fontmap_destroy()) * pango/pangox.c pango/pangox-private.h pango/pangox-fontmap.c: Make a XFont always keep a pointer to (and ref) a fontmap.
Diffstat (limited to 'pango/pangox-fontmap.c')
-rw-r--r--pango/pangox-fontmap.c73
1 files changed, 65 insertions, 8 deletions
diff --git a/pango/pangox-fontmap.c b/pango/pangox-fontmap.c
index 6309387a..2727c0f5 100644
--- a/pango/pangox-fontmap.c
+++ b/pango/pangox-fontmap.c
@@ -161,7 +161,8 @@ static void pango_x_font_map_list_families (PangoFontMap *
gchar ***families,
int *n_families);
-static void pango_x_font_map_read_aliases (PangoXFontMap *xfontmap);
+static void pango_x_fontmap_cache_clear (PangoXFontMap *xfontmap);
+static void pango_x_font_map_read_aliases (PangoXFontMap *xfontmap);
static gint pango_x_get_size (PangoXFontMap *fontmap,
const char *fontname);
@@ -173,6 +174,8 @@ static char * pango_x_get_xlfd_field (const char *fontname,
char *buffer);
static char * pango_x_get_identifier (const char *fontname);
+static PangoFontClass *parent_class; /* Parent class structure for PangoXFontMap */
+
static GType
pango_x_font_map_get_type (void)
{
@@ -215,6 +218,8 @@ pango_x_font_map_class_init (PangoXFontMapClass *class)
GObjectClass *object_class = G_OBJECT_CLASS (class);
PangoFontMapClass *font_map_class = PANGO_FONT_MAP_CLASS (class);
+ parent_class = g_type_class_peek_parent (class);
+
object_class->finalize = pango_x_font_map_finalize;
font_map_class->load_font = pango_x_font_map_load_font;
font_map_class->list_fonts = pango_x_font_map_list_fonts;
@@ -232,6 +237,8 @@ pango_x_font_map_for_display (Display *display)
int num_fonts, i;
int screen;
+ g_return_val_if_fail (display != NULL, NULL);
+
/* Make sure that the type system is initialized */
g_type_init();
@@ -240,9 +247,7 @@ pango_x_font_map_for_display (Display *display)
xfontmap = tmp_list->data;
if (xfontmap->display == display)
- {
- return PANGO_FONT_MAP (xfontmap);
- }
+ return PANGO_FONT_MAP (xfontmap);
}
xfontmap = (PangoXFontMap *)g_type_create_instance (PANGO_TYPE_X_FONT_MAP);
@@ -270,7 +275,6 @@ pango_x_font_map_for_display (Display *display)
pango_x_font_map_read_aliases (xfontmap);
- g_object_ref (G_OBJECT (xfontmap));
fontmaps = g_list_prepend (fontmaps, xfontmap);
/* This is a little screwed up, since different screens on the same display
@@ -279,21 +283,54 @@ pango_x_font_map_for_display (Display *display)
screen = DefaultScreen (xfontmap->display);
xfontmap->resolution = (PANGO_SCALE * 72.27 / 25.4) * ((double) DisplayWidthMM (xfontmap->display, screen) /
DisplayWidth (xfontmap->display, screen));
+
return PANGO_FONT_MAP (xfontmap);
}
+/**
+ * pango_x_shutdown_display:
+ * @display: an X #Display
+ *
+ * Free cached resources for the given X display structure.
+ **/
+void
+pango_x_shutdown_display (Display *display)
+{
+ GList *tmp_list;
+
+ g_return_if_fail (display != NULL);
+
+ tmp_list = fontmaps;
+ while (tmp_list)
+ {
+ PangoXFontMap *xfontmap = tmp_list->data;
+
+ if (xfontmap->display == display)
+ {
+ fontmaps = g_list_delete_link (fontmaps, tmp_list);
+ pango_x_fontmap_cache_clear (xfontmap);
+ g_object_unref (G_OBJECT (xfontmap));
+ }
+
+ tmp_list = tmp_list->next;
+ }
+}
+
static void
pango_x_font_map_finalize (GObject *object)
{
PangoXFontMap *xfontmap = PANGO_X_FONT_MAP (object);
- pango_x_font_cache_free (xfontmap->font_cache);
g_list_foreach (xfontmap->freed_fonts->head, (GFunc)g_object_unref, NULL);
g_queue_free (xfontmap->freed_fonts);
+ pango_x_font_cache_free (xfontmap->font_cache);
+
/* FIXME: Lots more here */
+
+ fontmaps = g_list_remove (fontmaps, xfontmap);
- fontmaps = g_list_remove (fontmaps, object);
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
typedef struct
@@ -492,7 +529,7 @@ pango_x_font_map_load_font (PangoFontMap *fontmap,
if (!result)
{
- PangoXFont *xfont = pango_x_font_new (xfontmap->display, best_match->xlfd, description->size);
+ PangoXFont *xfont = pango_x_font_new (fontmap, best_match->xlfd, description->size);
xfont->fontmap = fontmap;
xfont->entry = best_match;
@@ -1412,6 +1449,15 @@ pango_x_font_map_get_font_cache (PangoFontMap *font_map)
return PANGO_X_FONT_MAP (font_map)->font_cache;
}
+Display *
+pango_x_fontmap_get_display (PangoFontMap *fontmap)
+{
+ g_return_val_if_fail (fontmap != NULL, NULL);
+ g_return_val_if_fail (PANGO_X_IS_FONT_MAP (fontmap), NULL);
+
+ return PANGO_X_FONT_MAP (fontmap)->display;
+}
+
void
pango_x_fontmap_cache_add (PangoFontMap *fontmap,
PangoXFont *xfont)
@@ -1449,3 +1495,14 @@ pango_x_fontmap_cache_remove (PangoFontMap *fontmap,
g_object_unref (G_OBJECT (xfont));
}
+
+static void
+pango_x_fontmap_cache_clear (PangoXFontMap *xfontmap)
+{
+ g_list_foreach (xfontmap->freed_fonts->head, (GFunc)g_object_unref, NULL);
+ g_list_free (xfontmap->freed_fonts->head);
+ xfontmap->freed_fonts->head = NULL;
+ xfontmap->freed_fonts->tail = NULL;
+ xfontmap->freed_fonts->length = 0;
+}
+