#!/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.


my @lf;

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 /etc/X11/wmsession.d/

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

	      --generate=DIR: Produce window-manager .desktop files into DIR.
	      --wrap-sessions: Wrap window-managers with /usr/share/X11/xdm/Xsession.

	      -k,  --kdm3:   Shortcut for --generate=/opt/kde3/share/apps/kdm/sessions
	      -K,  --kdm4:   Shortcut for --generate=/usr/share/apps/kdm/sessions
	      -g,  --gdm:    Shortcut for --generate=/etc/X11/dm/Sessions --wrap-sessions

	      -h, --help:   Produce this help.

EOF
  exit($e);
}

sub cat {   # returns content of argument file as a single string
  my ($f) = @_;
  local *F;
  open F, $f or die "Can't open $f\n";
  local $/ = "";
  <F>
  }
  
sub parse_file {         # parse a session descriptor file
    my ($fn) = @_;
     $_ = cat ($fn);
     ($n = $1) =~ s| ||g if /^NAME=(.*)/m;
     $e = $1 if /^EXEC=(.*)/m;
#     $d = $1 if /^DESC=(.*)/m;
#     $i = $1 if /^ICON=(.*)/m;
     $s = $1 while /SCRIPT:(.*?)$/gs; chomp $s;
     if (-x $e) { $script{$n} = $s; $exe{$n} = $e; push @lf, $n; ($order{$n}) = $fn =~ m/(^[0-9][0-9])/; }
#     if (-x $e) { $script{$n} = $s; $exec{$n} = $e; $desc{$n} = $d; $icon{$n} = $i; push @lf, $n; }
}

sub gen_desktops {
    my ($d, $usesession) = @_;
    -d $d or system("mkdir -p $d");
    system("rm -f $d/*");

    for my $file (@lf) {
	open FH, ">$d/$order{$file}$file.desktop" or die "Can't write to $d/$order{$file}.desktop\n";
	print FH "[Desktop Entry]\n";
	print FH "Encoding=UTF-8\n";
	print FH "Name=$file\n";
	print FH "Comment=$file\n";
	print FH "TryExec=$exe{$file}\n" if $exe{$file};
	if ($usesession) {
	    print FH "Exec=/usr/share/X11/xdm/Xsession $file\n";
	} else {
	    print FH "Exec=$file\n";
	}
	print FH "Icon=\n";
	print FH "Type=Application\n";
	close FH;
	chmod 0755, $file;
    }
}

usage(1)
  if @ARGV < 1;

while ($ARGV[0] =~ /^--/ || $ARGV[0] =~ /^-/) {
  $_ = shift;
  if (/^--xsession=([^ ]+)/ || /^-x=([^ ]+)/) {
    $xsession = $1;
  } elsif (/^--first/ || /^-F/) {
    $first++;
  } elsif (/^--generate=([^ ]+)/) {
    $generate = $1;
  } elsif (/^--wrap-sessions/) {
    $wrap_sessions++;
  } elsif (/^--gdm/ || /^-g/) {
    die "You should be root to build gdm session\n" if $< != 0;
    $gdm++;
  } elsif (/^--list/ || /^-l/) {
    $list++;
  } elsif (/^-L/) {
    $list_order++;
  } elsif (/^--kdm3/ || /^-k/) {
    $kdm3++;
  } elsif (/^--kdm4/ || /^-K/) {
    $kdm4++;
  } 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 ? './wmsession.d/' : '/etc/X11/wmsession.d/' unless $dir;
chdir $dir; 
for (<*>) {
    next if /.*~/;
    next if /.*\.rpm(save|old)/;
    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 ($generate) {
    gen_desktops($generate, $wrap_sessions);
}

if ($kdm3) {
    gen_desktops('/opt/kde3/share/apps/kdm/sessions', 0);
}

if ($kdm4) {
    gen_desktops('/usr/share/apps/kdm/sessions', 0);
}

if ($gdm) {
    gen_desktops('/etc/X11/dm/Sessions', 1);
}

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";
}

