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.
This commit is contained in:
Matthias Clasen
2015-08-29 00:47:32 -04:00
parent ecc5abfe3b
commit f44358b76a

View File

@ -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))
@ -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);