summaryrefslogtreecommitdiff
path: root/urxvt/ext/rotate-colors
diff options
context:
space:
mode:
authorUrbain Vaes <urbain@vaes.uk>2015-07-10 17:09:02 +0100
committerUrbain Vaes <urbain@vaes.uk>2015-07-10 17:09:02 +0100
commit5fe49cc123b1cc363e1cf6305884c64e71f73670 (patch)
tree071f825e97079c4e9e8cecc879b635f53e5e68e1 /urxvt/ext/rotate-colors
parentb9d5965cc53bfea0d419fe3b320cb43e164b324d (diff)
Add script for instant change of terminal colors
Diffstat (limited to 'urxvt/ext/rotate-colors')
-rw-r--r--urxvt/ext/rotate-colors92
1 files changed, 92 insertions, 0 deletions
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));
+ }
+
+ ()
+}