aboutsummaryrefslogtreecommitdiffstats
path: root/_config/openbox/scripts/pipemenu-places.pl
blob: 812eb2783653cd8e7d32ab6fc10ff95f9a2fd009 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env perl
# Recursively browse filesystem through openbox3 pipe menus
#### Usage: add
# <menu id="browse" label="Browse" execute="obpipemenu-places ~" />
# to your .config/openbox/menu.xml
#### CAVEAT ####
# This script was hacked on exclusively in stints between the hours of
# 4 and 5 in the morning. Quality may have suffered.
####
# Script by dircha from ob list on 05/17/04
# suggested improvements by John Russell on 05/17/04 implemented
# a year later by Kacper Wysocki.
# 05/30/05 - Kacper Wysocki
# - opens files with 'rox', which launches appropriate file handler
# - hidden directories now stay hidden
# - spaces, ampersands in dir- and filenames are escaped
# - newlines at each entry to make output a little readable
# 06/04/05 - Kacper Wysocki
# - use $0 for scriptname
# - use $ENV{'HOME'} as default path
# - now follows symlinks

use strict;

# Command to lauch files with
my $cmd = "thunar";

my $path = $ARGV[0];
$path = "$ENV{'HOME'}" if $path eq "";
my @files = split /\n/, `ls -1p '$path'`;
mk_menu_element($path, @files);

sub mk_menu_element {
    my ($path, @files) = @_;

    print "<openbox_pipe_menu>\n";

    # "Browse here..." lauches this dir
    print "<item label=\"Browse here..\">".
           "\n\t<action name=\"Execute\">".
           "\n\t\t<execute>$cmd '$path'</execute>".
           "\n\t</action>".
           "\n</item>\n".
           "<separator />";

    foreach $_ (@files) {
        my $length = length $_;
        my $last_c = substr $_, $length - 1, 1;

        if ($last_c eq "/") {
            print mk_dir_element($path, substr $_, 0, $length - 1);
        } elsif ($last_c eq "@") {
            print mk_sym_element($path, substr $_, 0, $length - 1);
        } else {
            print mk_file_element($path, $_);
        }
    }
    print "</openbox_pipe_menu>\n";
}

sub mk_dir_element {
    my ($path, $name) = @_;
    # escape ampersand and space in pathnames
    $path =~ s/&/&amp;/g;
    $name =~ s/&/&amp;/g;
    $path =~ s/ /\\ /g;
    $name =~ s/ /\\ /g;

    return "<menu id=\"$path/$name\" label=\"$name\" execute=\"$0 $path/$name\" />\n";
}

sub mk_sym_element {
    my ($path, $name) = @_;
    # escape ampersand in pathnames
    $path =~ s/&/&amp;/g;
    $name =~ s/&/&amp;/g;

    # Follow symlinks instead of opening links in rox.
    return "<menu id=\"$path/$name\" label=\"$name\" execute=\"$0 $path/$name\" />\n";
=cut
    return "<item label=\"$name\">".
           "\n\t<action name=\"Execute\">".
           "\n\t\t<execute>$cmd '$path/$name'</execute>".
           "\n\t</action>"
           . "\n</item>\n";
=cut
}

sub mk_file_element {
    my ($path, $name) = @_;
    my $label = $name;
    # escape ampersand in pathnames
    $path =~ s/&/&amp;/g;
    $name =~ s/&/&amp;/g;

    return "<item label=\"$name\">".
           "\n\t<action name=\"Execute\">".
           "\n\t\t<execute>$cmd '$path/$name'</execute>".
           "\n\t</action>"
           . "\n</item>\n";
}