mymenu_install.sh

#!/bin/bash

# funkcja przetwarza katalog, dla podkatalogów wywołuje się rekurencyjnie
# $1 - katalog, $2 - zagnieżadzenie kodu
print_dir() {
  # generowanie zawartości - submenus
  for f in $1/*; do
    if [ -f $f/.directory ]; then
      bn=`basename $f`
      entry=${bn/[0-9]*-/}
      echo "$2<Menu>"
      echo " $2<Name>$entry</Name>"
      echo " $2<Directory>$f/.directory</Directory>"
      echo " $2<AppDir>$f/</AppDir>"
      print_dir $f " $2"
      echo "$2</Menu>"
    fi
  done;
  
  # generowanie zawartości - menu entry
  echo "$2<Include>"
  for f in $1/*.desktop; do
    if [ -f $f ]; then
      bn=`basename $f`
      echo " $2<Filename>$bn</Filename>"
    fi
  done;
  echo "$2</Include>"
  
  # generowanie układu
  echo "$2<Layout>"
  pushd $1 > /dev/null
  ls | while read f; do
    entry=${f/[0-9]*-/}
    if [ -d $f ]; then
      echo " $2<Menuname>$entry</Menuname>"
    elif [ -f $f ]; then
      if [ "`expr $entry : '.*\(\.desktop\)$'`" != "" ]; then
        echo " $2<Filename>$f</Filename>"
      elif [ "$entry" = "SEPATARTOR" ]; then
        echo " $2<Separator/>"
      fi
    fi
  done
  popd > /dev/null
  if [ "$2" = " " ]; then # gdy menu głównego poziomu
    echo -e ' <Separator/>\n <Merge type="menus" />\n <Merge type="files"/>'
  fi
  echo "$2</Layout>"
}

# funkcja generuje plik zgodny z menu.xml
# $1 katalog w którym znajduje się drzewo systemu menu (musi być zachowany po instalacji menu)
generate_menu_xml() {
  echo '<Menu>
  <DefaultLayout>
    <Merge type="menus"/>
    <Merge type="files"/>
    <Separator/>
    <Menuname>all</Menuname>
  </DefaultLayout>'
  print_dir "$1" " "
  echo '</Menu>'
}

print_service_menus_action() {
  if [ -f "$1" ]; then
    action=`basename $1`
    action=${action%.desktop}
    echo "[Desktop Action $action]"
    echo "Exec=`grep '^Exec=' $1 | cut -f2- -d'='`"
    echo "Name=`grep '^Name=' $1 | cut -f2- -d'='`"
    echo "Icon=`grep '^Icon=' $1 | cut -f2- -d'='`"
    echo ""
    action_list="${action_list}${action};"
  fi
}

generate_service_menus() {
  # dzieki ustawieniu zmiennej IFS na | read czyta jako osobne zmienne
  # pola rozdzielane | a nie białymi znakami
  pushd $1 > /dev/null
  grep -v '^[ \t  ]*#' "service_menus.cfg" | grep -v '^[ \t]*$' | while IFS="|" read name mime icon apps; do
    file_name=`echo "${mime}_${name}.desktop" | tr '/* ' '-x_' | cut -c 1-128`
    if [ -e "$2/mymenu-$file_name" ]; then
      while true; do
        tmp_file_name=${file_name}_${RANDOM}
        if [ ! -e "$2/mymenu-$tmp_file_name" ]; then
          file_name=$tmp_file_name
          break
        fi
      done;
    fi
    : > "$2/mymenu-$file_name"
    action_list=""
    
    for app in $apps; do
      if [ "$app" = "SEPARATOR" ]; then
        action_list="${action_list}_SEPARATOR_;"
      elif [ -d "$app" ]; then
        for f in "$app"/*; do
          print_service_menus_action "$f" >> "$2/mymenu-$file_name"
        done
      else
        print_service_menus_action "$app" >> "$2/mymenu-$file_name"
      fi
    done;
    
    if [ ${#action_list} -ne 0 ]; then
      echo "[Desktop Entry]" >> "$2/mymenu-$file_name"
      echo "ServiceTypes=$mime" >> "$2/mymenu-$file_name"
      echo "Actions=${action_list}_SEPARATOR_" >> "$2/mymenu-$file_name"
      echo "Icon=$icon" >> "$2/mymenu-$file_name"
      echo "X-KDE-Priority=TopLevel" >> "$2/mymenu-$file_name"
      echo "X-KDE-Submenu=$name" >> "$2/mymenu-$file_name"
    fi
  done
  popd > /dev/null
}

# $1 katalog źródłowy  $2 katalog docelowy
install_menu() {
  # kopiowanie (gdy katalog źródłowy rożny od docelowego)
  if [ ! "`realpath $1`" -ef "`realpath $2 2> /dev/null`" ]; then
    rm -fr "$2"
    cp -r "$1" "$2"
  fi
  
  # instalacja ikon
  icon_path=`kde-config --expandvars --path icon | awk 'BEGIN {RS=":"} $0 ~ "^'$HOME'" {print $0}'`
  rm -f "$icon_path"/mymenu_*
  for f in "$2"/icons/*; do
    ln -s -f "$f" "$icon_path"/mymenu-`basename $f`
  done;
  
  # generowanie menu
  menu_path=`kde-config --expandvars --path xdgconf-menu | awk 'BEGIN {RS=":"} $0 ~ "^'$HOME'" {print $0}'`
  generate_menu_xml "$2" > "$menu_path/mymenu.xml"
  
  # dodanie menu do menu
  menu_path="$menu_path/applications-kmenuedit.menu"
  config_entry="<MergeFile>mymenu.xml</MergeFile>"
  # gdy nie było dodane
  if ! grep $config_entry $menu_path > /dev/null; then
    tmp_file=`mktemp`
    #config_entry="<Menu><Name>Pakiety</Name>$config_entry</Menu>"
    # przy pomocy sed'a zastepujemy pierwsze wystąpienie <Menu> w wskazanym pliku
    sed -e '0,/<Menu>/ s#<Menu>#<Menu>'"$config_entry"'#' < $menu_path > $tmp_file
    # wykonanie TYLKO na pierwszym wystąpieniu w pliku uzyskujemy dzięki ograniczeniu
    # zakresu przetwarzanych linii od zerowej do wyrażenia regularnego
    if [ $? = 0 ]; then
      mv $menu_path $menu_path~
      mv $tmp_file $menu_path
    fi
  fi
  
  # generowanie menu
  rm -f "`kde-config --localprefix`share/apps/konqueror/servicemenus"/mymenu-*
  generate_service_menus "$2" "`kde-config --localprefix`share/apps/konqueror/servicemenus"
}

# funkcja zwraca katalog w którym znajduje się uruchamiany skrypt
source_dir() {
  # ustalanie ścieżki skryptu
  sciezka=$0
  if [ ${sciezka:0:1} != "/" ]; then
    sciezka="$PWD/$0"
  fi
  realpath `dirname $sciezka`
}

install_menu "`source_dir`" "$HOME/.config/mymenu"
kbuildsycoca
kdialog --msgbox 'Gotowe !!!'

XHTML generated by highlight (http://www.andre-simon.de/) from mymenu_install.sh



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/usage_and_config/operating_systems_config/linux/desktop/mymenu_install.sh) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:43 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).