diff --git a/gajim/htmltextview.py b/gajim/htmltextview.py index 300c7dc91..3cd1cd4a9 100644 --- a/gajim/htmltextview.py +++ b/gajim/htmltextview.py @@ -67,10 +67,6 @@ __all__ = ['HtmlTextView'] whitespace_rx = re.compile('\\s+') allwhitespace_rx = re.compile('^\\s*$') -# pixels = points * display_resolution -display_resolution = 0.3514598*(Gdk.Screen.height() / - float(Gdk.Screen.height_mm())) - # embryo of CSS classes classes = { #'system-message':';display: none', @@ -227,6 +223,11 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self.list_counters = [] # stack (top at head) of list # counters, or None for unordered list + def _get_points_from_pixels(self, pixels): + resolution = self.textview.get_screen().get_resolution() + # points = pixels * 72 / resolution + return pixels * 72 / resolution + def _parse_style_color(self, tag, value): color = _parse_css_color(value) tag.set_property('foreground-gdk', color) @@ -236,7 +237,6 @@ class HtmlHandler(xml.sax.handler.ContentHandler): tag.set_property('background-gdk', color) tag.set_property('paragraph-background-gdk', color) - def _get_current_attributes(self): attrs = self.textview.get_default_attributes() self.iter.backward_char() @@ -266,10 +266,7 @@ class HtmlHandler(xml.sax.handler.ContentHandler): val = sign*max(1, min(abs(val), 500)) frac = val/100 if font_relative: - attrs = self._get_current_attributes() - if not attrs.font: - font_size = self.get_font_size() - callback(frac*display_resolution*font_size, *args) + callback(frac, '%', *args) elif block_relative: # CSS says 'Percentage values: refer to width of the closest # block-level ancestor' @@ -285,8 +282,12 @@ class HtmlHandler(xml.sax.handler.ContentHandler): callback(frac, *args) return - def get_val(): - val = float(value[:-2]) + def get_val(min_val=minl, max_val=maxl): + try: + val = float(value[:-2]) + except: + log.warning('Unable to parse length value "%s"' % value) + return None if val > 0: sign = 1 elif val < 0: @@ -294,27 +295,24 @@ class HtmlHandler(xml.sax.handler.ContentHandler): else: sign = 0 # validate length - return sign*max(minl, min(abs(val*display_resolution), maxl)) - if value.endswith('pt'): # points - callback(get_val()*display_resolution, *args) + return sign*max(min_val, min(abs(val), max_val)) + if value.endswith('pt'): # points + size = get_val(5, 50) + if size is None: + return + callback(size, 'pt', *args) - elif value.endswith('em'): # ems, the width of the element's font - attrs = self._get_current_attributes() - if not attrs.font: - font_size = self.get_font_size() - callback(get_val()*display_resolution*font_size, *args) + elif value.endswith('em'): + size = get_val(0.3, 4) + if size is None: + return + callback(size, 'em', *args) - elif value.endswith('ex'): # x-height, ~ the height of the letter 'x' - # FIXME: figure out how to calculate this correctly - # for now 'em' size is used as approximation - - attrs = self._get_current_attributes() - if not attrs.font: - font_size = self.get_font_size() - callback(get_val()*display_resolution*font_size, *args) - - elif value.endswith('px'): # pixels - callback(get_val(), *args) + elif value.endswith('px'): # pixels + size = get_val(5, 50) + if size is None: + return + callback(size, 'px', *args) else: try: @@ -327,13 +325,18 @@ class HtmlHandler(xml.sax.handler.ContentHandler): else: sign = 0 # validate length - val = sign*max(minl, min(abs(val), maxl)) - callback(val, *args) + val = sign*max(5, min(abs(val), 70)) + callback(val, 'px', *args) except Exception: log.warning('Unable to parse length value "%s"' % value) - def __parse_font_size_cb(length, tag): - tag.set_property('size-points', length/display_resolution) + def __parse_font_size_cb(size, type_, tag): + if type_ in ('em', '%'): + tag.set_property('scale', size) + elif type_ == 'pt': + tag.set_property('size-points', size) + elif type_ == 'px': + tag.set_property('size-points', self._get_points_from_pixels(size)) __parse_font_size_cb = staticmethod(__parse_font_size_cb) def _parse_style_display(self, tag, value): @@ -830,10 +833,6 @@ class HtmlHandler(xml.sax.handler.ContentHandler): self._jump_line() self._end_span() - def get_font_size(self): - context = self.conv_textview.tv.get_style_context() - font = context.get_font(Gtk.StateType.NORMAL) - return font.get_size() / Pango.SCALE class HtmlTextView(Gtk.TextView):