Call xrdb on start
[dotfiles/openbox.git] / pipemenus / obpipemenu-places
1 #!/usr/bin/perl
2 # Recursively browse filesystem through openbox3 pipe menus
3 #### Usage: add
4 # <menu id="browse" label="Browse" execute="obpipemenu-places ~" />
5 # to your .config/openbox/menu.xml
6 #### CAVEAT ####
7 # This script was hacked on exclusively in stints between the hours of
8 # 4 and 5 in the morning. Quality may have suffered.
9 ####
10 # Script by dircha from ob list on 05/17/04
11 # suggested improvements by John Russell on 05/17/04 implemented 
12 # a year later by Kacper Wysocki.
13 # 05/30/05 - Kacper Wysocki
14 # - opens files with 'rox', which launches appropriate file handler
15 # - hidden directories now stay hidden
16 # - spaces, ampersands in dir- and filenames are escaped
17 # - newlines at each entry to make output a little readable
18 # 06/04/05 - Kacper Wysocki
19 # - use $0 for scriptname
20 # - use $ENV{'HOME'} as default path
21 # - now follows symlinks
22
23 use strict;
24
25 # Command to lauch files with
26 my $cmd = "thunar";
27
28 my $path = $ARGV[0];
29 $path = "$ENV{'HOME'}" if $path eq "";
30 my @files = split /\n/, `ls -1p '$path'`;
31 mk_menu_element($path, @files);
32
33 sub mk_menu_element {
34     my ($path, @files) = @_;
35
36     print "<openbox_pipe_menu>\n";
37     
38     # "Browse here..." lauches this dir
39     print "<item label=\"Browse here..\">".
40            "\n\t<action name=\"Execute\">".
41            "\n\t\t<execute>$cmd '$path'</execute>".
42            "\n\t</action>".
43            "\n</item>\n".
44            "<separator />";
45
46     foreach $_ (@files) {
47         my $length = length $_;
48         my $last_c = substr $_, $length - 1, 1;
49
50         if ($last_c eq "/") {
51             print mk_dir_element($path, substr $_, 0, $length - 1);
52         } elsif ($last_c eq "@") {
53             print mk_sym_element($path, substr $_, 0, $length - 1);
54         } else {
55             print mk_file_element($path, $_);
56         }
57     }
58     print "</openbox_pipe_menu>\n";
59 }
60
61 sub mk_dir_element {
62     my ($path, $name) = @_;
63     # escape ampersand and space in pathnames
64     $path =~ s/&/&amp;/g;
65     $name =~ s/&/&amp;/g;
66     $path =~ s/ /\\ /g;
67     $name =~ s/ /\\ /g;
68
69     return "<menu id=\"$path/$name\" label=\"$name\" execute=\"$0 $path/$name\" />\n";
70 }
71
72 sub mk_sym_element {
73     my ($path, $name) = @_;
74     # escape ampersand in pathnames
75     $path =~ s/&/&amp;/g;
76     $name =~ s/&/&amp;/g;
77
78     # Follow symlinks instead of opening links in rox.
79     return "<menu id=\"$path/$name\" label=\"$name\" execute=\"$0 $path/$name\" />\n";
80 =cut
81     return "<item label=\"$name\">".
82            "\n\t<action name=\"Execute\">".
83            "\n\t\t<execute>$cmd '$path/$name'</execute>".
84            "\n\t</action>"
85            . "\n</item>\n";
86 =cut
87 }
88
89 sub mk_file_element {
90     my ($path, $name) = @_;
91     my $label = $name;
92     # escape ampersand in pathnames
93     $path =~ s/&/&amp;/g;
94     $name =~ s/&/&amp;/g;
95
96     return "<item label=\"$name\">".
97            "\n\t<action name=\"Execute\">".
98            "\n\t\t<execute>$cmd '$path/$name'</execute>".
99            "\n\t</action>"
100            . "\n</item>\n";
101 }
102