Initial release.
This commit is contained in:
commit
90812cb89b
|
@ -0,0 +1,6 @@
|
|||
all:
|
||||
|
||||
install: $(HOME)/bin/xfce-xterm-launcher-update
|
||||
|
||||
$(HOME)/bin/%: %
|
||||
cp $^ $@
|
|
@ -0,0 +1,103 @@
|
|||
#!/usr/bin/perl
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
use File::Slurp;
|
||||
use Data::Dumper;
|
||||
|
||||
my $launcher = $ARGV[0];
|
||||
|
||||
my $launcher_dir = "$ENV{HOME}/.config/xfce4/panel/launcher-$launcher";
|
||||
|
||||
my @desktop_files = glob("$launcher_dir/*.desktop");
|
||||
|
||||
my %desktop_files;
|
||||
for (@desktop_files) {
|
||||
my $content = read_file($_);
|
||||
my ($name) = $content =~ /^Name=(\N*)/ms;
|
||||
$desktop_files{$name} = { name => $name, filename => $_, content => $content }
|
||||
}
|
||||
|
||||
my @xterm_scripts = glob("$ENV{HOME}/bin/hosts/*");
|
||||
@xterm_scripts = sort { -A $a <=> -A $b } @xterm_scripts;
|
||||
@xterm_scripts = @xterm_scripts[0..31];
|
||||
for my $xterm_script (@xterm_scripts) {
|
||||
my ($name) = $xterm_script =~ m{([^/]+)$};
|
||||
if ($desktop_files{$name}) {
|
||||
$desktop_files{$name}{current} = 1;
|
||||
parse($desktop_files{$name});
|
||||
my $icon_file = icon_file($name);
|
||||
if ($desktop_files{$name}{content_fields}{Icon} ne $icon_file) {
|
||||
$desktop_files{$name}{content_fields}{Icon} = $icon_file;
|
||||
replace($desktop_files{$name});
|
||||
say STDERR "replaced desktop entry $desktop_files{$name}{filename} for $name";
|
||||
}
|
||||
} else {
|
||||
|
||||
$desktop_files{$name} = {
|
||||
content_fields => {
|
||||
Name=> $name,
|
||||
Type=> 'Application',
|
||||
Exec=> "xterm -e $name",
|
||||
Terminal=> 'false',
|
||||
Icon=> icon_file($name),
|
||||
Path=> "$ENV{HOME}/tmp",
|
||||
StartupNotify=> 'false',
|
||||
},
|
||||
current => 1
|
||||
};
|
||||
replace($desktop_files{$name});
|
||||
say STDERR "created new desktop entry $desktop_files{$name}{filename} for $name";
|
||||
}
|
||||
}
|
||||
|
||||
$desktop_files{XTerm}{current} = 1; # we always want that
|
||||
|
||||
for my $name (sort keys %desktop_files) {
|
||||
unless ($desktop_files{$name}{current}) {
|
||||
say STDERR "deleting obsolete desktop entry $desktop_files{$name}{filename} for $name";
|
||||
unlink($desktop_files{$name}{filename});
|
||||
}
|
||||
}
|
||||
|
||||
sub icon_file {
|
||||
my ($name) = @_;
|
||||
for ("$ENV{HOME}/icons/$name.png",
|
||||
"$ENV{HOME}/icons/$name.jpg") {
|
||||
return $_ if -f $_;
|
||||
}
|
||||
return "xterm-color_48x48";
|
||||
}
|
||||
|
||||
sub parse {
|
||||
my ($desktop_file) = @_;
|
||||
for (split(/\n/, $desktop_file->{content})) {
|
||||
if (my ($k, $v) = m/^(\w+)=(.+)/) {
|
||||
$desktop_file->{content_fields}{$k} = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub replace {
|
||||
my ($desktop_file) = @_;
|
||||
|
||||
if ($desktop_file->{filename}) {
|
||||
unlink($desktop_file->{filename});
|
||||
}
|
||||
my $filename;
|
||||
my $base = "$launcher_dir/" . time();
|
||||
my $ext = 0;
|
||||
# XXX - possible race condition, but we don't expect this script
|
||||
# to run concurrently for the same user.
|
||||
for(;;) {
|
||||
$filename = "$base$ext.desktop";
|
||||
last unless (-f $filename);
|
||||
$ext++;
|
||||
}
|
||||
open(my $fh, '>', $filename);
|
||||
print $fh "[Desktop Entry]\n";
|
||||
for my $k (sort keys $desktop_file->{content_fields}) {
|
||||
print $fh "$k=$desktop_file->{content_fields}{$k}\n";
|
||||
}
|
||||
close($fh);
|
||||
}
|
Loading…
Reference in New Issue