1#!/bin/sh
2
3# This script adds a menu item, icons and mime type for Arduino for the current
4# user. If possible, it will use the xdg-utils - or fall back to just creating
5# and copying a desktop file to the user's dir.
6# If called with the "-u" option, it will undo the changes.
7
8# Resource name to use (including vendor prefix)
9RESOURCE_NAME=cc.arduino.arduinoide
10
11# Get absolute path from which this script file was executed
12# (Could be changed to "pwd -P" to resolve symlinks to their target)
13SCRIPT_PATH=$( cd $(dirname $0) ; pwd )
14cd "${SCRIPT_PATH}"
15
16# Default mode is to install.
17UNINSTALL=false
18
19# If possible, get location of the desktop folder. Default to ~/Desktop
20XDG_DESKTOP_DIR="${HOME}/Desktop"
21if [ -f "${XDG_CONFIG_HOME:-${HOME}/.config}/user-dirs.dirs" ]; then
22  . "${XDG_CONFIG_HOME:-${HOME}/.config}/user-dirs.dirs"
23fi
24
25# Install using xdg-utils
26xdg_install_f() {
27
28  # Create a temp dir accessible by all users
29  TMP_DIR=`mktemp --directory`
30
31  # Create *.desktop file using the existing template file
32  sed -e "s,<BINARY_LOCATION>,${SCRIPT_PATH}/arduino,g" \
33      -e "s,<ICON_NAME>,${RESOURCE_NAME},g" "${SCRIPT_PATH}/lib/desktop.template" > "${TMP_DIR}/${RESOURCE_NAME}.desktop"
34
35  # Install the icon files using name and resolutions
36  xdg-icon-resource install --context apps --size 16 "${SCRIPT_PATH}/lib/icons/16x16/apps/arduino.png" $RESOURCE_NAME
37  xdg-icon-resource install --context apps --size 24 "${SCRIPT_PATH}/lib/icons/24x24/apps/arduino.png" $RESOURCE_NAME
38  xdg-icon-resource install --context apps --size 32 "${SCRIPT_PATH}/lib/icons/32x32/apps/arduino.png" $RESOURCE_NAME
39  xdg-icon-resource install --context apps --size 48 "${SCRIPT_PATH}/lib/icons/48x48/apps/arduino.png" $RESOURCE_NAME
40  xdg-icon-resource install --context apps --size 64 "${SCRIPT_PATH}/lib/icons/64x64/apps/arduino.png" $RESOURCE_NAME
41  xdg-icon-resource install --context apps --size 72 "${SCRIPT_PATH}/lib/icons/72x72/apps/arduino.png" $RESOURCE_NAME
42  xdg-icon-resource install --context apps --size 96 "${SCRIPT_PATH}/lib/icons/96x96/apps/arduino.png" $RESOURCE_NAME
43  xdg-icon-resource install --context apps --size 128 "${SCRIPT_PATH}/lib/icons/128x128/apps/arduino.png" $RESOURCE_NAME
44  xdg-icon-resource install --context apps --size 256 "${SCRIPT_PATH}/lib/icons/256x256/apps/arduino.png" $RESOURCE_NAME
45
46  # Install the created *.desktop file
47  xdg-desktop-menu install "${TMP_DIR}/${RESOURCE_NAME}.desktop"
48
49  # Create icon on the desktop
50  xdg-desktop-icon install "${TMP_DIR}/${RESOURCE_NAME}.desktop"
51
52  # Install Arduino mime type
53  xdg-mime install "${SCRIPT_PATH}/lib/${RESOURCE_NAME}.xml"
54
55  # Install icons for mime type
56  xdg-icon-resource install --context mimetypes --size 16 "${SCRIPT_PATH}/lib/icons/16x16/apps/arduino.png" text-x-arduino
57  xdg-icon-resource install --context mimetypes --size 24 "${SCRIPT_PATH}/lib/icons/24x24/apps/arduino.png" text-x-arduino
58  xdg-icon-resource install --context mimetypes --size 32 "${SCRIPT_PATH}/lib/icons/32x32/apps/arduino.png" text-x-arduino
59  xdg-icon-resource install --context mimetypes --size 48 "${SCRIPT_PATH}/lib/icons/48x48/apps/arduino.png" text-x-arduino
60  xdg-icon-resource install --context mimetypes --size 64 "${SCRIPT_PATH}/lib/icons/64x64/apps/arduino.png" text-x-arduino
61  xdg-icon-resource install --context mimetypes --size 72 "${SCRIPT_PATH}/lib/icons/72x72/apps/arduino.png" text-x-arduino
62  xdg-icon-resource install --context mimetypes --size 96 "${SCRIPT_PATH}/lib/icons/96x96/apps/arduino.png" text-x-arduino
63  xdg-icon-resource install --context mimetypes --size 128 "${SCRIPT_PATH}/lib/icons/128x128/apps/arduino.png" text-x-arduino
64  xdg-icon-resource install --context mimetypes --size 256 "${SCRIPT_PATH}/lib/icons/256x256/apps/arduino.png" text-x-arduino
65
66  # Make Arduino IDE the default application for *.ino
67  xdg-mime default ${RESOURCE_NAME}.desktop text/x-arduino
68
69  # Clean up
70  rm "${TMP_DIR}/${RESOURCE_NAME}.desktop"
71  rmdir "$TMP_DIR"
72
73}
74
75# Install by simply copying desktop file (fallback)
76simple_install_f() {
77
78  # Create a temp dir accessible by all users
79  TMP_DIR=`mktemp --directory`
80
81  # Create *.desktop file using the existing template file
82  sed -e "s,<BINARY_LOCATION>,${SCRIPT_PATH}/arduino,g" \
83      -e "s,<ICON_NAME>,${SCRIPT_PATH}/lib/arduino.png,g" "${SCRIPT_PATH}/lib/desktop.template" > "${TMP_DIR}/${RESOURCE_NAME}.desktop"
84
85  mkdir -p "${HOME}/.local/share/applications"
86  cp "${TMP_DIR}/${RESOURCE_NAME}.desktop" "${HOME}/.local/share/applications/"
87
88  mkdir -p "${HOME}/.local/share/metainfo"
89  cp "${SCRIPT_PATH}/lib/appdata.xml" "${HOME}/.local/share/metainfo/${RESOURCE_NAME}.appdata.xml"
90
91  # Copy desktop icon if desktop dir exists (was found)
92  if [ -d "${XDG_DESKTOP_DIR}" ]; then
93   cp "${TMP_DIR}/${RESOURCE_NAME}.desktop" "${XDG_DESKTOP_DIR}/"
94   # Altering file permissions to avoid "Untrusted Application Launcher" error on Ubuntu
95   chmod u+x "${XDG_DESKTOP_DIR}/${RESOURCE_NAME}.desktop"
96  fi
97
98  # Clean up temp dir
99  rm "${TMP_DIR}/${RESOURCE_NAME}.desktop"
100  rmdir "${TMP_DIR}"
101
102}
103
104# Uninstall using xdg-utils
105xdg_uninstall_f() {
106
107  # Remove *.desktop file
108  xdg-desktop-menu uninstall ${RESOURCE_NAME}.desktop
109
110  # Remove icon from desktop
111  xdg-desktop-icon uninstall ${RESOURCE_NAME}.desktop
112
113  # Remove icons
114  xdg-icon-resource uninstall --size 16 ${RESOURCE_NAME}
115  xdg-icon-resource uninstall --size 24 ${RESOURCE_NAME}
116  xdg-icon-resource uninstall --size 32 ${RESOURCE_NAME}
117  xdg-icon-resource uninstall --size 48 ${RESOURCE_NAME}
118  xdg-icon-resource uninstall --size 64 ${RESOURCE_NAME}
119  xdg-icon-resource uninstall --size 72 ${RESOURCE_NAME}
120  xdg-icon-resource uninstall --size 96 ${RESOURCE_NAME}
121  xdg-icon-resource uninstall --size 128 ${RESOURCE_NAME}
122  xdg-icon-resource uninstall --size 256 ${RESOURCE_NAME}
123
124  # Remove MIME type icons
125  xdg-icon-resource uninstall --size 16  text-x-arduino
126  xdg-icon-resource uninstall --size 24  text-x-arduino
127  xdg-icon-resource uninstall --size 32  text-x-arduino
128  xdg-icon-resource uninstall --size 48  text-x-arduino
129  xdg-icon-resource uninstall --size 64  text-x-arduino
130  xdg-icon-resource uninstall --size 72  text-x-arduino
131  xdg-icon-resource uninstall --size 96  text-x-arduino
132  xdg-icon-resource uninstall --size 128  text-x-arduino
133  xdg-icon-resource uninstall --size 256  text-x-arduino
134
135  # Remove Arduino MIME type
136  xdg-mime uninstall "${SCRIPT_PATH}/lib/${RESOURCE_NAME}.xml"
137
138}
139
140# Uninstall by simply removing desktop files (fallback), incl. old one
141simple_uninstall_f() {
142
143  # delete legacy cruft .desktop file
144  if [ -f "${HOME}/.local/share/applications/arduino.desktop" ]; then
145    rm "${HOME}/.local/share/applications/arduino.desktop"
146  fi
147
148  # delete another legacy .desktop file
149  if [ -f "${HOME}/.local/share/applications/arduino-arduinoide.desktop" ]; then
150    rm "${HOME}/.local/share/applications/arduino-arduinoide.desktop"
151  fi
152
153  if [ -f "${HOME}/.local/share/applications/${RESOURCE_NAME}.desktop" ]; then
154    rm "${HOME}/.local/share/applications/${RESOURCE_NAME}.desktop"
155  fi
156
157  if [ -f "${HOME}/.local/share/metainfo/${RESOURCE_NAME}.appdata.xml" ]; then
158    rm "${HOME}/.local/share/metainfo/${RESOURCE_NAME}.appdata.xml"
159  fi
160
161  if [ -f "${XDG_DESKTOP_DIR}/arduino.desktop" ]; then
162    rm "${XDG_DESKTOP_DIR}/arduino.desktop"
163  fi
164
165  if [ -f "${XDG_DESKTOP_DIR}/${RESOURCE_NAME}.desktop" ]; then
166    rm "${XDG_DESKTOP_DIR}/${RESOURCE_NAME}.desktop"
167  fi
168
169}
170
171# Update desktop file and mime databases (if possible)
172updatedbs_f() {
173
174  if [ -d "${HOME}/.local/share/applications" ]; then
175    if command -v update-desktop-database > /dev/null; then
176      update-desktop-database "${HOME}/.local/share/applications"
177    fi
178  fi
179
180  if [ -d "${HOME}/.local/share/mime" ]; then
181    if command -v update-mime-database > /dev/null; then
182      update-mime-database "${HOME}/.local/share/mime"
183    fi
184  fi
185
186}
187
188# Check availability of xdg-utils
189xdg_exists_f() {
190
191  if ! command -v xdg-icon-resource > /dev/null; then return 1; fi
192  if ! command -v xdg-desktop-menu > /dev/null; then return 1; fi
193  if ! command -v xdg-desktop-icon > /dev/null; then return 1; fi
194  if ! command -v xdg-mime > /dev/null; then return 1; fi
195  return 0
196
197}
198
199# Shows a description of the available options
200display_help_f() {
201  printf "\nThis script will add a Arduino IDE desktop shortcut, menu item,\n"
202  printf "icons and file associations for the current user.\n"
203  if ! xdg_exists_f; then
204    printf "\nxdg-utils are recommended to be installed, so this script can use them.\n"
205  fi
206  printf "\nOptional arguments are:\n\n"
207  printf "\t-u, --uninstall\t\tRemoves shortcut, menu item and icons.\n\n"
208  printf "\t-h, --help\t\tShows this help again.\n\n"
209}
210
211# Check for provided arguments
212while [ $# -gt 0 ] ; do
213  ARG="${1}"
214  case $ARG in
215      -u|--uninstall)
216        UNINSTALL=true
217        shift
218      ;;
219      -h|--help)
220        display_help_f
221        exit 0
222      ;;
223      *)
224        printf "\nInvalid option -- '${ARG}'\n"
225        display_help_f
226        exit 1
227      ;;
228  esac
229done
230
231# If possible, use xdg-utils, if not, use a more basic approach
232if xdg_exists_f; then
233  if [ ${UNINSTALL} = true ]; then
234    printf "Removing desktop shortcut and menu item for Arduino IDE..."
235    xdg_uninstall_f
236    simple_uninstall_f
237  else
238    printf "Adding desktop shortcut, menu item and file associations for Arduino IDE..."
239    xdg_uninstall_f
240    simple_uninstall_f
241    xdg_install_f
242  fi
243else
244  if [ ${UNINSTALL} = true ]; then
245    printf "Removing desktop shortcut and menu item for Arduino IDE..."
246    simple_uninstall_f
247  else
248    printf "Adding desktop shortcut and menu item for Arduino IDE..."
249    simple_uninstall_f
250    simple_install_f
251  fi
252fi
253updatedbs_f
254printf " done!\n"
255
256exit 0
257