123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #!/bin/sh
- # dash_places_menu.sh - a shell (hopefully dash!) places openbox pipe menu
- # Copyright (C) 2010 John Crawley
- #
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, either version 3 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- # Version 2012/02/17
- # Usage: add
- # <menu id="places" label="Places" execute="/path/to/dash_places_menu.sh ~/" />
- # to your .config/openbox/menu.xml
- # or, if you want the "recent files" menu incorporated at the top, use:
- # <menu id="places" label="Places" execute="/path/to/dash_places_menu.sh --recent ~" />
- # make sure you have recently_opened_menu.sh somewhere, and enter its path below.
- # path to your "recent files" script, if you want to incorporate it:
- #recent_script="$HOME"/scripts/recently_opened_menu.sh
- # Command to open folders at "Browse here..." - any file manager
- open_folder_cmd=spacefm
- # Default command to open files with - others might be xdg-open, gnome-open, pcmanfm...
- default_open_cmd=spacefm # exo-open comes with thunar
- # Text editor of choice
- text_editor=leafpad
- # function to open files with default open command, or alternative command for certain files
- # - add other conditions to choice
- open_file() {
- [ -x "$1" ] && exec "$text_editor" "$1" # comment out this line if you don't want to edit executables instead of executing
- #[ -x "$1" ] && exec "terminator -e" "$1" # uncomment this and comment out previous line to run executables in terminal instead of editing
- [ "${1##*.}" = desktop ] && exec "$text_editor" "$1" # comment out this line if you don't want to edit .desktop files instead of executing
- exec "$default_open_cmd" "$1" # use default open command if above conditions not satisfied
- }
- # extra dotfiles to display in HOME folder (dotfiles are hidden by default)
- # edit the list (space separated, surrounded by single quotes) or comment this line out, to taste:
- shown_dotfiles='.config .local .Xdefaults .bash_aliases .bashrc .fonts.conf .gtkrc-2.0.mine .profile .xsession-errors'
- # By default, this script will display directories separately, before files.
- # To change this behaviour, see NOTE1, NOTE2 and NOTE3 below, near end of page.
- #######################################################################
- case $1 in
- # if "--open" option is sent as $1, open file ($2) instead of generating menu
- --open)
- open_file "$2"
- echo "$0 : failed to open $2" >&2
- exit;; # in case exec command fails
- # if "--recent" option is sent, incorporate "recent files" menu
- --recent)
- shift
- output='<openbox_pipe_menu>
- '
- if [ -x "$recent_script" ]
- then
- output="$output"'<separator label="Recently opened..." />
- <menu execute="'"$recent_script"'" id="recent" label="files" />
- '
- else
- echo "$0 : cannot find executable script $recent_script" >&2
- fi;;
- *)
- output='<openbox_pipe_menu>
- ';;
- esac
- path="${1:-$HOME}" # default starting place is ~, otherwise $1
- path="$( echo "${path}"/ | tr -s '/' )" # ensure one final slash
- [ -d "$path" ] || { echo "$0 : $path is not a directory" >&2; exit 1; }
- case "$path" in # only escape if string needs it
- *\&*|*\<*|*\>*|*\"*|*\'*) pathe=$(sed "s/\&/\&/g;s/</\</g;s/>/\>/g;s/\"/\"/g;s/'/\'/g;") <<XXX
- $path
- XXX
- ;;
- *)pathe=$path;;
- esac
- case "$pathe" in
- *\&apos\;*) pathe_apos=$(sed 's/\'/\'\"\'\"\'/g;')<<XXX
- $pathe
- XXX
- ;;
- *) pathe_apos=$pathe;;
- esac
- output="$output"'<separator label="'$pathe'" />
- <item label="Browse here...">
- <action name="Execute">
- <command>
- ''"$open_folder_cmd"'' ''"$pathe_apos"''
- </command>
- </action>
- </item>
- <separator />
- '
- unset extra_entries directories_menu files_menu
- [ "$path" = "$HOME"/ ] && extra_entries="$shown_dotfiles"
- for i in "$path"* $extra_entries
- do
- [ -e "$i" ] || continue # only output code if file exists
- shortname="${i##*/}"
- case $shortname in
- *\&*|*\<*|*\>*|*\"*|*\'*) shortnamee=$(sed "s/\&/\&/g;s/</\</g;s/>/\>/g;s/\"/\"/g;s/'/\'/g;") <<XXX
- $shortname
- XXX
- ;;
- *) shortnamee=$shortname;;
- esac
- case $shortnamee in
- *\&apos\;*) shortnamee_apos=$(sed 's/\'/\'\"\'\"\'/g;')<<XXX
- $shortnamee
- XXX
- ;;
- *) shortnamee_apos=$shortnamee;;
- esac
- [ -d "$i" ] && {
- # NOTE1 If you want directories and files listed together
- # change next line (directories_menu="$directories_menu"') to read: files_menu="$files_menu"' (note the one single quote at the end)
- directories_menu="$directories_menu"'
- <menu id="'"${pathe_apos}${shortnamee_apos}"'" label="'"$shortnamee"'" execute="''"$0"'' ''"${pathe_apos}${shortnamee_apos}"''" />'; continue; }
- files_menu="$files_menu"'
- <item label="'"$shortnamee"'">
- <action name="Execute">
- <command>
- ''"$0"'' --open ''"${pathe_apos}${shortnamee_apos}"''
- </command>
- </action>
- </item>'
- done
- [ -n "$directories_menu" ] && {
- # NOTE2 comment out next 2 lines if you don't want "Directories" label
- output="${output}"'<separator label="Directories" />
- '
- output="${output}${directories_menu}"'
- '; }
- [ -n "$files_menu" ] && {
- # NOTE3 comment out next 2 lines if you don't want "Files" label
- output="${output}"'<separator label="Files" />
- '
- output="${output}${files_menu}"'
- '; }
- output="${output}"'</openbox_pipe_menu>
- '
- printf '%s' "$output"
- exit
|