#!/usr/bin/perl # (c) Mandriva, Chmouel Boudjnah # 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), "\n"; } else { print "default\n"; } } elsif ($list_order) { print join(' ', map { "$_=$order{$_}" } @lf), "\n"; }