diff options
Diffstat (limited to '')
-rwxr-xr-x | scripts/desktop2menu.pl | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/scripts/desktop2menu.pl b/scripts/desktop2menu.pl new file mode 100755 index 0000000..195410b --- /dev/null +++ b/scripts/desktop2menu.pl @@ -0,0 +1,317 @@ +#!/usr/bin/perl + +# desktop2menu: This program generates a skeleton menu file from a +# freedesktop.org desktop file +# +# Written by Sune Vuorela <debian@pusling.com> +# Modifications by Adam D. Barratt <adam@adam-barratt.org.uk> +# Copyright 2007 Sune Vuorela <debian@pusling.com> +# Modifications Copyright 2007 Adam D. Barratt <adam@adam-barratt.org.uk> +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +=head1 NAME + +desktop2menu - create a menu file skeleton from a desktop file + +=head1 SYNOPSIS + +B<desktop2menu> B<--help>|B<--version> + +B<desktop2menu> I<desktop file> [I<package name>] + +=head1 DESCRIPTION + +B<desktop2menu> generates a skeleton menu file from the supplied +freedesktop.org desktop file. + +The package name to be used in the menu file may be passed as an additional +argument. If it is not supplied then B<desktop2menu> will attempt to derive +the package name from the data in the desktop file. + +=head1 LICENSE + +This program is Copyright (C) 2007 by Sune Vuorela <debian@pusling.com>. It +was modified by Adam D. Barratt <adam@adam-barratt.org.uk> for the devscripts +package. +This program comes with ABSOLUTELY NO WARRANTY. +You are free to redistribute this code under the terms of the GNU +General Public License, version 2 or later. + +=head1 AUTHOR + +Sune Vuorela <debian@pusling.com> with modifications by Adam D. Barratt +<adam@adam-barratt.org.uk> + +=cut + +use warnings; +use strict; +use Getopt::Long qw(:config bundling permute no_getopt_compat); +use File::Basename; + +my $progname = basename($0); + +BEGIN { + pop @INC if $INC[-1] eq '.'; + # Load the File::DesktopEntry module safely + eval { require File::DesktopEntry; }; + if ($@) { + my $progname = basename $0; + if ($@ =~ /^Can\'t locate File\/DesktopEntry\.pm/) { + die +"$progname: you must have the libfile-desktopentry-perl package installed\nto use this script\n"; + } + die +"$progname: problem loading the File::DesktopEntry module:\n $@\nHave you installed the libfile-desktopentry-perl package?\n"; + } + import File::DesktopEntry; +} + +use File::DesktopEntry; + +# Big generic mapping between fdo sections and menu sections +my %mappings = ( + "AudioVideo" => "Applications/Video", + "Audio" => "Applications/Sound", + "Video" => "Applications/Video", + "Development" => "Applications/Programming", + "Education" => "Applications/Education", + "Game" => "Games!WARN", + "Graphics" => "Applications/Graphics!WARN", + "Network" => "Applications/Network!WARN", + "Office" => "Applications/Office", + "System" => "Applications/System/Administration", + "Utility" => "Applications!WARN", + "Building" => "Applications/Programming", + "Debugger" => "Applications/Programming", + "IDE" => "Applications/Programming", + "Profiling" => "Applications/Programming", + "RevisionControl" => "Applications/Programming", + "Translation" => "Applications/Programming", + "Calendar" => "Applications/Data Management", + "ContactManagement" => "Applications/Data Management", + "Database" => "Applications/Data Management", + "Dictionary" => "Applications/Text", + "Chart" => "Applications/Office", + "Email" => "Applications/Network/Communication", + "Finance" => "Applications/Office", + "FlowChart" => "Applications/Office", + "PDA" => "Applications/Mobile Devices", + "ProjectManagement" => "Applications/Project Management", + "Presentation" => "Applications/Office", + "Spreadsheet" => "Applications/Office", + "Wordprocessor" => "Applications/Office", + "2DGraphics" => "Applications/Graphics", + "VectorGraphics" => "Applications/Graphics", + "RasterGraphics" => "Applications/Graphics", + "3DGraphics" => "Applications/Graphics", + "Scanning" => "Applications/Graphics", + "OCR" => "Applications/Text", + "Photography" => "Applications/Graphics", + "Publishing" => "Applications/Office", + "Viewer" => "Applications/Viewers", + "TextTools" => "Applications/Text", + "DesktopSettings" => "Applications/System/Administration", + "HardwareSettings" => "Applications/System/Hardware", + "Printing" => "Applications/System/Administration", + "PackageManager" => "Applications/System/Package Management", + "Dialup" => "Applications/System/Administration", + "InstantMesasging" => "Applications/Network/Communication", + "Chat" => "Applications/Network/Communication", + "IRCClient" => "Applications/Network/Communication", + "FileTransfer" => "Applications/Network/File Transfer", + "HamRadio" => "Applications/Amateur Radio", + "News" => "Applications/Network/Web News", + "P2P" => "Applications/File Transfer", + "RemoteAccess" => "Applications/System/Administration", + "Telephony" => "Applications/Network/Communication", + "TelephonyTools" => "Applications/Network/Communication", + "VideoConference" => "Applications/Network/Communication", + "Midi" => "Applications/Sound", + "Mixer" => "Applications/Sound", + "Sequencer" => "Applications/Sound", + "Tuner" => "Applications/TV and Radio", + "TV" => "Applications/TV and Radio", + "AudioVideoEditing" => "Applications/Video!WARN", + "Player" => "Applications/Video!WARN", + "Recorder" => "Applications/Video!WARN", + "DiscBurning" => "Applications/File Management", + "ActionGame" => "Games/Action", + "AdventureGame" => "Games/Adventure", + "ArcadeGame" => "Games/Action", + "BoardGame" => "Games/Board", + "BlocksGame" => "Games/Blocks", + "CardGame" => "Games/Card", + "KidsGames" => "Games/Toys!WARN", + "LogicGames" => "Games/Puzzles", + "RolePlaying" => "Games/Adventure", + "Simulation" => "Games/Simulation", + "SportsGame" => "Games/Action", + "StrategyGame" => "Games/Strategy", + "Art" => "Applications/Education", + "Construction" => "Applications/Education", + "Music" => "Applications/Education", + "Languages" => "Applications/Education", + "Science" => "Applications/Science!WARN", + "ArtificialIntelligence" => "Applications/Science!WARN", + "Astronomy" => "Applications/Science/Astronomy", + "Biology" => "Applications/Science/Biology", + "Chemistry" => "Applications/Science/Chemistry", + "ComputerScience" => "Applications/Science/Electronics!WARN", + "DataVisualization" => "Applications/Science/Data Analysis", + "Economy" => "Applications/Office", + "Electricity" => "Applications/Science/Engineering", + "Geography" => "Applications/Science/Geoscience", + "Geology" => "Applications/Science/Geoscience", + "Geoscience" => "Applications/Science/Geoscience", + "History" => "Applications/Science/Social", + "ImageProcessing" => "Applications/Graphics", + "Literature" => "Applications/Data Management", + "Math" => "Applications/Science/Mathematics", + "NumericalAnalyzisis" => "Applications/Science/Mathematics", + "MedicalSoftware" => "Applications/Science/Medicine", + "Physics" => "Applications/Science/Physics", + "Robotics" => "Applications/Science/Engineering", + "Sports" => "Games/Tools!WARN", + "ParallelComputing" => "Applications/Science/Electronics!WARN", + "Amusement" => "Games/Toys", + "Archiving" => "Applications/File Management", + "Compression" => "Applications/File Management", + "Electronics" => "Applications/Science/Electronics", + "Emulator" => "Applications/Emulators", + "Engineering" => "Applications/Science/Engineering", + "FileTools" => "Applications/File Management", + "FileManager" => "Applications/File Management", + "TerminalEmulator" => "Applications/Shells", + "Filesystem" => "Applications/System/Administration", + "Monitor" => "Applications/System/Monitoring", + "Security" => "Applications/System/Security", + "Accessibility" => "Applications/Accessibility", + "Calculator" => "Applications/Science/Mathematics", + "Clock" => "Games/Toys", + "TextEditor" => "Applications/Editors", +); + +#values mentioned in Categories we accept as valid hints. +my %hintscategories = ( + "KDE" => "true", + "Qt" => "true", + "GNOME" => "true", + "GTK" => "true", +); + +my ($opt_help, $opt_version); + +GetOptions( + "help|h" => \$opt_help, + "version" => \$opt_version, + ) + or die +"Usage: $progname desktopfile packagename\nRun $progname --help for more details\n"; + +if ($opt_help) { help(); exit 0; } +if ($opt_version) { version(); exit 0; } + +if (@ARGV == 0) { + help(); + exit 0; +} + +my $section; +my @hints; +my $needs; +my $warnings = 0; + +my $filename = shift @ARGV; +my $file = File::DesktopEntry->new_from_file("$filename"); + +# do menu files for non-applications make sense? +die $file->get_value('Name') . " isn't an application\n" + unless $file->get_value('Type') eq 'Application'; + +my $package = join(' ', @ARGV); +if (!$package) { + # Bad guess, but... maybe icon name could be better? + $package = $file->get_value('Name'); + print STDERR + "WARNING: Package not specified. Guessing package as: $package\n"; + $warnings++; +} + +my $category = $file->get_value('Categories'); + +my @categories = reverse split(";", $category); +foreach (@categories) { + if ($mappings{$_} && !$section) { + $section = $mappings{$_}; + } + if ($hintscategories{$_}) { + push(@hints, $_); + } +} + +die "Desktop file has invalid categories" unless $section; + +# Not all mappings are completely accurate. Most are, but... +if ($section =~ /!WARN/) { + print STDERR + "WARNING: Section is highly inaccurate. Please check it manually\n"; + $warnings++; +} + +# Let's just pretend that the wm and the vc needs don't exist. +if ($category =~ /ConsoleOnly/) { + $needs = "text"; +} else { + $needs = "X11"; +} + +print "\n" if $warnings > 0; +print "?package(" . $package . "): \\\n"; +print "\tneeds=\"" . $needs . "\" \\\n"; +print "\tsection=\"" . $section . "\" \\\n"; +print "\ttitle=\"" . $file->get_value('Name') . "\" \\\n"; +print "\thints=\"" . join(",", @hints) . "\" \\\n" if @hints; +print "\tcommand=\"" . $file->get_value('Exec') . "\" \\\n"; +print "\ticon=\"/usr/share/pixmaps/" + . $file->get_value('Icon') + . ".xpm\" \\\n"; +print "\n"; + +# Unnecessary. but for clarity +exit 0; + +sub help { + print <<"EOF"; +Usage: $progname [options] filename packagename + +Valid options are: + --help, -h Display this message + --version, -v Display version and copyright info +EOF +} + +sub version { + print <<"EOF"; +This is $progname, from the Debian devscripts package, version ###VERSION### +Copyright (C) 2007 by Sune Vuorela <debian\@pusling.com>. +Modifications copyright (C) 2007 by Adam D. Barratt <adam\@adam-barratt.org.uk> + +This program comes with ABSOLUTELY NO WARRANTY. +You are free to redistribute this code under the terms of the +GNU General Public License, version 2, or (at your option) any +later version. +EOF +} |