From 5fe49cc123b1cc363e1cf6305884c64e71f73670 Mon Sep 17 00:00:00 2001 From: Urbain Vaes Date: Fri, 10 Jul 2015 17:09:02 +0100 Subject: Add script for instant change of terminal colors --- urxvt/ext/rotate-colors | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 urxvt/ext/rotate-colors (limited to 'urxvt') diff --git a/urxvt/ext/rotate-colors b/urxvt/ext/rotate-colors new file mode 100644 index 0000000..0016d6a --- /dev/null +++ b/urxvt/ext/rotate-colors @@ -0,0 +1,92 @@ +#! /usr/bin/env perl -w +# Author: John Tyree +# Website: http://github.com/johntyree/urxvt-perls/blob/master/rotate-colors +# License: CCBYNC + +# Use keyboard shortcuts to load colors of the form *.colorN:XXXXXX from a file +# This gives us "on demand" theme switching. + +# Usage: put the following lines in your .Xdefaults/.Xresources: +# URxvt.perl-ext-common: ...,rotate-colors +# URxvt.rotate-colors.files: ~/.Xresources,~/light.txt,~/dark.txt +# URxvt.keysym.M-C-n: perl:rotate-colors:next +# URxvt.keysym.M-C-p: perl:rotate-colors:prev + +use strict; + + +sub on_start { + my ($self) = @_; + $self->{current_index} = -1; + my @arr = split(/,/, $self->x_resource('files') || ''); + $self->{color_files} = \@arr; + + () +} + +sub read_colors { + my $fn = shift; + open my $fin, $fn or print STDERR "Unable to open $fn for reading"; + my %colors; + + while (my $line = <$fin>) { + if ($line =~ /(\w+)\s*:\s*(#[0-9a-fA-F]+)/) { + $colors{$1} = $2; + } + } + + return %colors +} + +sub escape_seq { + my ($k, $v) = @_; + my $cmd = ""; + if ($k =~ /^color(\d+)$/) { + $cmd = "4;$1;$v"; + } elsif ($k =~ /^colorBD$/) { + $cmd = "5;0;$v"; + } elsif ($k =~ /^colorUL$/) { + $cmd = "5;1;$v"; + } elsif ($k =~ /^colorBL$/) { + $cmd = "5;2;$v"; + } elsif ($k =~ /^colorRV$/) { + $cmd = "5;3;$v"; + } elsif ($k =~ /^foreground$/) { + $cmd = "10;$v"; + } elsif ($k =~ /^background$/) { + $cmd = "11;$v"; + } elsif ($k =~ /^cursorColor$/) { + $cmd = "12;$v"; + } elsif ($k =~ /^pointerColor$/) { + $cmd = "13;$v"; + } + + return '\033]'.$cmd.'\007' +} + +sub build_cmd { + my $fn = shift; + my %colors = read_colors($fn); + print $fn."\n"; + my $s = join("", map {escape_seq($_, $colors{$_})} keys %colors); + + return $s +} + +sub on_user_command { + my ($self, $cmd) = @_; + my @fs = @{$self->{color_files}}; + my $len = @fs; + + if ($cmd eq "rotate-colors:next") { + my $idx = $self->{current_index}++; + my $fn = $fs[$idx % scalar(@fs)]; + $self->cmd_parse(build_cmd($fn)); + } elsif ($cmd eq "rotate-colors:prev") { + my $idx = $self->{current_index}--; + my $fn = $fs[$idx % scalar(@fs)]; + $self->cmd_parse(build_cmd($fn)); + } + + () +} -- cgit v1.2.3