diff --git a/terminatorlib/config.py b/terminatorlib/config.py index b0888a71..4f7567ec 100644 --- a/terminatorlib/config.py +++ b/terminatorlib/config.py @@ -212,6 +212,7 @@ DEFAULTS = { 'background_color' : '#000000', 'background_darkness' : 0.5, 'background_type' : 'solid', + 'background_image' : '', 'backspace_binding' : 'ascii-del', 'delete_binding' : 'escape-sequence', 'color_scheme' : 'grey_on_black', @@ -253,8 +254,6 @@ DEFAULTS = { 'autoclean_groups' : True, 'http_proxy' : '', 'ignore_hosts' : ['localhost','127.0.0.0/8','*.local'], - 'background_image' : '', - 'background_alpha' : 0.0, # Titlebar 'title_hide_sizetext' : False, 'title_transmit_fg_color' : '#ffffff', diff --git a/terminatorlib/terminal.py b/terminatorlib/terminal.py index 6c224b94..016ff214 100644 --- a/terminatorlib/terminal.py +++ b/terminatorlib/terminal.py @@ -6,7 +6,7 @@ import os import signal import gi -from gi.repository import GLib, GObject, Pango, Gtk, Gdk, GdkPixbuf +from gi.repository import GLib, GObject, Pango, Gtk, Gdk, GdkPixbuf, cairo gi.require_version('Vte', '2.91') # vte-0.38 (gnome-3.14) from gi.repository import Vte import subprocess @@ -140,18 +140,6 @@ class Terminal(Gtk.VBox): self.pending_on_vte_size_allocate = False self.vte = Vte.Terminal() - self.background_image = None - if self.config['background_image'] != '': - try: - self.background_image = GdkPixbuf.Pixbuf.new_from_file(self.config['background_image']) - self.vte.set_clear_background(False) - self.vte.connect("draw",self.background_draw) - except Exception as e: - self.background_image = None - self.vte.set_clear_background(True) - err('error loading background image: %s, %s' % (type(e).__name__,e)) - - self.background_alpha = self.config['background_darkness'] self.vte.set_allow_hyperlink(True) self.vte._draw_data = None if not hasattr(self.vte, "set_opacity") or \ @@ -161,7 +149,6 @@ class Terminal(Gtk.VBox): self.composite_support = True dbg('composite_support: %s' % self.composite_support) - self.vte.show() self.update_url_matches() @@ -202,9 +189,10 @@ class Terminal(Gtk.VBox): def set_background_image(self,image): try: - self.background_image = GdkPixbuf.Pixbuf.new_from_file(image) + bg_pixbuf = GdkPixbuf.Pixbuf.new_from_file(image) + self.background_image = Gdk.cairo_surface_create_from_pixbuf(bg_pixbuf, 1, None) self.vte.set_clear_background(False) - self.vte.connect("draw",self.background_draw) + self.vte.connect("draw", self.background_draw) except Exception as e: self.background_image = None self.vte.set_clear_background(True) @@ -730,11 +718,16 @@ class Terminal(Gtk.VBox): self.bgcolor = Gdk.RGBA() self.bgcolor.parse(self.config['background_color']) - if self.config['background_type'] == 'transparent' or self.config['background_type'] == 'image': + if self.config['background_type'] in ('transparent', 'image'): self.bgcolor.alpha = self.config['background_darkness'] else: self.bgcolor.alpha = 1 + if self.config['background_type'] == 'image' and self.config['background_image'] != '': + self.set_background_image(self.config['background_image']) + else: + self.background_image = None + factor = self.config['inactive_color_offset'] if factor > 1.0: factor = 1.0 @@ -1135,18 +1128,23 @@ class Terminal(Gtk.VBox): widget._draw_data = None def background_draw(self, widget, cr): - if not self.config['background_type'] == 'image' or not self.background_image: + if self.background_image is None: return False + # save cairo context + cr.save() + # draw background image rect = self.vte.get_allocation() xratio = float(rect.width) / float(self.background_image.get_width()) yratio = float(rect.height) / float(self.background_image.get_height()) - cr.save() - cr.scale(xratio,yratio) - Gdk.cairo_set_source_pixbuf(cr, self.background_image, 0, 0) + cr.scale(xratio, yratio) + cr.set_source_surface(self.background_image) + cr.get_source().set_filter(cairo.Filter.FAST) cr.paint() - Gdk.cairo_set_source_rgba(cr,self.bgcolor) + # draw transparent monochrome layer + Gdk.cairo_set_source_rgba(cr, self.bgcolor) cr.paint() + # restore cairo context cr.restore() def on_draw(self, widget, context):