Skip to content

Commit

Permalink
Support terminal transparency (#207)
Browse files Browse the repository at this point in the history
  • Loading branch information
hanspr authored and gfrenoy committed Jan 18, 2020
1 parent 11216bc commit 2fbae0a
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 27 deletions.
5 changes: 5 additions & 0 deletions lib/PACMain.pm
Expand Up @@ -431,6 +431,11 @@ sub _initGUI {
##############################################
$$self{_GUI}{main} = Gtk3::Window->new;

if (($$self{_CFG}{defaults}{'tabs in main window'})&&($$self{_CFG}{defaults}{'terminal transparency'} > 0)) {
_setWindowPaintable($$self{_GUI}{main});
}


# Create a vbox1: main, status
$$self{_GUI}{vbox1} = Gtk3::VBox->new(0, 0);
$$self{_GUI}{main}->add($$self{_GUI}{vbox1});
Expand Down
88 changes: 63 additions & 25 deletions lib/PACTerminal.pm
Expand Up @@ -85,6 +85,8 @@ my $right_click_deep = 0;

my $COL_GREEN = "\e[1;38;5;2m";
my $COL_RED = "\e[1;38;5;1m";
my $COL_BLUE = "\e[1;38;5;33m";
my $COL_YELL = "\e[1;38;5;11m";
my $COL_RESET = "\e[0m";

# END: Define GLOBAL CLASS variables
Expand Down Expand Up @@ -306,11 +308,11 @@ sub start {
}

my $name = $$self{_CFG}{'environments'}{$$self{_UUID}}{'name'};
my $title = encode('UTF-8',$$self{_CFG}{'environments'}{$$self{_UUID}}{'title'});
my $title = $$self{_CFG}{'environments'}{$$self{_UUID}}{'title'};
my $method = $$self{_CFG}{'environments'}{$$self{_UUID}}{'method'};

my $string = $method eq 'generic' ? "LAUNCHING '$title'" : "CONNECTING WITH '$title'";
_vteFeed($$self{_GUI}{_VTE}, "\r\n ${COL_GREEN}$string (" . (localtime(time)) . ") =->${COL_RESET}\r\n\n");
my $string = $method eq 'generic' ? encode('UTF-8',"${COL_GREEN}LAUNCHING${COL_RESET} ${COL_YELL}$title${COL_RESET}") : encode('UTF-8',"${COL_GREEN}CONNECTING WITH${COL_RESET} ${COL_YELL}$title${COL_RESET}");
_vteFeed($$self{_GUI}{_VTE},"\r\n$string (" . (localtime(time)) . ")\r\n\n");

$$self{_PULSE} = 1;

Expand Down Expand Up @@ -824,6 +826,7 @@ sub _initGUI {
$$self{_WINDOWTERMINAL}->set_title("$$self{_TITLE} : $APPNAME (v$APPVERSION)");
$$self{_WINDOWTERMINAL}->set_position('none');
$$self{_WINDOWTERMINAL}->set_size_request(200, 100);

my $hsize = $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'use personal settings'} ? $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal window hsize'} : $$self{_CFG}{'defaults'}{'terminal windows hsize'};
my $vsize = $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'use personal settings'} ? $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal window vsize'} : $$self{_CFG}{'defaults'}{'terminal windows vsize'};
# HPR.20191010
Expand All @@ -846,6 +849,11 @@ sub _initGUI {
$$self{_WINDOWTERMINAL}->set_icon_name('gtk-disconnect');
$$self{_WINDOWTERMINAL}->add($$self{_GUI}{_VBOX});
$$self{_WINDOWTERMINAL}->move(($NPOSX*$hsize+3),5+($NPOSY*$vsize+($NPOSY*50)));

if ((($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'use personal settings'})&&($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal transparency'} > 0))||($$self{_CFG}{defaults}{'terminal transparency'} > 0)) {
_setWindowPaintable($$self{_WINDOWTERMINAL});
}

$$self{_WINDOWTERMINAL}->show_all();
$$self{_WINDOWTERMINAL}->present();
$NPOSX++;
Expand Down Expand Up @@ -3667,28 +3675,31 @@ sub _updateCFG {
_setTabColour($self);

my $colors = [Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color black'} // '#000000000000'), # black
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color red'}), # red
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color green'}), # green
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color yellow'}), # yellow (=brown)
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color blue'}), # blue
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color magenta'}), # magenta
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color cyan'}), # cyan
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color white'}), # white (=light grey)
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright black'}), # light black (=dark grey)
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright red'}), # light red
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright green'}), # light green
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright yellow'}), # light yellow
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright blue'}), # light blue
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright magenta'}), # light magenta
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright cyan'}), # light cyan
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright white'})]; # light white
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color red'}), # red
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color green'}), # green
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color yellow'}), # yellow (=brown)
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color blue'}), # blue
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color magenta'}), # magenta
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color cyan'}), # cyan
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color white'}), # white (=light grey)
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright black'}), # light black (=dark grey)
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright red'}), # light red
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright green'}), # light green
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright yellow'}), # light yellow
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright blue'}), # light blue
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright magenta'}), # light magenta
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright cyan'}), # light cyan
Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'color bright white'})
]; # light white
# Update some VTE options
if (($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'use personal settings'}) && (defined $$self{_GUI}{_VTE})) {
# FIXME-VTE $$self{_GUI}{_VTE}->set_background_transparent($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal transparency'} > 0);
# FIXME-VTE $$self{_GUI}{_VTE}->set_background_saturation($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal transparency'});
$$self{_GUI}{_VTE}->set_colors(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'text color'}), scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'back color'}), $colors);
if ($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal transparency'} > 0) {
_setTransparency($self,$$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal transparency'},$$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'back color'});
} else {
$$self{_GUI}{_VTE}->set_color_background(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'back color'}));
}
$$self{_GUI}{_VTE}->set_color_foreground(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'text color'}));
$$self{_GUI}{_VTE}->set_color_background(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'back color'}));
$$self{_GUI}{_VTE}->set_color_bold(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'bold color like text'} ? $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'text color'} : $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'bold color'}));
$$self{_GUI}{_VTE}->set_font(Pango::FontDescription::from_string($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal font'}));
$$self{_GUI}{_VTE}->set_property('cursor-shape', $$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'cursor shape'});
Expand All @@ -3697,11 +3708,13 @@ sub _updateCFG {
$$self{_GUI}{_VTE}->set_word_char_exceptions($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'terminal select words'});
$$self{_GUI}{_VTE}->set_audible_bell($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'audible bell'});
} elsif (defined $$self{_GUI}{_VTE}) {
# FIXME-VTE $$self{_GUI}{_VTE}->set_background_transparent($$self{_CFG}{'defaults'}{'terminal transparency'} > 0);
# FIXME-VTE $$self{_GUI}{_VTE}->set_background_saturation($$self{_CFG}{'defaults'}{'terminal transparency'});
$$self{_GUI}{_VTE}->set_colors(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'text color'}), scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{environments}{$$self{_UUID}}{'terminal options'}{'back color'}), $colors);
$$self{_GUI}{_VTE}->set_colors(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'text color'}), scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'back color'}), $colors);
if ($$self{_CFG}{defaults}{'terminal transparency'} > 0) {
_setTransparency($self,$$self{_CFG}{defaults}{'terminal transparency'},$$self{_CFG}{'defaults'}{'back color'});
} else {
$$self{_GUI}{_VTE}->set_color_background(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'back color'}));
}
$$self{_GUI}{_VTE}->set_color_foreground(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'text color'}));
$$self{_GUI}{_VTE}->set_color_background(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'back color'}));
$$self{_GUI}{_VTE}->set_color_bold(scalar Gtk3::Gdk::RGBA::parse($$self{_CFG}{'defaults'}{'bold color like text'} ? $$self{_CFG}{'defaults'}{'text color'} : $$self{_CFG}{'defaults'}{'bold color'}));
$$self{_GUI}{_VTE}->set_font(Pango::FontDescription::from_string($$self{_CFG}{'defaults'}{'terminal font'}));
$$self{_GUI}{_VTE}->set_property('cursor-shape', $$self{_CFG}{'defaults'}{'cursor shape'});
Expand All @@ -3719,6 +3732,31 @@ sub _updateCFG {
return 1;
}

