From 54fecca8479035762b6f6c638c2082f13948c2c7 Mon Sep 17 00:00:00 2001 From: Jon Trulson Date: Sat, 19 Jul 2014 18:33:12 -0600 Subject: [PATCH] contrib/: add desktop2dt from Isaac Dunham --- cde/contrib/desktop2dt/README | 120 +++++++++++++++++++++++ cde/contrib/desktop2dt/desktop2dt | 154 ++++++++++++++++++++++++++++++ 2 files changed, 274 insertions(+) create mode 100644 cde/contrib/desktop2dt/README create mode 100644 cde/contrib/desktop2dt/desktop2dt diff --git a/cde/contrib/desktop2dt/README b/cde/contrib/desktop2dt/README new file mode 100644 index 00000000..d6d2ebe4 --- /dev/null +++ b/cde/contrib/desktop2dt/README @@ -0,0 +1,120 @@ +Hello, +Earlier I noticed that *.dt files contain much the same information as +*.desktop files, so I thought I'd see about automatically converting +from *.desktop to *.dt. +Here's a first try, in the form of a shell script. +It reads one or more desktop files, listed on the command line, +to generate as many .dt files and the corresponding icons. +Each .dt file contains only the action that would start the command. + +This does NOT handle quite a few things: +-multiple locales ( for example, Comment[de]= could make an entry in the +right locale). +-putting anything in the right place +-line-wrapped entries +-adding entries to the app manager +-file types and associations +-most sanity checks + +That said, this works for me: +cd emptydir +desktop2dt /usr/share/applications/nedit.desktop \ + /usr/share/applications/xephem.desktop +mv *.dt ~/.dt/types/ +mv *.pm ~/.dt/icons/ +touch ~/.dt/appmanager/Desktop_Apps/nedit +touch ~/.dt/appmanager/Desktop_Apps/xephem +chmod +x ~/.dt/appmanager/Desktop_Apps/nedit +chmod +x ~/.dt/appmanager/Desktop_Apps/xephem + +and then go to Desktop_Tools > Reload Applications + +I'd like to hear any comments you have. + +Thanks, +Isaac Dunham + +=-= +Hello, +I've been working on desktop2dt some more, and have a version that +works much better. +It can handle icons in subdirectories, installing files (to $DESTDIR/etc/dt +or ~/.dt), and terminal applications. + +There are still some missing features: +-line-wrapped entries +-adding entries to the app manager +-file types and associations + Unless we use libmagic, this will be a real pain. +-multiple locales ( for example, Comment[de]= could make an entry in the + right locale). + +Currently, it's hard-coded to output action databases in the C locale. + + +Usage is similar to the last version, except -i installs everything: +desktop2dt -i /usr/share/applications/nedit.desktop \ + /usr/share/applications/xephem.desktop +touch ~/.dt/appmanager/Desktop_Apps/nedit +touch ~/.dt/appmanager/Desktop_Apps/xephem +chmod +x ~/.dt/appmanager/Desktop_Apps/nedit +chmod +x ~/.dt/appmanager/Desktop_Apps/xephem + + and then go to Desktop_Tools > Reload Applications + +If you can test it, that will be a great help. I've tried to stick to POSIX, +but I only tested on Squeeze. + +Thanks, +Isaac Dunham + +=-= + +Hello, + +Here's the third revision of the script. + +What's new: + +* Converts %u, %U, %f, and %F to "%(File)Arg_1%" (with quotes). +* -a option to install in the app manager +(Thanks to Antonis Tsolomis for suggesting these improvements.) + +* Slightly improved icon location search (based on PREFIX). + +Still needs to handle wrapped lines, but that's the main issue with +processing .desktop files for applications that remains. + +HTH, +Isaac Dunham + +=-= +Here's a fourth revison of desktop2dt. +Changes: +* export and test were changed for compatability with old shells like + Solaris has +* ~ was changed to $HOME because it didn't always get expanded. + +Not yet changed: +I'm inclined to prevent creation of appmanager folders more than 3 deep. + +Still no multi-locale stuff. If someone has a way to figure out which +locales to grab (two-letter) and where they go (CDE locale), I'm open to +including it. + +Still doesn't handle line wrap. I may be able to deal with this. + +The more platforms it's tested on, the better; I'd like to hear from +someone using one of the BSDs. + +So far, it's been tested on Debian and Solaris, with at least the +following shells on Debian: +bash, dash, busybox ash, pdksh, mksh, ksh93 +This would suggest that it should work on all the BSDs as well. + +Besides POSIX sh, find, sed, and grep, it needs imagemagick (or +graphicksmagick + imagemagick-compat). + +Thanks, +Isaac Dunham + diff --git a/cde/contrib/desktop2dt/desktop2dt b/cde/contrib/desktop2dt/desktop2dt new file mode 100644 index 00000000..a071fc41 --- /dev/null +++ b/cde/contrib/desktop2dt/desktop2dt @@ -0,0 +1,154 @@ +#!/bin/sh +# Copyright 2013, Isaac Dunham +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +# Name= -> LABEL ... +# Icon= -> ICON ... +# (use imagemagick/gm convert to resize and change format) +# Comment= -> DESCRIPTION +# Exec= -> EXEC_STRING +# (note: %F means "file name"; = "%(File)Arg_1%" ) +# Terminal=false/0 -> WINDOW_TYPE NO_STDIO +# Terminal=true/1 -> WINDOW_TYPE PERM_TERMINAL +# or maybe something else is a little better than PERM_TERMINAL + +# Note that the component of an ACTION MUST be in the right order! +# for example, EXEC_STRING must be before ICON, or you will not +# get the right icon or command. + +usage(){ + echo "Usage: $0"' [-i] [-a] some.desktop ...' + echo "generates some.dt and the appropriate icons" + echo "If -i is specified, some.dt and the icons are installed" + echo '(in $DESTDIR/etc/dt if possible, otherwise in $HOME/.dt)' + echo 'If -a is specified, appmanager files are created' + echo '(in $DESTDIR/etc/dt/appconfig/appmanager/C or $HOME/.dt/appmanager)' + exit 1 +} + +#find_convert icon | /path/to/icon.png +# Find icon and convert it to an xpm of suitable size; t/m/l = 16/32/48 +find_convert(){ + ICON="" + case "$1" in + /*) + ICON="$1" + ;; + *) + ICON=` find ${PREFIX:-$DESTDIR/usr}/share/pixmaps \ + ${PREFIX:-$DESTDIR/usr}/share/icons \ + $DESTDIR$PREFIX/share/pixmaps $DESTDIR$PREFIX/share/icons \ + /usr/share/pixmaps /usr/share/icons \ + -type f -name "$1" -o -name "$1.png" -o -name "$1.xpm" \ + -o -name "$1-32.xpm" -o -name "$1_*x*.xpm" \ + -o -name "$1.svg" -o -name "$1.jp*g" | head -n 1` + ;; + esac + export ICON +# echo "For $1: $ICON" 1>&2 + NEWICON=`basename $ICON|sed -e 's/\.xpm$//' -e 's/\.png$//' -e 's/\.svg$//' -e 's/\.jpe*g$//' -e 's/[-_][1-9][0-9x]*$//g'` + convert -resize 48x48 "$ICON" "$NEWICON.l.xpm" && \ + mv "$NEWICON.l.xpm" "$ICONDIR$NEWICON.l.pm" + convert -resize 32x32 "$ICON" "$NEWICON.m.xpm" && \ + mv "$NEWICON.m.xpm" "$ICONDIR$NEWICON.m.pm" + convert -resize 16x16 "$ICON" "$NEWICON.t.xpm" && \ + mv "$NEWICON.t.xpm" "$ICONDIR$NEWICON.t.pm" + echo "$NEWICON" +} + + +# usage: process_desktop /path/to/some.desktop >some.dt +# Writes a CDE action equivalent to some.desktop to stdout. +process_desktop(){ + echo "ACTION `basename $1 .desktop`" + echo '{' + LABEL="`sed -ne 's/^Name=//p' $1`" + [ -n "$LABEL" ] && echo " LABEL $LABEL" + echo ' TYPE COMMAND' + sed -ne 's/%[ufUF]/"%(File)Arg_1%"/g' -e 's/^Exec=/ EXEC_STRING /p' "$1" + ICON="`sed -ne 's:^Icon=::p' $1`" + [ -n "$ICON" ] && ICON="`find_convert $ICON`" + echo " ICON $ICON" + INTERM=`sed -ne 's/^Terminal=//gp' "$1"` + case "$INTERM" in + 0 | f* ) echo " WINDOW_TYPE NO_STDIO" + ;; + *) echo " WINDOW_TYPE PERM_TERMINAL" + ;; + esac + sed -ne 's/^Comment=/ DESCRIPTION /p' "$1" + echo '}' +} + +canwrite(){ + rm -f "$1" && touch "$1" && [ -w "$1" ] && rm -f "$1" || return 1 +} + +create_appentry(){ + grep '^Exec=' "$1" >/dev/null || return 0 + for i in "`sed -n -e 's/X-[^;]*;//g' -e 's/GTK;//' -e 's/Motif;//' \ + -e 's/\([^;]\)$/\1;/' \ + -e 's/=System;Emulator/=Emulator/' -e 's/=.*;Education/=Education/' \ + -e 's/GNOME;//' -e 's/Qt;//' -e 's_;_/_g' -e 's/^Categories=//p' $1`" + do + mkdir -p "$APPMGR/$i" + touch "$APPMGR/$i`basename $1 .desktop`" + chmod +x "$APPMGR/$i`basename $1 .desktop`" + #echo $APPMGR/$i + done +} + +unset INSTALLDIR; INSTALLDIR="./" ICONDIR="./"; export INSTALLDIR ICONDIR + +while [ -n "$1" ] +do + case "$1" in + *.desktop) + XPREFIX="$PREFIX" + [ -n "$PREFIX" ] || export PREFIX=`echo "$1"|sed 's|\(.*\)/share/.*|\1|'` + [ -n "$PREFIX" ] || unset PREFIX + process_desktop "$1" >"$INSTALLDIR"`basename "$1" .desktop`.dt + test -n "$APPMGR" && create_appentry "$1" + PREFIX="$XPREFIX"; export PREFIX + ;; + -i*) + mkdir -p "$DESTDIR/etc/dt/appconfig/types/C" && \ + canwrite "$DESTDIR/etc/dt/appconfig/types/C/aaa.xyz.test" && \ + INSTALLDIR="$DESTDIR/etc/dt/appconfig/types/C/" \ + ICONDIR="$DESTDIR/etc/dt/appconfig/icons/C/" || \ + INSTALLDIR="$HOME/.dt/types/" ICONDIR="$HOME/.dt/icons/" + export ICONDIR INSTALLDIR + mkdir -p "$ICONDIR" "$INSTALLDIR" + ;; + -a) + mkdir -p "$DESTDIR/etc/dt/appconfig/appmanager/C" && \ + canwrite "$DESTDIR/etc/dt/appconfig/appmanager/C/aaa.xyz.test" && \ + APPMGR="$DESTDIR/etc/dt/appconfig/appmanager/C" || \ + APPMGR="$HOME/.dt/appmanager" + export APPMGR + #echo $APPMGR + ;; + *) + usage + ;; + esac + shift +done + -- 2.25.1