Pango: Determine if a font is monospaced
If you have a GtkFontButton, finding out whether the chosen font is monospaced is quite a complicated process. Here is a complete walk-through.
(By the way, I will be using PyGTK’s Pango documentation because the C version is a mess.)
FontButton.get_font_name
returns the font family (a.k.a. “font name”), style, and size; for example,
“Liberation Serif Italic 14”. The first thing we need to do is pick just the family name. We do this by going
through a PangoFontDescription.
desc_str = font_button.get_font_name() # Liberation Serif Italic 14
desc = pango.FontDescription(desc_str)
family_name = desc.get_family() # Liberation Serif
Next, check whether the font family describes a monospaced font. Here is where
it gets dodgy. We need an arbitrary PangoContext, which
can be obtained from a GtkWidget using Widget.get_pango_context
. We then list all available font
families and find the one with the appropriate name. Call
FontFamily.is_monospace
to finish the job.
(By the way, this is also a good place to show off Python’s for-else construct.)
context = widget.get_pango_context() # widget can be any GtkWidget.
for family in context.list_families():
if family.get_name() == family_name:
break
else: # Should not happen.
assert False
family.is_monospace() # False -- Liberation Serif is proportional.