sub _setTransparency {
my $self = shift;
my $transparency = shift;
my $bgcolor = shift;
my $alpha = 1 - $transparency;
my ($r,$g,$b) = (0,0,0);

if (length($bgcolor)==13) {
($r,$g,$b) = $bgcolor =~ m/(\w{2})\w{2}(\w{2})\w{2}(\w{2})\w{2}/;
} elsif (length($bgcolor) == 7) {
($r,$g,$b) = $bgcolor =~ m/(\w{2})(\w{2})(\w{2})/;
}
if ($r) {
$r = hex($r);
}
if ($g) {
$g = hex($g);
}
if ($b) {
$b = hex($b);
}
my $color = Gtk3::Gdk::RGBA::parse("rgba($r,$g,$b,$alpha)");
$$self{_GUI}{_VTE}->set_color_background($color);
}

sub _wFindInTerminal {
my $self = shift;
our $searching = 0;
Expand Down
33 changes: 33 additions & 0 deletions lib/PACUtils.pm
Expand Up @@ -109,6 +109,7 @@ require Exporter;
_createBanner
_copyPass
_appName
_setWindowPaintable
); # Functions/variables to export

@EXPORT_OK = qw();
Expand Down Expand Up @@ -3932,6 +3933,28 @@ sub _appName {
return "$APPNAME $APPVERSION";
}

