contrib/: add desktop2dt from Isaac Dunham
authorJon Trulson <jon@radscan.com>
Sun, 20 Jul 2014 00:33:12 +0000 (18:33 -0600)
committerJon Trulson <jon@radscan.com>
Sun, 20 Jul 2014 00:33:12 +0000 (18:33 -0600)
cde/contrib/desktop2dt/README [new file with mode: 0644]
cde/contrib/desktop2dt/desktop2dt [new file with mode: 0644]

diff --git a/cde/contrib/desktop2dt/README b/cde/contrib/desktop2dt/README
new file mode 100644 (file)
index 0000000..d6d2ebe
--- /dev/null
@@ -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 (file)
index 0000000..a071fc4
--- /dev/null
@@ -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
+