summaryrefslogtreecommitdiff
path: root/lib/File/HomeDir/FreeDesktop.pm
blob: c006921c2a56135c380d9211c9b2d3e0a6bfa32b (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package File::HomeDir::FreeDesktop;

# Specific functionality for unixes running free desktops
# compatible with (but not using) File-BaseDir-0.03

# See POD at the end of the file for more documentation.

use 5.00503;
use strict;
use Carp                ();
use File::Spec          ();
use File::Which         ();
use File::HomeDir::Unix ();

use vars qw{$VERSION @ISA};
BEGIN {
	$VERSION = '1.00';
	@ISA     = 'File::HomeDir::Unix';
}

# xdg uses $ENV{XDG_CONFIG_HOME}/user-dirs.dirs to know where are the
# various "my xxx" directories. That is a shell file. The official API
# is the xdg-user-dir executable. It has no provision for assessing
# the directories of a user that is different than the one we are
# running under; the standard substitute user mechanisms are needed to
# overcome this.

my $xdgprog = File::Which::which('xdg-user-dir');

sub _my {
	# No quoting because input is hard-coded and only comes from this module
	my $thingy = qx($xdgprog $_[1]);
	chomp $thingy;
	return $thingy;
}

# Simple stuff
sub my_desktop   { shift->_my('DESKTOP')   }
sub my_documents { shift->_my('DOCUMENTS') }
sub my_music     { shift->_my('MUSIC')     }
sub my_pictures  { shift->_my('PICTURES')  }
sub my_videos    { shift->_my('VIDEOS')    }

sub my_data {
	$ENV{XDG_DATA_HOME}
	or
	File::Spec->catdir(
		shift->my_home,
		qw{ .local share }
	);
}

sub my_config {
	$ENV{XDG_CONFIG_HOME}
	or
	File::Spec->catdir(
		shift->my_home,
		qw{ .config }
	);
}

# Custom locations (currently undocumented)
sub my_download    { shift->_my('DOWNLOAD')    }
sub my_publicshare { shift->_my('PUBLICSHARE') }
sub my_templates   { shift->_my('TEMPLATES')   }

sub my_cache {
    $ENV{XDG_CACHE_HOME}
    ||
    File::Spec->catdir(shift->my_home, qw{ .cache });
}





#####################################################################
# General User Methods

sub users_desktop   { Carp::croak('The users_desktop method is not available on an XDG based system.');   }
sub users_documents { Carp::croak('The users_documents method is not available on an XDG based system.'); }
sub users_music     { Carp::croak('The users_music method is not available on an XDG based system.');     }
sub users_pictures  { Carp::croak('The users_pictures method is not available on an XDG based system.');  }
sub users_videos    { Carp::croak('The users_videos method is not available on an XDG based system.');    }
sub users_data      { Carp::croak('The users_data method is not available on an XDG based system.');      }

1;

=pod

=head1 NAME

File::HomeDir::FreeDesktop - Find your home and other directories on FreeDesktop.org Unix

=head1 DESCRIPTION

This module provides implementations for determining common user
directories.  In normal usage this module will always be
used via L<File::HomeDir>.

=head1 SYNOPSIS

  use File::HomeDir;
  
  # Find directories for the current user
  $home    = File::HomeDir->my_home;        # /home/mylogin
  $desktop = File::HomeDir->my_desktop;
  $docs    = File::HomeDir->my_documents;
  $music   = File::HomeDir->my_music;
  $pics    = File::HomeDir->my_pictures;
  $videos  = File::HomeDir->my_videos;
  $data    = File::HomeDir->my_data;

=head1 AUTHORS

Jerome Quelin E<lt>jquellin@cpan.org<gt>

Adam Kennedy E<lt>adamk@cpan.orgE<gt>

=head1 SEE ALSO

L<File::HomeDir>, L<File::HomeDir::Win32> (legacy)

=head1 COPYRIGHT

Copyright 2009 - 2011 Jerome Quelin.

Some parts copyright 2010 Adam Kennedy.

This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the
LICENSE file included with this module.

=cut