Fix i3-dmenu-desktop quoted command name

According to the Desktop Entry Specification
https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables
the executable name or path of the executable may be quoted. This is not
properly respected when i3-dmenu-desktop extracts the command name from
the Exec entry.

Examples of values that fail and what they currently result in:

- "bar" -> "bar"
- "foo/bar" -> bar"
- "foo foobar/bar" -> "foo
- "foo\sbar" -> "foo\sbar"
- foo\sbar -> foo\sbar
- "foo\\\\bar" -> "foo\\\\bar"
This commit is contained in:
Sebastian Larsson 2017-04-30 14:40:04 +02:00
parent 1d4e9f5de0
commit 32175b0a1f
1 changed files with 25 additions and 1 deletions

View File

@ -282,7 +282,31 @@ for my $app (keys %apps) {
} }
if ((scalar grep { $_ eq 'command' } @entry_types) > 0) { if ((scalar grep { $_ eq 'command' } @entry_types) > 0) {
my ($command) = split(' ', $apps{$app}->{Exec}); my $command = $apps{$app}->{Exec};
# Handle escape sequences (should be done for all string values, but does
# matter here).
my %escapes = (
'\\s' => ' ',
'\\n' => '\n',
'\\t' => '\t',
'\\r' => '\r',
'\\\\' => '\\',
);
$command =~ s/(\\[sntr\\])/$escapes{$1}/go;
# Extract executable
if ($command =~ m/^\s*([^\s\"]+)(?:\s|$)/) {
# No quotes
$command = $1;
} elsif ($command =~ m/^\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"(?:\s|$)/) {
# Quoted, remove quotes and fix escaped characters
$command = $1;
$command =~ s/\\([\"\`\$\\])/$1/g;
} else {
# Invalid quotes, fallback to whitespace
($command) = split(' ', $command);
}
# Dont add “geany” if “Geany” is already present. # Dont add “geany” if “Geany” is already present.
my @keys = map { lc } keys %choices; my @keys = map { lc } keys %choices;