mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-14 11:40:13 +01:00
84 lines
1.6 KiB
Perl
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() }
|