RetroZilla/extensions/xmlterm/scripts/xenv
2015-10-20 23:03:22 -04:00

84 lines
1.6 KiB
Perl

#!/usr/bin/perl
# xenv: defines XMLterm environment variables
# Usage: xenv [-s|--shell] <shell-path>
use Getopt::Long;
Getopt::Long::config('bundling');
&GetOptions("shell|s=s", "help|h");
if ($opt_help) {
print "Usage: xenv [-s <shell-path>]\n";
exit;
}
my $shell = $ENV{SHELL};
$shell = $opt_shell if $opt_shell;
my $cshell = 0;
$cshell = 1 if ($shell =~ /csh$/);
$| = 1; # Flush output
cbreak(); # Raw (noecho) mode
print STDERR "\033{A\n"; # Send escape sequence on STDERR
my $key = '';
my $param_str = "";
my $bytes = sysread(STDIN, $key, 1);
while ($bytes && ($key ne "\n")) {
$param_str .= $key;
$bytes = sysread(STDIN, $key, 1);
}
cooked(); # Cooked mode
my @params = split /;/, $param_str;
foreach my $param (@params) {
if ( $param =~ /^(\w+)=(.*)$/ ) {
my ($name, $value) = ($1, $2);
if ($cshell) {
print "setenv $name $value;\n";
} else {
print "$name=$value; export $name;\n";
}
}
}
exit;
BEGIN {
use POSIX qw(:termios_h);
my ($term, $oterm, $echo, $noecho, $fd_stdin);
$fd_stdin = fileno(STDIN);
$term = POSIX::Termios->new();
$term->getattr($fd_stdin);
$oterm = $term->getlflag();
$echo = ECHO | ECHOK | ICANON;
$noecho = $oterm & ~$echo;
sub cbreak {
$term->setlflag($noecho);
$term->setcc(VTIME, 1);
$term->setattr($fd_stdin, TCSANOW);
}
sub cooked {
$term->setlflag($oterm);
$term->setcc(VTIME, 0);
$term->setattr($fd_stdin, TCSANOW);
}
}
END { cooked() }