1
1
# !/usr/bin/perl
2
2
3
- # Copyright (C) 2010-2022 Daniel "Trizen" Șuteu <echo dHJpemVuQHByb3Rvbm1haWwuY29tCg== | base64 -d>.
3
+ # Copyright (C) 2010-2023 Daniel "Trizen" Șuteu <echo dHJpemVuQHByb3Rvbm1haWwuY29tCg== | base64 -d>.
4
4
#
5
5
# This program is free software: you can redistribute it and/or modify
6
6
# it under the terms of the GNU General Public License as published by
22
22
# Name: fbmenugen
23
23
# License: GPLv3
24
24
# Created on: 01 August 2010
25
- # Latest edit on: 06 September 2022
25
+ # Latest edit on: 22 September 2023
26
26
# https://github.com/trizen/fbmenugen
27
27
28
28
use 5.014;
29
29
use File::Spec;
30
30
use Linux::DesktopFiles 0.25;
31
31
32
32
my $pkgname = ' fbmenugen' ;
33
- my $version = ' 0.87 ' ;
33
+ my $version = ' 0.88 ' ;
34
34
35
35
my ($with_icons , $db_clean , $create_menu , $pipe , $reload_config , $update_config );
36
36
@@ -43,14 +43,16 @@ my $home_dir =
43
43
|| ` echo -n ~` ;
44
44
45
45
my $xdg_config_home = $ENV {XDG_CONFIG_HOME } || " $home_dir /.config" ;
46
+ my $xdg_cache_home = $ENV {XDG_CACHE_HOME } || " $home_dir /.cache" ;
46
47
47
48
my $config_dir = " $xdg_config_home /$pkgname " ;
48
49
my $schema_file = " $config_dir /schema.pl" ;
49
50
my $config_file = " $config_dir /config.pl" ;
50
- my $cache_db = " $config_dir /cache.db " ;
51
+ my $cache_dir = " $xdg_cache_home / $pkgname " ;
51
52
my $fluxbox_dir = " $home_dir /.fluxbox" ;
52
53
my $menu_file = " $fluxbox_dir /menu" ;
53
- my $icons_dir = " $config_dir /icons" ;
54
+ my $cache_db = " $cache_dir /cache.db" ;
55
+ my $icons_dir = " $cache_dir /icons" ;
54
56
55
57
sub usage {
56
58
print <<"HELP" ;
@@ -179,6 +181,12 @@ if (not -d $config_dir) {
179
181
or die " $0 : can't create configuration directory `$config_dir ': $! \n " ;
180
182
}
181
183
184
+ if (not -d $cache_dir ) {
185
+ require File::Path;
186
+ File::Path::make_path($cache_dir )
187
+ or die " $0 : can't create cache directory `$cache_dir ': $! \n " ;
188
+ }
189
+
182
190
if ($with_icons and not -d $icons_dir ) {
183
191
remove_database($cache_db );
184
192
require File::Path;
@@ -281,12 +289,23 @@ if ($CONFIG{VERSION} != $version) {
281
289
dump_configuration();
282
290
}
283
291
292
+ # <<<
293
+ my @desktop_files_paths = do {
294
+ my %seen ;
295
+ grep { !$seen {$_ }++ } (
296
+ ($ENV {XDG_DATA_DIRS } ? split (/ :/ , $ENV {XDG_DATA_DIRS }) : ()),
297
+ @{$CONFIG {' Linux::DesktopFiles' }{desktop_files_paths }},
298
+ );
299
+ };
300
+ # >>>
301
+
284
302
my $desk_obj = Linux::DesktopFiles-> new(
285
303
%{$CONFIG {' Linux::DesktopFiles' }},
304
+ desktop_files_paths => \@desktop_files_paths ,
286
305
287
306
categories => [map { exists ($_ -> {cat }) ? $_ -> {cat }[0] : () } @$SCHEMA ],
288
307
289
- keys_to_keep => [' Name' , ' Exec' ,
308
+ keys_to_keep => [' Name' , ' Exec' , ' Path ' ,
290
309
($with_icons ? ' Icon' : ()),
291
310
(
292
311
ref ($CONFIG {' Linux::DesktopFiles' }{skip_entry }) eq ' ARRAY'
@@ -475,6 +494,7 @@ foreach my $file ($desk_obj->get_desktop_files) {
475
494
%info = (
476
495
Name => $entry -> {Name } // next ,
477
496
Exec => $entry -> {Exec } // next ,
497
+ Path => $entry -> {Path } // ' ' ,
478
498
479
499
(
480
500
$with_icons
@@ -487,6 +507,15 @@ foreach my $file ($desk_obj->get_desktop_files) {
487
507
);
488
508
# >>>
489
509
510
+ # Support for the Path key
511
+ if ($info {Path } ne ' ' ) {
512
+ require Encode;
513
+ my $path = Encode::decode_utf8($info {Path });
514
+ my $exec = Encode::decode_utf8($info {Exec });
515
+ $exec = " $^X -e 'chdir(\$ ARGV[0]) && exec(\$ ARGV[1])' \Q $path \E \Q $exec \E " ;
516
+ $info {Exec } = Encode::encode_utf8($exec );
517
+ }
518
+
490
519
eval {
491
520
492
521
state $x = do {
0 commit comments