From f44358b76a362db5230e21946afe3bac618acdfb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 29 Aug 2015 00:47:32 -0400 Subject: [PATCH] accel label: Allow a different font for the accelerator We were using the .accelerator style for rendering the accel string, but we need to explicitly set the font from this style for it to apply. --- gtk/gtkaccellabel.c | 51 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/gtk/gtkaccellabel.c b/gtk/gtkaccellabel.c index 5289fa12e0..2b9cb77321 100644 --- a/gtk/gtkaccellabel.c +++ b/gtk/gtkaccellabel.c @@ -35,6 +35,7 @@ #include "gtkprivate.h" #include "gtkrender.h" #include "gtksizerequest.h" +#include "gtkstylecontextprivate.h" /** * SECTION:gtkaccellabel @@ -346,10 +347,43 @@ gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label) (accel_label->priv->accel_string_width ? accel_label->priv->accel_padding : 0)); } +static PangoLayout * +gtk_accel_label_get_accel_layout (GtkAccelLabel *accel_label) +{ + GtkWidget *widget = GTK_WIDGET (accel_label); + GtkStyleContext *context; + PangoAttrList *attrs; + PangoLayout *layout; + PangoFontDescription *font_desc; + + context = gtk_widget_get_style_context (widget); + + gtk_style_context_save (context); + gtk_style_context_add_class (context, GTK_STYLE_CLASS_ACCELERATOR); + + layout = gtk_widget_create_pango_layout (widget, gtk_accel_label_get_string (accel_label)); + + attrs = _gtk_style_context_get_pango_attributes (context); + if (!attrs) + attrs = pango_attr_list_new (); + gtk_style_context_get (context, + gtk_widget_get_state_flags (widget), + "font", &font_desc, + NULL); + pango_attr_list_change (attrs, pango_attr_font_desc_new (font_desc)); + pango_font_description_free (font_desc); + pango_layout_set_attributes (layout, attrs); + pango_attr_list_unref (attrs); + + gtk_style_context_restore (context); + + return layout; +} + static void -gtk_accel_label_get_preferred_width (GtkWidget *widget, - gint *min_width, - gint *nat_width) +gtk_accel_label_get_preferred_width (GtkWidget *widget, + gint *min_width, + gint *nat_width) { GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (widget); PangoLayout *layout; @@ -357,8 +391,7 @@ gtk_accel_label_get_preferred_width (GtkWidget *widget, GTK_WIDGET_CLASS (gtk_accel_label_parent_class)->get_preferred_width (widget, min_width, nat_width); - layout = gtk_widget_create_pango_layout (GTK_WIDGET (widget), - gtk_accel_label_get_string (accel_label)); + layout = gtk_accel_label_get_accel_layout (accel_label); pango_layout_get_pixel_size (layout, &width, NULL); accel_label->priv->accel_string_width = width; @@ -409,7 +442,8 @@ gtk_accel_label_draw (GtkWidget *widget, cairo_save (cr); /* XXX: Mad hack: We modify the label's width so it renders - * properly in its draw function that we chain to. */ + * properly in its draw function that we chain to. + */ if (direction == GTK_TEXT_DIR_RTL) cairo_translate (cr, ac_width, 0); if (gtk_label_get_ellipsize (label)) @@ -424,7 +458,7 @@ gtk_accel_label_draw (GtkWidget *widget, gtk_widget_set_allocation (widget, &allocation); if (gtk_label_get_ellipsize (label)) pango_layout_set_width (label_layout, - pango_layout_get_width (label_layout) + pango_layout_get_width (label_layout) + ac_width * PANGO_SCALE); cairo_restore (cr); @@ -436,8 +470,7 @@ gtk_accel_label_draw (GtkWidget *widget, gtk_label_get_layout_offsets (GTK_LABEL (accel_label), NULL, &y); - accel_layout = gtk_widget_create_pango_layout (widget, gtk_accel_label_get_string (accel_label)); - + accel_layout = gtk_accel_label_get_accel_layout (accel_label); y += get_first_baseline (label_layout) - get_first_baseline (accel_layout) - allocation.y; gtk_style_context_save (context);