Call xrdb on start
[dotfiles/openbox.git] / pipemenus / recently_opened_menu.sh
1 #!/bin/sh
2 #    recently_opened_menu.sh - a script to parse .recently-used.xbel
3 #    and generate openbox pipe menu
4 #    Copyright (C) 2010  John Crawley
5 #
6 #    This program is free software: you can redistribute it and/or modify
7 #    it under the terms of the GNU General Public License as published by
8 #    the Free Software Foundation, either version 3 of the License, or
9 #    (at your option) any later version.
10 #
11 #    This program is distributed in the hope that it will be useful,
12 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #    GNU General Public License for more details.
15
16 # Usage: add
17 # <menu id="recent" label="Recent Files" execute="/path/to/recently_opened_menu.sh" />
18 # to your .config/openbox/menu.xml, or use with dash_places_menu.sh (see comments there)
19
20 maximum_entries=15 # max. number of entries in menu
21
22 #######################################################################
23
24 # if argument is --clear, empty .recently-used.xbel
25 [ "$1" = '--clear' ] && {
26 cat <<':EOF' > "${HOME}"/.recently-used.xbel
27 <?xml version="1.0" encoding="UTF-8"?>
28 <xbel version="1.0"
29       xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
30       xmlns:mime="http://www.freedesktop.org/standards/shared-mime-info"
31 >
32 </xbel>
33 :EOF
34 exit
35 }
36
37 maximum_entries=$((maximum_entries+2))
38
39 pre='    <item label="'
40 mid='">
41     <action name="Execute"><command>'
42 post='</command></action>
43     </item>'
44     
45 files=$( tac "${HOME}"/.recently-used.xbel |  awk -v MAX="$maximum_entries" -v PR="$pre" -v MI="$mid" -v PO="$post" 'BEGIN {
46     RS="</bookmark>";
47     FS="<info>";
48 }
49 (NR == MAX) {exit}
50 !/<bookmark/ {next}
51 # $1 is the command, $2 the file path
52 {
53     sub(/^.*exec=\"\&apos\;/,"",$1)
54     sub(/\&apos\;.*$/,"",$1)
55     sub(/ *%./,"",$1)
56     sub(/^.*file:\/\//,"",$2)
57     sub(/\".*$/,"",$2)
58     gsub(/%22/,"\&quot;",$2)
59     gsub(/%3C/,"\&lt;",$2)
60     gsub(/%3E/,"\&gt;",$2)
61     name=$2
62     sub(/^.*\//,"",name)
63     gsub(/\&apos;/,"\&apos;\&quot;\&apos;\&quot;\&apos;",$2)
64     print (PR name MI $1 " '"'"'" $2 "'"'"'" PO)
65 }' )  
66
67 # use perl to decode urlencoded characters
68 files=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0]);' "$files")
69
70 output='<openbox_pipe_menu>
71 '"$files"'
72 <separator />
73     <item label="Clear Recent Files">
74         <action name="Execute">
75             <command>
76             &apos;'"$0"'&apos; --clear
77             </command>
78         </action>
79     </item>
80 </openbox_pipe_menu>
81 '
82 printf '%s' "$output"  # printf because echo sometimes eats backslashes