Vitaliy Margolen : wineshelllink: Use FreeDesktop standard to create Wine menu structure.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 27 12:51:03 CST 2006


Module: wine
Branch: master
Commit: da3676229722eb76c8a91bf8165b09cc9e58455c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=da3676229722eb76c8a91bf8165b09cc9e58455c

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Fri Nov 24 13:53:29 2006 -0700

wineshelllink: Use FreeDesktop standard to create Wine menu structure.

---

 tools/wineshelllink |  254 ++++++++++++++++++++++-----------------------------
 1 files changed, 110 insertions(+), 144 deletions(-)

diff --git a/tools/wineshelllink b/tools/wineshelllink
index db65efa..07334dc 100755
--- a/tools/wineshelllink
+++ b/tools/wineshelllink
@@ -4,6 +4,7 @@
 # This is used by the IShellLink interface
 #
 # Copyright 2000 Alexandre Julliard
+# Copyright 2006 Vitaliy Margolen
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -22,8 +23,7 @@
 
 # Note that the link is a relative unix-style path name.  Since the / character
 # is not valid in Windows filenames it is an adequate separator to show the
-# menu structure.  (This program may need to split the menu structure out for
-# implementing xdg-style menus)
+# menu structure.
 
 mode=""
 args=""
@@ -82,176 +82,142 @@ if [ -z "$link" ] ; then
     usage
 fi
 
-kde_entry()
+desktop_entry()
 {
-    xname=`basename "$link"`
-    cat <<EOF
-# KDE Config File
-[KDE Desktop Entry]
-Name=$xname
-Exec=wine '$path' $args
-Type=Application
-Comment=$descr
-EOF
-    [ -z "$workdir" ] || echo "Path=\"$workdir\""
-    [ -z "$xpmicon" ] || echo "Icon=$xpmicon"
-}
-
-gnome_entry()
-{
-    xname=`basename "$link"`
     cat <<EOF
 [Desktop Entry]
-Name=$xname
+Name=$linkname
 Exec=wine "$path" $args
 Type=Application
-Comment=$descr
 EOF
+    [ -z "$descr"   ] || echo "Comment=$descr"
     [ -z "$workdir" ] || echo "Path=$workdir"
     [ -z "$xpmicon" ] || echo "Icon=$xpmicon"
 }
 
-mdk_entry()
+directory_entry()
 {
-    base=`basename "$link"`
-    section=`dirname "$link"`
-    [ -z "$icon" ] || xicon="icon=\"$xpmicon\""
-    pathmenu=`echo "$path" | sed 's+\\\\+\\\\\\\\+g'`
-    echo "?package(local.Wine):needs=x11 section=\"/Wine/$section\" title=\"$base\" longtitle=\"$descr\" command=\"wine '$pathmenu' $args\" $xicon"
+    cat <<EOF
+[Desktop Entry]
+Type=Directory
+EOF
+    if [ "$1" == "wine" ] ; then
+        echo "Name=Wine"
+        echo "Icon=wine"
+    else
+        echo "Name=$1"
+        echo "Icon=folder"
+    fi
 }
 
 # copy the icon file to a specified dir and set xpmicon to the resulting path
 copy_icon()
 {
-  dir="$1"
-  mkdir -p "$dir"
-  mkdir -p "$dir/""`dirname "$link"`" || true
-  if [ -f "$icon" ]
-  then
-    cp "$icon" "$dir/$link.xpm"
-    xpmicon="$dir/$link.xpm"
-  else
-    xpmicon=""
-  fi
+    if [ -f "$icon" ]
+    then
+        xpmicon=`basename "$icon" .xpm`
+
+        mkdir -p "$1"
+        cp "$icon" "$1/$xpmicon.xpm"
+    else
+        xpmicon=""
+    fi
 }
 
-# Debian/Mandrake
-
-type update-menus > /dev/null 2>&1
-if [ $? = 0 -a $mode = "menu" ]
-then
-  iconname="`basename "$link"`.xpm"
-  dir="$HOME/.menu/icons"
-  if [ -f "$icon" ]
-  then
-    mkdir -p "$dir"
-    cp "$icon" "$dir/$iconname"
-    xpmicon="$dir/$iconname"
-  else
-    xpmicon=""
-  fi
-  mdk_entry >> "$HOME/.menu/wine"
-  if [ -d "/usr/lib/menu" ] && [ -w "/usr/lib/menu" ]
-  then
-    mdk_entry >> "/usr/lib/menu/wine"
-  fi
-  update-menus > /dev/null 2>&1
-fi
+# XDG
 
-# KDE
+xdg_config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/menus/applications-merged"
+xdg_data_dir="${XDG_DATA_HOME:-$HOME/.local/share}"
 
-if [ -d "$HOME/.kde" ]
-then
-  kdeversion=0
-  if type kde-config >/dev/null 2>&1
-  then
-    kdeversion=`kde-config -v | grep KDE: | sed -n "s/^KDE: \([^.]*\)\..*$/\1/p"`
-  fi
+# Create common directories
+mkdir -p "$xdg_config_dir"
+mkdir -p "$xdg_data_dir/desktop-directories"
 
