2007-01-16 00:40:16 +01:00
# macro: suse_update_desktop_file
#
# Used to add easily a category to .desktop files according to XDG
# standard.
#
. /usr/lib/rpm/map-desktop-category.sh
#
# parse arguments
#
INSTALL = no
I18N = yes
CREATE = no
RESET = no
UNIMPORTANT = no
NAME = no
COMMENT = no
GNAME = no
while [ " ${ 1 : 0 : 1 } " = "-" ] ; do
case ${ 1 } in
-u| --unimportant)
UNIMPORTANT = yes
shift
continue ; ;
-n| --no-i18n)
I18N = no
shift
continue ; ;
-i| --install)
INSTALL = yes
shift
continue ; ;
-r| --reset)
RESET = yes
shift
continue ; ;
-d| --docid)
shift
DOCID = " ${ 1 } "
shift
continue ; ;
-D| --docpath)
shift
DOCPATH = " ${ 1 } "
2007-04-24 13:57:29 +02:00
if ! [ -r " $RPM_BUILD_ROOT /opt/kde3/share/doc/HTML/en/ $DOCPATH /index.docbook " -o -r $RPM_BUILD_ROOT /usr/share/gnome/help/$DOCPATH /C/$DOCPATH .xml -o -r $RPM_BUILD_ROOT /usr/share/gnome/help/${ DOCPATH / \/ //C/ } ] ; then
2007-01-16 00:40:16 +01:00
echo WARNING: suse_update_desktop_file: DocPath target $DOCPATH for $FILE does not exist
fi
shift
continue ; ;
-c| --create)
CREATE = yes
INSTALL = yes
shift
continue ; ;
-C| --comment)
shift
COMMENT = " ${ 1 } "
shift
continue ; ;
-N| --name)
shift
NAME = " ${ 1 } "
shift
continue ; ;
-G| --genericname)
shift
GNAME = " ${ 1 } "
shift
continue ; ;
*)
echo " UNKNOWN OPTION: $1 "
exit 1 ; ;
esac
done
APPLICATION = " $1 "
shift
if [ " $CREATE " = "yes" ] ; then
NAME = " $1 "
shift
GNAME = " $1 "
shift
EXEC = " $1 "
shift
ICON = " $1 "
shift
if [ -z " $NAME " -o -z " $EXEC " ] ; then
echo ERROR: after --create you should define
echo DESKTOP_FILE_NAME NAME GENERICNAME EXECUTABLE \[ ICON CATEGORIES... \]
exit 1
fi
mkdir -p $RPM_BUILD_ROOT /usr/share/applications/
cat > $RPM_SOURCE_DIR /$APPLICATION .desktop << EOF
[ Desktop Entry]
Name = $NAME
GenericName = $GNAME
Type = Application
Exec = $EXEC
Icon = $ICON
EOF
NAME = no
GNAME = no
fi
if [ " $INSTALL " = "yes" ] ; then
mkdir -p $RPM_BUILD_ROOT /usr/share/applications/
FILE = ` find $RPM_SOURCE_DIR $RPM_BUILD_DIR /usr/share/update-desktop-files/templates . -name $APPLICATION .desktop| sort -r | head -n 1`
if [ -s " $FILE " ] ; then
cp " $FILE " $RPM_BUILD_ROOT /usr/share/applications/
icon_file = ` sed -n '/^\[Desktop Entry\]/,/(\[.*|$)/ s,Icon=\(.*\),\1,p' " $FILE " `
icon_file = ` find $RPM_SOURCE_DIR /usr/share/update-desktop-files/kappfinder-icons -maxdepth 1 -name ${ icon_file } .png -o -name ${ icon_file } .xpm -o -name $icon_file | sort -r | head -n 1`
if [ -s " $icon_file " ] ; then
mkdir -p $RPM_BUILD_ROOT /usr/share/pixmaps/
cp " $icon_file " $RPM_BUILD_ROOT /usr/share/pixmaps/
fi
fi
fi
while [ " $1 " ] ; do
CATEGORIES = " $CATEGORIES ; $1 "
shift
done
CATEGORIES = " ${ CATEGORIES #; } "
if [ -z " $APPLICATION " ] ; then
echo ERROR: suse_update_desktop_file: no application argument given
echo Example: use "qbrew" to edit qbrew.desktop
exit 1
fi
#
# find file
#
2007-04-24 16:39:59 +02:00
for i in /$RPM_BUILD_ROOT /opt/kde3/share/applications/kde/ /$RPM_BUILD_ROOT /opt/kde3/share/applnk /$RPM_BUILD_ROOT /usr/share/applications/ /$RPM_BUILD_ROOT /usr/share/gnome/apps/ ; do
2007-01-16 00:40:16 +01:00
[ -e " $i " ] && DIRS = " $DIRS $i "
done
if [ " ${ APPLICATION : 0 : 1 } " = = "/" -a -e " $APPLICATION " ] ; then
FILE_ = " $APPLICATION "
else
FILE_ = ` find $DIRS -name $APPLICATION .desktop`
fi
if [ -z " $FILE_ " ] ; then
echo ERROR: suse_update_desktop_file: unable to find $APPLICATION
exit 1
fi
FILE = ""
for i in $FILE_ ; do
#
# fix old files
#
sed -e 's/\[KDE Desktop Entry\]/[Desktop Entry]/' " $i " > " ${ i } _ " && mv " ${ i } _ " " $i "
if [ " $FILE " ] ; then
echo ERROR: suse_update_desktop_file: $APPLICATION has multiple desktop files
exit 1
fi
FILE = $i
done
#
# move KDE legacy files to XDG path
#
if echo $FILE | grep -q /opt/kde3/share/applnk/ ; then
if ! echo $FILE | grep -q /opt/kde3/share/applnk/.hidden/ ; then
if ! echo $FILE | grep -q /opt/kde3/share/applnk/Settings/ ; then
if ! echo $FILE | grep -q /opt/kde3/share/applnk/System/ScreenSavers/ ; then
echo WARNING: file is in old KDE legacy path, moving it to XDG path
mkdir -p $RPM_BUILD_ROOT /opt/kde3/share/applications/kde/
mv " $FILE " $RPM_BUILD_ROOT /opt/kde3/share/applications/kde/
FILE = " $RPM_BUILD_ROOT /opt/kde3/share/applications/kde/ ${ FILE ##*/ } "
fi
fi
fi
fi
#
# validate file
#
if [ ! -r " $FILE " ] ; then
echo ERROR: suse_update_desktop_file: unable to read $FILE
exit 1
fi
# esp. for susehelp
FILE_DOCPATH = ` sed -n -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,;, ,g' -e 's,^DocPath=\\(.*\\),\\1,p' ${ FILE } `
if [ -n " $FILE_DOCPATH " ] ; then
2007-04-24 13:57:29 +02:00
if [ ! -r " $RPM_BUILD_ROOT /opt/kde3/share/doc/HTML/en/ $FILE_DOCPATH /index.docbook " ] && [ ! -r " $RPM_BUILD_ROOT /usr/share/gnome/help/ $FILE_DOCPATH /C/ $FILE_DOCPATH .xml " ] && [ ! -r $RPM_BUILD_ROOT /usr/share/gnome/help/${ DOCPATH / \/ //C/ } ] ; then
2007-01-16 00:40:16 +01:00
echo WARNING: suse_update_desktop_file: DocPath target $FILE_DOCPATH for $FILE does not exist
fi
fi
#
# update Categories
#
if [ " $RESET " = "no" ] ; then
CATIN = ` sed -n -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,;, ,g' -e 's,^Categories=\\(.*\\),\\1,p' ${ FILE } `
fi
CATIN = " $CATIN ${ CATEGORIES //;/ } "
if [ -z " $CATIN " ] ; then
case " ${ FILE %/* } " in
*/opt/kde3/*) CATIN = "Qt KDE" ; ;
2007-04-24 13:57:29 +02:00
*/usr/share/gnome*) CATIN = "GTK" ; ;
2007-01-16 00:40:16 +01:00
esac
fi
unset CAT
unset DCAT
for i in $CATIN ; do
ret = ""
mapCategory $i
if [ -z " $ret " ] ; then
echo WARNING: Category \" $i \" is unknown \!
echo WARNING: it is ignored, until you registered a Category at adrian@suse.de .
else
echo " $CAT " | grep -q " [=;] $i ; " || CAT = " $CAT $ret ; "
fi
done
echo "" >> " ${ FILE } "
CAT = " ${ CAT #; } "
if grep -q ^Categories= $FILE ; then
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Categories=.*,Categories=' ${ CAT } ',' " $FILE " > " ${ FILE } .new " &&
mv " ${ FILE } .new " " ${ FILE } "
else
if [ -n " ${ CAT %; } " ] ; then
sed -e ' /^\[ Desktop Entry\] /a \
2007-04-26 19:02:35 +02:00
' " Categories= ${ CAT %; } ; " $FILE > ${ FILE } _ && mv ${ FILE } _ $FILE
2007-01-16 00:40:16 +01:00
fi
fi
if [ " $UNIMPORTANT " = "yes" ] ; then
sed -e ' /^\[ Desktop Entry\] /a \
X-SuSE-Unimportant= true' $FILE > ${ FILE } _ && mv ${ FILE } _ $FILE
fi
if [ " $DOCID " ] ; then
sed -e ' /^\[ Desktop Entry\] /a \
' " X-SuSE-DocTeamID= $DOCID " $FILE > ${ FILE } _ && mv ${ FILE } _ $FILE
fi
#
# check or set DocPath
#
DOCPATH_IS_GUESS = false
if [ -z " $DOCPATH " ] ; then
2007-04-24 13:57:29 +02:00
if [ -f $RPM_BUILD_ROOT /usr/share/gnome/help/$APPLICATION /C/$APPLICATION .xml ] ; then
2007-01-16 00:40:16 +01:00
DOCPATH = $APPLICATION
DOCPATH_IS_GUESS = true
fi
if [ -f $RPM_BUILD_ROOT /opt/kde3/share/doc/HTML/en/$APPLICATION /index.docbook ] ; then
DOCPATH = $APPLICATION
DOCPATH_IS_GUESS = true
fi
# NOTE: Here we can add guess for application/file.xml
fi
if [ -n " $DOCPATH " ] ; then
if [ -n " $FILE_DOCPATH " ] ; then
# DocPath already exists. Update it only from command line, not from guess.
if $DOCPATH_IS_GUESS ; then
if [ " $DOCPATH " != " $FILE_DOCPATH " ] ; then
echo WARNING: suse_update_desktop_file: DocPath target $FILE_DOCPATH differs from guess $DOCPATH for $FILE
fi
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^DocPath=.*,DocPath=' ${ DOCPATH } ',' " $FILE " > " ${ FILE } .new " &&
mv " ${ FILE } .new " " ${ FILE } "
fi
else
sed -e ' /^\[ Desktop Entry\] /a \
' " DocPath= ${ DOCPATH } " $FILE > ${ FILE } .new && mv ${ FILE } .new $FILE
if $DOCPATH_IS_GUESS ; then
echo NOTE: suse_update_desktop_file: Guessing DocPath = $DOCPATH in $FILE
fi
fi
fi
if [ " $I18N " = "yes" ] ; then
if [ " $NAME " != "no" ] ; then
grep -v '^Name\[' $FILE > ${ FILE } _
if [ -n " $NAME " ] ; then
if ! grep -q ^Name= ${ FILE } _; then
sed -e '/^\[Desktop Entry\]/a ' " Name= ${ NAME //,/ \, } " ${ FILE } _ > $FILE
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Name=.*,Name=' " ${ NAME //,/ \, } " ',' ${ FILE } _ > $FILE
fi
else
grep -v "^Name=" ${ FILE } _ > $FILE
fi
fi
if [ " $GNAME " != "no" ] ; then
grep -v '^GenericName\[' $FILE > ${ FILE } _
if [ -n " $GNAME " ] ; then
if ! grep -q ^GenericName= ${ FILE } _; then
sed -e '/^\[Desktop Entry\]/a ' " GenericName= ${ GNAME //,/ \, } " ${ FILE } _ > $FILE
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^GenericName=.*,GenericName=' " ${ GNAME //,/ \, } " ',' ${ FILE } _ > $FILE
fi
else
grep -v "^GenericName=" ${ FILE } _ > $FILE
fi
fi
if [ " $COMMENT " != "no" ] ; then
grep -v '^Comment\[' $FILE > ${ FILE } _
if [ -n " $COMMENT " ] ; then
if ! grep -q ^Comment= ${ FILE } _; then
sed -e '/^\[Desktop Entry\]/a ' " Comment= ${ COMMENT //,/ \, } " ${ FILE } _ > $FILE
else
sed -e '/^\[Desktop Entry\]/,/(\[.*|$)/ s,^Comment=.*,Comment=' " ${ COMMENT //,/ \, } " ',' ${ FILE } _ > $FILE
fi
else
grep -v "^Comment=" ${ FILE } _ > $FILE
fi
fi
if ! iconv -f utf-8 -t utf-8 $FILE & > /dev/null ; then
echo " ERROR: $FILE is not an UTF-8 file "
exit 1
fi
#
# Merge translations
#
for L in /usr/share/update-desktop-files/locale/translations_*; do
perl /usr/share/update-desktop-files/translate.pl $L $FILE > ${ FILE } _ && mv ${ FILE } _ $FILE || exit 1
done
else
#
# this file will not get translated
#
sed -e ' /^\[ Desktop Entry\] /a \
X-SuSE-translate= false' $FILE > ${ FILE } _ && mv ${ FILE } _ $FILE
fi
#
# CheckHardware checking
#
_EXEC = " `sed -n -e '/^\[Desktop Entry\]/,/(\[.*| $)/ s,^Exec=\(.*\),\1,p' $FILE ` "
EXEC = " ${ _EXEC #CheckHardware } "
EXEC = " ${ EXEC #--sound } "
EXEC = " ${ EXEC #--3D } "
EXEC = " ${ EXEC #--sound } "
_3D = ""
_SOUND = ""
grep -q " ^X-SuSE-needs-3D $" " $FILE " && _3D = "--3D"
grep -q " ^X-SuSE-needs-Sound $" " $FILE " && _SOUND = "--sound"
grep -q " ^ $RPM_PACKAGE_NAME $" /usr/share/update-desktop-files/packages-sound \
&& _SOUND = "--sound"
grep -q " ^ $RPM_PACKAGE_NAME $" /usr/share/update-desktop-files/packages-3D \
&& _3D = "--3D"
CHK = ""
if [ " $_3D " ] ; then
CHK = "CheckHardware"
EXEC = " $_3D $EXEC "
fi
if [ " $_SOUND " ] ; then
CHK = "CheckHardware"
EXEC = " $_SOUND $EXEC "
fi
if [ " $EXEC " != " $_EXEC " ] ; then
sed -e " s,^Exec=.*,Exec= ${ CHK } ${ EXEC } , " " $FILE " > " ${ FILE } .new " &&
mv " ${ FILE } .new " " ${ FILE } "
fi
2007-04-26 19:02:35 +02:00
2007-04-29 00:55:26 +02:00
/usr/bin/desktop-file-validate " ${ FILE } " || true