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
This commit is contained in:
Gary Burton 2012-08-14 21:58:29 +00:00
parent ea5dcfd4ae
commit aa1729d364
3 changed files with 48 additions and 16 deletions

View File

@ -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
#-------------------------------------------------------------------------
#
#

View File

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

View File

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