initial commit

This commit is contained in:
Michele Guerini Rocco 2020-02-22 12:22:36 +01:00
commit 0df16a81cd
Signed by: rnhmjoj
GPG Key ID: BFBAF4C975F76450
3 changed files with 133 additions and 0 deletions

24
default.nix Normal file
View File

@ -0,0 +1,24 @@
{ stdenv, perlPackages }:
stdenv.mkDerivation rec {
pname = "urxvt-config-reload";
version = "1.0";
src = ./src;
passthru.perlPackages = with perlPackages;
[ AnyEvent LinuxFD SubExporter
DataOptList ParamsUtil SubInstall
];
installPhase = ''
install -D -m644 "$src"/* -t "$out/lib/urxvt/perl"
'';
meta = with stdenv.lib; {
description = "A urxvt plugin that reloads the configuration on SIGUSR1";
homepage = "https://maxwell.ydns.eu/git/rnhmjoj/urxvt-config-reload";
maintainers = with maintainers; [ rnhmjoj ];
platforms = platforms.unix;
};
}

32
src/config-print Normal file
View File

@ -0,0 +1,32 @@
#! perl
use v5.20;
use strict;
use warnings;
no warnings "experimental";
our @resources = (
qw(
background foreground cursorColor
pointerColor pointerColor2
highlight borderColor
font geometry
),
map { "color$_" } 0..15
);
sub on_start {
my %fallbacks = (
borderColor => "background",
cursorColor => "foreground");
for (@resources) {
my $val = $TERM->x_resource($_);
my $default = $TERM->x_resource($fallbacks{$_});
if (not $val and $default){
$val = $default
}
say "$_: " . $val;
}
exit;
}

77
src/config-reload Normal file
View File

@ -0,0 +1,77 @@
#! perl
use v5.20;
use strict;
use warnings;
no warnings "experimental";
use AnyEvent;
use Linux::FD qw(signalfd);
use POSIX;
use File::Basename qw(dirname);
my $sigset = POSIX::SigSet->new(&POSIX::SIGUSR1);
sigprocmask(SIG_BLOCK, $sigset);
my $sigfd = signalfd($sigset);
my $libdir = dirname(__FILE__);
our @terms = ();
sub reload_all {
my @lines = `urxvt --perl-lib $libdir -pe config-print 2>&1`;
my %resource;
for (@lines) {
$resource{$1} = $2 if (/(.*?): (.*)/);
}
my $cmd = "";
my $i = 0;
RESOURCE:
for (keys %resource) {
my $key;
given ($_) {
$key = "4;$1" when (/color(\d+)/);
$key = 10 when "foreground";
$key = 11 when "background";
$key = 12 when "cursorColor";
$key = 13 when "pointerColor2";
$key = 14 when "pointerColor";
$key = 17 when "highlight";
$key = 708 when "borderColor";
$key = 710 when "font";
when ("geometry") {
if (my ($col, $row) = $resource{$_} =~ /(\d+)x(\d+)/) {
$cmd .= "\e[8;${row};${col}t";
}
next RESOURCE;
}
default { next RESOURCE }
}
my $val = $resource{$_};
$cmd .= "\e]$key;$val\a";
}
for (@terms) {
$_->cmd_parse($cmd);
}
}
our $watch = AnyEvent->io (
fh => $sigfd, # which file handle to check
poll => "r", # which event to wait for ("r"ead data)
cb => sub { # what callback to execute
sysread $sigfd, my $dummy, 4096;
reload_all;
}
);
sub on_start {
my ($ext) = @_;
push @terms, $TERM;
();
}
sub on_destroy {
my ($ext) = @_;
@terms = grep { $_ != $TERM } @terms;
if (!@terms) { undef $watch; }
();
}