summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-06-06 18:12:48 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-06-06 18:12:48 +0300
commit4c6a8b38970581e7979bfc344122bbfdb9627fee (patch)
tree9b2c3f97e9b5f58a7a755fc8d31d2e2f79fc5542
parentb061881166b1311a3b9b4e535539450b871bd121 (diff)
downloadmetacity-4c6a8b38970581e7979bfc344122bbfdb9627fee.tar.gz
libmetacity: own created title font descriptions
-rw-r--r--libmetacity/meta-theme.c41
-rw-r--r--libmetacity/meta-theme.h2
-rw-r--r--src/ui/frames.c5
-rw-r--r--src/ui/ui.c3
-rw-r--r--theme-viewer/theme-viewer-window.c6
5 files changed, 42 insertions, 15 deletions
diff --git a/libmetacity/meta-theme.c b/libmetacity/meta-theme.c
index 056dc3fb..3f66add5 100644
--- a/libmetacity/meta-theme.c
+++ b/libmetacity/meta-theme.c
@@ -43,6 +43,8 @@ struct _MetaTheme
GHashTable *variants;
PangoContext *context;
+
+ GHashTable *font_descs;
};
enum
@@ -163,6 +165,8 @@ meta_theme_dispose (GObject *object)
g_clear_object (&theme->context);
+ g_clear_pointer (&theme->font_descs, g_hash_table_destroy);
+
G_OBJECT_CLASS (meta_theme_parent_class)->dispose (object);
}
@@ -240,6 +244,9 @@ meta_theme_init (MetaTheme *theme)
theme->variants = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref);
+
+ theme->font_descs = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
+ (GDestroyNotify) pango_font_description_free);
}
/**
@@ -294,6 +301,7 @@ meta_theme_invalidate (MetaTheme *theme)
{
g_hash_table_remove_all (theme->variants);
g_clear_object (&theme->context);
+ g_hash_table_remove_all (theme->font_descs);
}
void
@@ -315,6 +323,8 @@ meta_theme_set_titlebar_font (MetaTheme *theme,
{
pango_font_description_free (theme->titlebar_font);
theme->titlebar_font = pango_font_description_copy (titlebar_font);
+
+ g_hash_table_remove_all (theme->font_descs);
}
MetaFrameStyle *
@@ -435,15 +445,34 @@ meta_theme_create_title_layout (MetaTheme *theme,
return layout;
}
+/**
+ * meta_theme_get_title_font_desc:
+ * @theme: a #MetaTheme
+ * @variant: (nullable): theme variant
+ * @type: frame type
+ * @flags: frame flags
+ *
+ * Returns: (transfer none): the #PangoFontDescription
+ */
PangoFontDescription*
-meta_theme_create_font_desc (MetaTheme *theme,
- const gchar *variant,
- MetaFrameType type,
- MetaFrameFlags flags)
+meta_theme_get_title_font_desc (MetaTheme *theme,
+ const gchar *variant,
+ MetaFrameType type,
+ MetaFrameFlags flags)
{
+ gchar *key;
+ PangoFontDescription *font_desc;
MetaStyleInfo *style_info;
GtkStyleContext *context;
- PangoFontDescription *font_desc;
+
+ key = g_strdup_printf ("%s_%d_%x", variant ? variant : "default", type, flags);
+ font_desc = g_hash_table_lookup (theme->font_descs, key);
+
+ if (font_desc != NULL)
+ {
+ g_free (key);
+ return font_desc;
+ }
style_info = meta_theme_get_style_info (theme, variant);
context = meta_style_info_get_style (style_info, META_STYLE_ELEMENT_TITLE);
@@ -461,6 +490,8 @@ meta_theme_create_font_desc (MetaTheme *theme,
font_desc_apply_scale (font_desc, theme, type, flags);
+ g_hash_table_insert (theme->font_descs, key, font_desc);
+
return font_desc;
}
diff --git a/libmetacity/meta-theme.h b/libmetacity/meta-theme.h
index d3217db1..69f778b3 100644
--- a/libmetacity/meta-theme.h
+++ b/libmetacity/meta-theme.h
@@ -168,7 +168,7 @@ MetaFrameStyle *meta_theme_get_frame_style (MetaTheme
PangoLayout *meta_theme_create_title_layout (MetaTheme *theme,
const gchar *title);
-PangoFontDescription *meta_theme_create_font_desc (MetaTheme *theme,
+PangoFontDescription *meta_theme_get_title_font_desc (MetaTheme *theme,
const gchar *variant,
MetaFrameType type,
MetaFrameFlags flags);
diff --git a/src/ui/frames.c b/src/ui/frames.c
index 1d994567..aaf03a55 100644
--- a/src/ui/frames.c
+++ b/src/ui/frames.c
@@ -443,8 +443,8 @@ meta_frames_ensure_layout (MetaFrames *frames,
int size;
frame->text_layout = meta_theme_create_title_layout (theme, frame->title);
- font_desc = meta_theme_create_font_desc (theme, frame->theme_variant,
- type, flags);
+ font_desc = meta_theme_get_title_font_desc (theme, frame->theme_variant,
+ type, flags);
size = pango_font_description_get_size (font_desc);
@@ -464,7 +464,6 @@ meta_frames_ensure_layout (MetaFrames *frames,
}
pango_layout_set_font_description (frame->text_layout, font_desc);
- pango_font_description_free (font_desc);
}
}
diff --git a/src/ui/ui.c b/src/ui/ui.c
index 2fa30122..3175269d 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -688,9 +688,8 @@ meta_ui_theme_get_frame_borders (MetaUI *ui,
theme = meta_ui_get_theme ();
theme_variant = NULL;
- font_desc = meta_theme_create_font_desc (theme, theme_variant, type, flags);
+ font_desc = meta_theme_get_title_font_desc (theme, theme_variant, type, flags);
text_height = meta_theme_get_title_height (theme, font_desc);
- pango_font_description_free (font_desc);
meta_theme_get_frame_borders (theme, theme_variant, type,
text_height, flags, borders);
diff --git a/theme-viewer/theme-viewer-window.c b/theme-viewer/theme-viewer-window.c
index 11af9710..ee39e5b2 100644
--- a/theme-viewer/theme-viewer-window.c
+++ b/theme-viewer/theme-viewer-window.c
@@ -241,8 +241,8 @@ update_title_layout (ThemeViewerWindow *window)
gint height;
layout = meta_theme_create_title_layout (window->theme, "Metacity Theme Viewer");
- font_desc = meta_theme_create_font_desc (window->theme, window->theme_variant,
- window->frame_type, window->frame_flags);
+ font_desc = meta_theme_get_title_font_desc (window->theme, window->theme_variant,
+ window->frame_type, window->frame_flags);
height = meta_theme_get_title_height (window->theme, font_desc);
@@ -253,8 +253,6 @@ update_title_layout (ThemeViewerWindow *window)
window->title_layout = layout;
window->title_height = height;
-
- pango_font_description_free (font_desc);
}
static void