From aa1729d36478d13b9466d95b72c8d2f63bd2696a Mon Sep 17 00:00:00 2001 From: Gary Burton Date: Tue, 14 Aug 2012 21:58:29 +0000 Subject: [PATCH] GTK3 fix. Workaround for bug https://bugzilla.gnome.org/show_bug.cgi?id=679654 which prevents list_families() being called more than once to generate a list of fonts. Text reports and anything else which uses the PDF backend now works svn: r20212 --- src/gui/utils.py | 42 +++++++++++++++++++++++++++++ src/gui/widgets/styledtexteditor.py | 16 +++-------- src/plugins/lib/libcairodoc.py | 6 ++--- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/gui/utils.py b/src/gui/utils.py index 480ae5485..6a92c267e 100644 --- a/src/gui/utils.py +++ b/src/gui/utils.py @@ -41,6 +41,7 @@ from gen.ggettext import gettext as _ # GNOME/GTK # #------------------------------------------------------------------------- +from gi.repository import PangoCairo #------------------------------------------------------------------------- # @@ -296,6 +297,47 @@ class ProgressMeter(object): """ self.__dialog.destroy() +#------------------------------------------------------------------------- +# +# SystemFonts class +# +#------------------------------------------------------------------------- + +class SystemFonts(object): + """ + Define fonts available to Gramps + + This is a workaround for bug which prevents the list_families method + being called more than once. + + The bug is described here: https://bugzilla.gnome.org/show_bug.cgi?id=679654 + + This code generate a warning: + /usr/local/lib/python2.7/site-packages/gi/types.py:47: + Warning: g_value_get_object: assertion `G_VALUE_HOLDS_OBJECT (value)' failed + + To get a list of fonts, instantiate this class and call get_system_fonts() + #TODO GTK3: the underlying bug may be fixed at some point in the future + """ + + __FONTS = None + + def __init__(self): + """ + Populate the class variable __FONTS only once. + """ + if SystemFonts.__FONTS is None: + families = PangoCairo.font_map_get_default().list_families() + print ('GRAMPS GTK3: a g_value_get_object warning:') + SystemFonts.__FONTS = [family.get_name() for family in families] + SystemFonts.__FONTS.sort() + + def get_system_fonts(self): + """ + Return a sorted list of fonts available to Gramps + """ + return SystemFonts.__FONTS + #------------------------------------------------------------------------- # # diff --git a/src/gui/widgets/styledtexteditor.py b/src/gui/widgets/styledtexteditor.py index 7b96c1f52..c782f75a2 100644 --- a/src/gui/widgets/styledtexteditor.py +++ b/src/gui/widgets/styledtexteditor.py @@ -61,6 +61,7 @@ from gui.widgets.toolcomboentry import ToolComboEntry from gui.widgets.springseparator import SpringSeparatorAction from gui.spell import Spell from gui.display import display_url +from gui.utils import SystemFonts from gen.config import config from gen.constfunc import has_display @@ -175,24 +176,12 @@ class StyledTextEditor(Gtk.TextView): (GObject.TYPE_PYOBJECT,)), # arguments } - FONTS = None - def __init__(self): """Setup initial instance variable values.""" self.textbuffer = UndoableStyledBuffer() self.textbuffer.connect('style-changed', self._on_buffer_style_changed) self.textbuffer.connect('changed', self._on_buffer_changed) GObject.GObject.__init__(self, buffer=self.textbuffer) - if StyledTextEditor.FONTS is None: - #TODO GTK3: How to do this different? - #workaround for bug https://bugzilla.gnome.org/show_bug.cgi?id=679654 - #but still gives error on output: - #/usr/local/lib/python2.7/site-packages/gi/types.py:47: - # Warning: g_value_get_object: assertion `G_VALUE_HOLDS_OBJECT (value)' failed - print ('GRAMPS GTK3: a g_value_get_object warning:') - StyledTextEditor.FONTS = [f.get_name() for f in - self.get_pango_context().list_families()] - StyledTextEditor.FONTS.sort() self.match = None self.last_match = None @@ -486,11 +475,12 @@ class StyledTextEditor(Gtk.TextView): # ...last the custom actions, which have custom proxies default = StyledTextTagType.STYLE_DEFAULT[StyledTextTagType.FONTFACE] + fonts = SystemFonts() fontface_action = ValueAction(str(StyledTextTagType.FONTFACE), _("Font family"), default, ToolComboEntry, - StyledTextEditor.FONTS, + fonts.get_system_fonts(), False, #editable True, #shortlist None) # validator diff --git a/src/plugins/lib/libcairodoc.py b/src/plugins/lib/libcairodoc.py index 5ee6bf6b7..4686132e4 100644 --- a/src/plugins/lib/libcairodoc.py +++ b/src/plugins/lib/libcairodoc.py @@ -51,6 +51,7 @@ from gen.plug.report import utils as ReportUtils from gen.errors import PluginError from gen.plug.docbackend import CairoBackend from gen.utils.image import resize_to_buffer +from gui.utils import SystemFonts #------------------------------------------------------------------------ # @@ -108,9 +109,8 @@ def set_font_families(): """ global font_families - ##families = pango_context.list_families() - families = PangoCairo.font_map_get_default().list_families() - family_names = [family.get_name() for family in families] + fonts = SystemFonts() + family_names = fonts.get_system_fonts() fam = [f for f in _TTF_FREEFONT.itervalues() if f in family_names] if len(fam) == len(_TTF_FREEFONT):