Подробно это описано в АрчВики по следующим ссылкам:
Рекомендую использовать первый способ, а ещё - подкорректировать вики, у меня пока руки не доходят.
Беда в том, что меню генерируется без картинок. Пошаманив немного, а если быть точнее - подсмотрев в Mandriva 2009.1 как это сделано, сделал небольшой патч для xdg_menu который добавляет иконки в меню:
--- xdg_menu.old 2009-10-08 15:27:26.387920020 +1100
@@ -65,6 +65,89 @@
}
}
+sub findicon
+{
+
+# my $theme = "hicolor";
+
+ my $iconname = shift;
+
+
+ my $home = $ENV{"HOME"};
+ my $xdg_data_dirs = $ENV{"XDG_DATA_DIRS"};
+
+ my (@xdg_data_dirs);
+ @xdg_data_dirs = split(":",$xdg_data_dirs);
+
+ my (@icon_search_path);
+
+ my (@categorylist);
+ @categorylist = ("apps", "places", "devices", "actions", "animations", "categories", "emblems", "emotes", "filesystems", "intl", "mimetypes", "status", "stock");
+
+ my (@sizelist);
+ @sizelist = (16, 22, 24, 26, 32, 36, 48, 64, 72, 128, 192, 256);
+
+ my $thisdir = $home."/.icons";
+ ( -d $thisdir ) && push @icon_search_path, $thisdir;
+ foreach my $dir (@xdg_data_dirs)
+ {
+ my $theme = "hicolor";
+ my $size;
+ my $category;
+ foreach $size (@sizelist)
+ {
+ foreach $category (@categorylist)
+ {
+ $thisdir = $dir."/icons/".$theme."/".$size."x".$size."/".$category;
+ ( -d $thisdir ) && push @icon_search_path, $thisdir;
+ }
+ }
+ $thisdir = $dir."/icons/mini";
+ ( -d $thisdir ) && push @icon_search_path, $thisdir;
+ $thisdir = $dir."/icons";
+ ( -d $thisdir ) && push @icon_search_path, $thisdir;
+ $thisdir = $dir."/icons/large";
+ ( -d $thisdir ) && push @icon_search_path, $thisdir;
+ $theme = "gnome";
+ foreach $size (@sizelist)
+ {
+ foreach $category (@categorylist)
+ {
+ $thisdir = $dir."/icons/".$theme."/".$size."x".$size."/".$category;
+ ( -d $thisdir ) && push @icon_search_path, $thisdir;
+
+ }
+ }
+ }
+
+ push @icon_search_path, "/usr/share/pixmaps";
+
+ my $filename;
+
+ #if ( -f $iconname )
+ #{
+ # return $iconname;
+ #}
+ #else
+ {
+
+ foreach my $dir (@icon_search_path)
+ {
+ foreach my $ext ('','.png','.xpm')
+ {
+ $filename = $dir."/".$iconname.$ext;
+ ( -f $filename ) && return $filename;
+ }
+ }
+ }
+}
+
+sub add_png_extension_if_needed ($)
+{
+ my ($f) = @_;
+ return $f =~ /<br/>.(png|xpm|svg)$/ ? $f : "$f.png";
+}
+
sub scan_AppDir ($$;$)
{
my ($pool, $dir, $topdir) = @_;
@@ -1565,11 +1648,13 @@
$indent = 0 unless defined $indent;
my $menu_name = $menu->{'PrepName'};
+ #my $menu_icon = $menu->{'PrepIcon'} || "folder" ;
+ my $menu_icon = findicon($menu->{'PrepIcon'} || "folder");
if($indent)
{
$output .= ' ' x $indent;
1. $output .= "menu <br/>"$menu_name<br/>" folder {<br/>n";
+ $output .= "menu <br/>"$menu_name<br/>" $menu_icon {<br/>n";
}
foreach my $entry (@{$menu->{'entries'}})
@@ -1580,9 +1665,10 @@
my $name = $desktop->{'PrepName'};
my $exec = $desktop->{'PrepExec'};
+ my $icon = findicon(add_png_extension_if_needed($desktop->{'Icon'})) || "-";
$output .= ' ' x $indent;
1. $output .= " prog <br/>"$name<br/>" none $exec<br/>n";
+ $output .= " prog <br/>"$name<br/>" $icon $exec<br/>n";
}
elsif ($entry->{type} eq 'menu')
{
У меня получилось примерно следующее: