Hi, the Ubuntu folks requested a migration to GtkSourceÍView2. This patch just does that. I also refactored the gedit style scheme support a bit, and you can see a hackish approach to support colordiffrc (thanks to GtkSourceView API changes).
Cheers, Szilveszter
# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: [email protected]\ # fwvt03uqtl2p6vk7 # target_branch: file:///home/szilveszter/Development/Bazaar/bzr-\ # gtk/trunk/ # testament_sha1: 0b2d6843d1a677cfb102015318120e0b1f742977 # timestamp: 2009-05-26 15:59:34 +0200 # base_revision_id: [email protected]\ # zhtopap2bn9vjtpc # # Begin patch === modified file 'README' --- README 2008-03-09 13:47:52 +0000 +++ README 2009-05-26 13:58:24 +0000 @@ -23,8 +23,8 @@ In order to see syntax highlighted diffs: - * gtksourceview python bindings (on Debian and Ubuntu systems, these - are in the python-gnome2-desktop package) + * GtkSourceView2 Python bindings (on Debian and Ubuntu systems, these + are in the python-gtksourceview2 package) In order to use the nautilus integration, you will need: === modified file 'diff.py' --- diff.py 2008-10-22 07:56:53 +0000 +++ diff.py 2009-05-26 13:53:30 +0000 @@ -17,9 +17,10 @@ import os import re import sys +from xml.etree.ElementTree import Element, SubElement, tostring try: - import gtksourceview + import gtksourceview2 have_gtksourceview = True except ImportError: have_gtksourceview = False @@ -63,16 +64,16 @@ self.set_shadow_type(gtk.SHADOW_IN) if have_gtksourceview: - self.buffer = gtksourceview.SourceBuffer() - slm = gtksourceview.SourceLanguagesManager() - gsl = slm.get_language_from_mime_type("text/x-patch") + self.buffer = gtksourceview2.Buffer() + slm = gtksourceview2.LanguageManager() + gsl = slm.guess_language(content_type="text/x-patch") if have_gconf: - self.apply_gedit_colors(gsl) - self.apply_colordiff_colors(gsl) + self.apply_gedit_colors(self.buffer) + self.apply_colordiff_colors(self.buffer) self.buffer.set_language(gsl) - self.buffer.set_highlight(True) + self.buffer.set_highlight_syntax(True) - self.sourceview = gtksourceview.SourceView(self.buffer) + self.sourceview = gtksourceview2.View(self.buffer) else: self.buffer = gtk.TextBuffer() self.sourceview = gtk.TextView(self.buffer) @@ -83,124 +84,93 @@ self.sourceview.show() @staticmethod - def apply_gedit_colors(lang): - """Set style for lang to that specified in gedit configuration. + def apply_gedit_colors(buf): + """Set style to that specified in gedit configuration. This method needs the gconf module. - :param lang: a gtksourceview.SourceLanguage object. + :param buf: a gtksourceview2.Buffer object. """ - GEDIT_SYNTAX_PATH = '/apps/gedit-2/preferences/syntax_highlighting' - GEDIT_LANG_PATH = GEDIT_SYNTAX_PATH + '/' + lang.get_id() + GEDIT_SCHEME_PATH = '/apps/gedit-2/preferences/editor/colors/scheme' client = gconf.client_get_default() - client.add_dir(GEDIT_LANG_PATH, gconf.CLIENT_PRELOAD_NONE) - - for tag in lang.get_tags(): - tag_id = tag.get_id() - gconf_key = GEDIT_LANG_PATH + '/' + tag_id - style_string = client.get_string(gconf_key) - - if style_string is None: - continue - - # function to get a bool from a string that's either '0' or '1' - string_bool = lambda x: bool(int(x)) - - # style_string is a string like "2/#FFCCAA/#000000/0/1/0/0" - # values are: mask, fg, bg, italic, bold, underline, strike - # this packs them into (str_value, attr_name, conv_func) tuples - items = zip(style_string.split('/'), ['mask', 'foreground', - 'background', 'italic', 'bold', 'underline', 'strikethrough' ], - [ int, gtk.gdk.color_parse, gtk.gdk.color_parse, string_bool, - string_bool, string_bool, string_bool ] - ) - - style = gtksourceview.SourceTagStyle() - - # XXX The mask attribute controls whether the present values of - # foreground and background color should in fact be used. Ideally - # (and that's what gedit does), one could set all three attributes, - # and let the TagStyle object figure out which colors to use. - # However, in the GtkSourceview python bindings, the mask attribute - # is read-only, and it's derived instead from the colors being - # set or not. This means that we have to sometimes refrain from - # setting fg or bg colors, depending on the value of the mask. - # This code could go away if mask were writable. - mask = int(items[0][0]) - if not (mask & 1): # GTK_SOURCE_TAG_STYLE_USE_BACKGROUND - items[2:3] = [] - if not (mask & 2): # GTK_SOURCE_TAG_STYLE_USE_FOREGROUND - items[1:2] = [] - items[0:1] = [] # skip the mask unconditionally - - for value, attr, func in items: - try: - value = func(value) - except ValueError: - warning('gconf key %s contains an invalid value: %s' - % gconf_key, value) - else: - setattr(style, attr, value) - - lang.set_tag_style(tag_id, style) + style_scheme_name = client.get_string(GEDIT_SCHEME_PATH) + style_scheme = gtksourceview2.StyleSchemeManager().get_scheme(style_scheme_name) + + buf.set_style_scheme(style_scheme) @classmethod - def apply_colordiff_colors(klass, lang): + def apply_colordiff_colors(klass, buf): """Set style colors for lang using the colordiff configuration file. Both ~/.colordiffrc and ~/.colordiffrc.bzr-gtk are read. - :param lang: a "Diff" gtksourceview.SourceLanguage object. + :param buf: a "Diff" gtksourceview2.Buffer object. """ - colors = {} - - for f in ('~/.colordiffrc', '~/.colordiffrc.bzr-gtk'): - f = os.path.expanduser(f) - if os.path.exists(f): - try: - f = file(f) - except IOError, e: - warning('could not open file %s: %s' % (f, str(e))) - else: - colors.update(klass.parse_colordiffrc(f)) - f.close() - - if not colors: - # ~/.colordiffrc does not exist - return - - mapping = { - # map GtkSourceView tags to colordiff names + scheme_manager = gtksourceview2.StyleSchemeManager() + style_scheme = scheme_manager.get_scheme('colordiff') + + # if style scheme not found, we'll generate it from colordiffrc + # TODO: reload if colordiffrc has changed. + if style_scheme is None: + colors = {} + + for f in ('~/.colordiffrc', '~/.colordiffrc.bzr-gtk'): + f = os.path.expanduser(f) + if os.path.exists(f): + try: + f = file(f) + except IOError, e: + warning('could not open file %s: %s' % (f, str(e))) + else: + colors.update(klass.parse_colordiffrc(f)) + f.close() + + if not colors: + # ~/.colordiffrc does not exist + return + + mapping = { + # map GtkSourceView2 scheme styles to colordiff names # since GSV is richer, accept new names for extra bits, # defaulting to old names if they're not present - 'ad...@32@line': ['newtext'], - 'remo...@32@line': ['oldtext'], - 'Location': ['location', 'diffstuff'], - 'd...@32@file': ['file', 'diffstuff'], - 'spec...@32@case': ['specialcase', 'diffstuff'], - } - - for tag in lang.get_tags(): - tag_id = tag.get_id() - keys = mapping.get(tag_id, []) - color = None - - for key in keys: - color = colors.get(key, None) - if color is not None: - break - - if color is None: - continue - - style = gtksourceview.SourceTagStyle() - try: - style.foreground = gtk.gdk.color_parse(color) - except ValueError: - warning('not a valid color: %s' % color) - else: - lang.set_tag_style(tag_id, style) + 'diff:added-line': ['newtext'], + 'diff:removed-line': ['oldtext'], + 'diff:location': ['location', 'diffstuff'], + 'diff:file': ['file', 'diffstuff'], + 'diff:special-case': ['specialcase', 'diffstuff'], + } + + converted_colors = {} + for name, values in mapping.items(): + color = None + for value in values: + color = colors.get(value, None) + if color is not None: + break + if color is None: + continue + converted_colors[name] = color + + # some xml magic to produce needed style scheme description + e_style_scheme = Element('style-scheme') + e_style_scheme.set('id', 'colordiff') + e_style_scheme.set('_name', 'ColorDiff') + e_style_scheme.set('version', '1.0') + for name, color in converted_colors.items(): + style = SubElement(e_style_scheme, 'style') + style.set('name', name) + style.set('foreground', '#%s' % color) + + scheme_xml = tostring(e_style_scheme, 'UTF-8') + if not os.path.exists(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles')): + os.makedirs(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles')) + file(os.path.expanduser('~/.local/share/gtksourceview-2.0/styles/colordiff.xml'), 'w').write(scheme_xml) + + scheme_manager.force_rescan() + style_scheme = scheme_manager.get_scheme('colordiff') + + buf.set_style_scheme(style_scheme) @staticmethod def parse_colordiffrc(fileobj): # Begin bundle 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
-- bzr-gtk mailing list [email protected] Modify settings or unsubscribe at: https://lists.canonical.com/mailman/listinfo/bzr-gtk
