Merge pull request #551 from Vulcalien/set-background-image-error

Improve and optimize the code for background images
This commit is contained in:
Matt Rose 2021-12-10 07:52:28 -05:00 committed by GitHub
commit d3125c29f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 24 deletions

View File

@ -212,6 +212,7 @@ DEFAULTS = {
'background_color' : '#000000', 'background_color' : '#000000',
'background_darkness' : 0.5, 'background_darkness' : 0.5,
'background_type' : 'solid', 'background_type' : 'solid',
'background_image' : '',
'backspace_binding' : 'ascii-del', 'backspace_binding' : 'ascii-del',
'delete_binding' : 'escape-sequence', 'delete_binding' : 'escape-sequence',
'color_scheme' : 'grey_on_black', 'color_scheme' : 'grey_on_black',
@ -253,8 +254,6 @@ DEFAULTS = {
'autoclean_groups' : True, 'autoclean_groups' : True,
'http_proxy' : '', 'http_proxy' : '',
'ignore_hosts' : ['localhost','127.0.0.0/8','*.local'], 'ignore_hosts' : ['localhost','127.0.0.0/8','*.local'],
'background_image' : '',
'background_alpha' : 0.0,
# Titlebar # Titlebar
'title_hide_sizetext' : False, 'title_hide_sizetext' : False,
'title_transmit_fg_color' : '#ffffff', 'title_transmit_fg_color' : '#ffffff',

View File

@ -6,7 +6,7 @@
import os import os
import signal import signal
import gi 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) gi.require_version('Vte', '2.91') # vte-0.38 (gnome-3.14)
from gi.repository import Vte from gi.repository import Vte
import subprocess import subprocess
@ -140,18 +140,6 @@ class Terminal(Gtk.VBox):
self.pending_on_vte_size_allocate = False self.pending_on_vte_size_allocate = False
self.vte = Vte.Terminal() 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.set_allow_hyperlink(True)
self.vte._draw_data = None self.vte._draw_data = None
if not hasattr(self.vte, "set_opacity") or \ if not hasattr(self.vte, "set_opacity") or \
@ -161,7 +149,6 @@ class Terminal(Gtk.VBox):
self.composite_support = True self.composite_support = True
dbg('composite_support: %s' % self.composite_support) dbg('composite_support: %s' % self.composite_support)
self.vte.show() self.vte.show()
self.update_url_matches() self.update_url_matches()
@ -202,9 +189,10 @@ class Terminal(Gtk.VBox):
def set_background_image(self,image): def set_background_image(self,image):
try: 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.set_clear_background(False)
self.vte.connect("draw",self.background_draw) self.vte.connect("draw", self.background_draw)
except Exception as e: except Exception as e:
self.background_image = None self.background_image = None
self.vte.set_clear_background(True) self.vte.set_clear_background(True)
@ -730,11 +718,16 @@ class Terminal(Gtk.VBox):
self.bgcolor = Gdk.RGBA() self.bgcolor = Gdk.RGBA()
self.bgcolor.parse(self.config['background_color']) 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'] self.bgcolor.alpha = self.config['background_darkness']
else: else:
self.bgcolor.alpha = 1 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'] factor = self.config['inactive_color_offset']
if factor > 1.0: if factor > 1.0:
factor = 1.0 factor = 1.0
@ -1135,18 +1128,23 @@ class Terminal(Gtk.VBox):
widget._draw_data = None widget._draw_data = None
def background_draw(self, widget, cr): 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 return False
# save cairo context
cr.save()
# draw background image
rect = self.vte.get_allocation() rect = self.vte.get_allocation()
xratio = float(rect.width) / float(self.background_image.get_width()) xratio = float(rect.width) / float(self.background_image.get_width())
yratio = float(rect.height) / float(self.background_image.get_height()) yratio = float(rect.height) / float(self.background_image.get_height())
cr.save() cr.scale(xratio, yratio)
cr.scale(xratio,yratio) cr.set_source_surface(self.background_image)
Gdk.cairo_set_source_pixbuf(cr, self.background_image, 0, 0) cr.get_source().set_filter(cairo.Filter.FAST)
cr.paint() cr.paint()
Gdk.cairo_set_source_rgba(cr,self.bgcolor) # draw transparent monochrome layer
Gdk.cairo_set_source_rgba(cr, self.bgcolor)
cr.paint() cr.paint()
# restore cairo context
cr.restore() cr.restore()
def on_draw(self, widget, context): def on_draw(self, widget, context):