sub _setWindowPaintable {
my $win = shift;

$win->signal_connect("draw" => \&mydraw);
my $screen = $win->get_screen();
my $visual = $screen->get_rgba_visual();
if (($visual) && ($screen->is_composited())) {
$win->set_visual($visual);
}
$win->set_app_paintable(1);
}

sub mydraw {
my ($w,$c) = @_;

$c->set_source_rgba(240,240,240,1);
$c->set_operator('source');
$c->paint();
$c->set_operator('over');
return 0;
}

1;

__END__
Expand Down Expand Up @@ -4153,6 +4176,16 @@ Call Vte->vteFeedChildBinary, depending on the version installed
Create a standard banner to be displayed on all Ásbrú Connection Manager dialogs
=head2 sub _setWindowPaintable
Takes a window object, attaches a general drawing routine and sets the paintable property to true
Hack to make transparent terminals
=head2 sub mydraw
Generic routine to draw a gray background for widgets that do not painted their own.
=head1 Perl particulars
@{[function(parameters)]} ==> Inside an interpolation, executes the function and uses the result as the string in that position
Expand Down
13 changes: 11 additions & 2 deletions res/asbru.glade
Expand Up @@ -3061,6 +3061,11 @@ Or(Global Variable): DISPLAY=&lt;GV:DISPLAY&gt;</property>
</object>
</child>
</object>
<object class="GtkAdjustment" id="adjTransparency">
<property name="upper">1</property>
<property name="step_increment">0.01</property>
<property name="page_increment">0.20000000000000001</property>
</object>
<object class="GtkAdjustment" id="adjWindowHeight">
<property name="lower">100</property>
<property name="upper">5000</property>
Expand Down Expand Up @@ -6637,8 +6642,12 @@ sudo -p sudo_prompt_string ...</property>
<object class="GtkScale" id="spCfgTerminalTransparency">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="fill_level">0</property>
<property name="round_digits">1</property>
<property name="adjustment">adjTransparency</property>
<property name="show_fill_level">True</property>
<property name="fill_level">1</property>
<property name="round_digits">2</property>
<property name="digits">2</property>
<property name="value_pos">left</property>
</object>
</child>
</object>
Expand Down

0 comments on commit 2fbae0a

Please sign in to comment.