aboutsummaryrefslogtreecommitdiffstats
path: root/sbin/chksession
blob: 5efa42fb3828fa2537883afa819087363dc306f2 (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
#!/usr/bin/perl
# (c) Mandriva, Chmouel Boudjnah <chmouel@mandriva.com>
# Copyright under GPL blah blah blah.
## For info, see "chksession --help" or  "man chksession"

# Modified by Bernard Lang on August 21, 2003.
# Modified by ns80 on February 12, 2016.


my (@lf, $dir, $first, $list, $list_order, %order, $test);

sub usage {
  my $e = shift @_;
  $0 =~ s|.*/||;
  print {  $e ? STDERR : STDOUT } << "EOF";
Usage: $0 [OPTION]...

	      -F --first:   Print only first available entry.
	      -t, --test:   Go in test mode.
	      -l, --list:   List window-managers.
	      -L:           List window-managers including the order number

	      -d=DIR, --dir=DIR:   Specifies a directory of w-m configuration files.
			 Default is /usr/share/xsessions/

	      -x=ENTRY, --xsession=ENTRY: Produce window-managers script of ENTRY.

	      -h, --help:   Produce this help.

EOF
  exit($e);
}

sub cat {   # returns content of argument file as a single string
  my ($f) = @_;
  open my $F, $f or die "Can't open $f\n";
  local $/ = "";
  <$F>;
  }
  
sub parse_file {         # parse a session descriptor file
    my ($fn) = @_;
     my $n;
     local $_ = cat($fn);
     ($n = $1) =~ s| ||g if /^Name=(.*)/m;
     my $e = $1 if /^Exec=(.*)/m;
     $script{$n} = $e;
     push @lf, $n;
     ($order{$n}) = $fn =~ m/(^[0-9][0-9])/;
}

usage(1)
  if @ARGV < 1;

while ($ARGV[0] =~ /^--/ || $ARGV[0] =~ /^-/) {
  local $_ = shift;
  if (/^--xsession=([^ ]+)/ || /^-x=([^ ]+)/) {
    $xsession = $1;
  } elsif (/^--first/ || /^-F/) {
    $first++;
  } elsif (/^--list/ || /^-l/) {
    $list++;
  } elsif (/^-L/) {
    $list_order++;
  } elsif (/^--test/ || /^-t/) {
    $test++;
  } elsif (/^--dir=([^ ]+)/ || /^-d=([^ ]+)/) {
    $dir = $1;
  } elsif (/^--help/ || /^-h/ || /^-\?/) {
    usage(0);
  } else {
    print STDERR "Unrecognized switch: $_\n";
    usage(1);
  }
}
  
# Parse all relevant files in session directory $dir
$dir = $test ? './xsessions/' : '/usr/share/xsessions/' unless $dir;
chdir($dir);
foreach (glob("*.desktop")) {
    parse_file($_);
}

my ($e) = eval { cat("/etc/sysconfig/desktop") } =~ /DESKTOP=(\S+)/;
# The first string (without spaces) in the file is copied to $e.

# If $e is one of the names in @lf, then it is placed first (leftmost).
# Order of names in @lf is otherwise unchanged.
@lf = sort { $b =~ /^$e$/i <=> $a =~ /^$e$/i } @lf;

if ($xsession) {
    if ($script{$xsession}) {
	print "#!/bin/sh\n";
	print $script{$xsession}
    } else {
	print "xterm -geometry 100x25+0+0 &\n";
	if ( -x '/usr/bin/icewm' ) {
	    print "icewm\n";
	} elsif ( -x '/usr/bin/twm' ) {
	    print "twm\n";
	} else {
	    print "xterm -geometry 67x14+384+446\n";
	}
    }
    exit (0);
}

@lf ? print shift @lf, "\n" : print "default\n"
  if $first;

if ($list) { 
  if (@lf) {
    print join(' ', @lf, 'default', 'failsafe'), "\n";
 } else {
    print "default\n";
  }
} elsif ($list_order) { 
    print join(' ', map { "$_=$order{$_}" } @lf), "\n";
}