-  if [ $kdeversion -ge 2 ]
-  then
-    copy_icon "$HOME/.kde/share/applnk/Wine"
-    if [ $mode = "menu" ]
-    then
-      gnome_entry > "$HOME/.kde/share/applnk/Wine/$link.desktop"
-    elif [ -d "$HOME/Desktop" ]
-    then
-      gnome_entry > "$HOME/Desktop/$link.desktop"
+get_menu_entries()
+{
+    tmp="$xdg_config_dir/$1.menu"
+
+    if [ -r "$tmp" ] ; then
+        awk '
+BEGIN {  RS="<" }
+/^Filename/ {
+  if (match($0,/>/)) {
+     print substr($0,RSTART+1)
+  }
+}' $tmp
     fi
-  else
-    copy_icon "$HOME/.kde/share/applnk/Wine"
-    if [ $mode = "menu" ]
-    then
-      kde_entry > "$HOME/.kde/share/applnk/Wine/$link.kdelnk"
+}
 
-      # KDE 1.x kludge.  Wake up KDE, if we can find kpanel running
-      type kwmcom >/dev/null 2>/dev/null && \
-        ps u -C kpanel >/dev/null 2>/dev/null && \
-          kwmcom kpanel:restart
+# Input
+#   menu file name
+#   new item
+write_menu_file()
+{
+    tmpfile=`mktemp`
+    (
+        echo '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"'
+        echo '"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">'
+        echo '<Menu>'
+        echo '  <Name>Applications</Name>'
+
+        IFS="-"
+
+        fullname='wine'
+        for i in $1; do
+            echo "  <Menu>"
+            echo "    <Name>$fullname-$i</Name>"
+            echo "    <Directory>$fullname-$i.directory</Directory>"
+
+            dir_file_name="$xdg_data_dir/desktop-directories/$fullname-$i.directory"
+            if [ ! -f "$dir_file_name" ] ; then
+                directory_entry "$i" > "$dir_file_name"
+            fi
+            test "$i" = "wine" || fullname="$fullname-$i"
+        done
+
+        echo "    <Include>"
+
+        IFS="
+"
+        for i in $(get_menu_entries "$1"); do
+            test "$i" = "$2" && continue
+            echo "      <Filename>$i</Filename>"
+        done
+
+        # New record
+        echo "      <Filename>$2</Filename>"
+        echo "    </Include>"
+
+        IFS='-'
+        for i in $1; do
+            echo "  </Menu>"
+        done
+        echo '</Menu>'                        
+    ) > $tmpfile
+    chmod 0600 $tmpfile
+
+    mv -f $tmpfile "$xdg_config_dir/$1.menu"
+}
 
-    elif [ -d "$HOME/Desktop" ]
-    then
-      kde_entry > "$HOME/Desktop/$link.kdelnk"
-      #   KDE 1.x kludge:  wake up KDE, if we can find kfm running...
-      type kfmclient >/dev/null 2>/dev/null && \
-        ps u -C kfm >/dev/null 2>/dev/null  && \
-          kfmclient refreshDesktop
-    fi
-  fi
-fi
 
-if [ -d "$HOME/.kde2" ]
-then
-  copy_icon "$HOME/.kde2/share/applnk/Wine"
-  if [ $mode = "menu" ]
-  then
-    gnome_entry > "$HOME/.kde2/share/applnk/Wine/$link.desktop"
-  else
-    if [ -d "$HOME/Desktop2" ]
-    then
-      gnome_entry > "$HOME/Desktop2/$link.desktop"
-    fi
-    if [ -d "$HOME/Desktop" ]
-    then
-      gnome_entry > "$HOME/Desktop/$link.desktop"
-    fi
-  fi
-fi
+copy_icon "$xdg_data_dir/icons"
 
-if [ -d "$HOME/.kde3/share/applnk" ]
-then
-  copy_icon "$HOME/.kde3/share/applnk/Wine"
-  if [ $mode = "menu" ]
-  then
-    gnome_entry > "$HOME/.kde3/share/applnk/Wine/$link.desktop"
-  else
-    if [ -d "$HOME/Desktop3" ]
-    then
-      gnome_entry > "$HOME/Desktop3/$link.desktop"
-    fi
-    if [ -d "$HOME/Desktop2" ]
-    then
-      gnome_entry > "$HOME/Desktop2/$link.desktop"
-    fi
-    if [ -d "$HOME/Desktop" ]
-    then
-      gnome_entry > "$HOME/Desktop/$link.desktop"
+linkname=`basename "$link"`
+
+if [ $mode = "menu" ] ; then
+    mkdir -p "$xdg_data_dir/applications/wine/`dirname "$link"`"
+
+    linkpath=`dirname "$link" | sed 's!/!-!g'`
+    if [ "$linkpath" == "." ] ; then 
+        linkpath=""
+    else
+        linkpath="-$linkpath"
     fi
-  fi
-fi
 
-# Gnome
-
-if [ -d "$HOME/.gnome" ]
-then
-  copy_icon "$HOME/.gnome/apps/Wine"
-  if [ $mode = "menu" ]
-  then
-    gnome_entry > "$HOME/.gnome/apps/Wine/$link.desktop"
-  elif [ -d "$HOME/.gnome-desktop" ]
-  then
-    gnome_entry > "$HOME/.gnome-desktop/$link.desktop"
-  fi
+    desktop_entry > "$xdg_data_dir/applications/wine/$link.desktop"
+    write_menu_file "wine$linkpath" "wine$linkpath-$linkname.desktop"
+else
+    desktop_entry > "$HOME/Desktop/$linkname.desktop"
 fi
 
 exit 0




More information about the wine-cvs mailing list