#!/usr/bin/perl
# (c) MandrakeSoft, Chmouel Boudjnah <chmouel@mandrakesoft.com>
# Copyright under GPL blah blah blah.
## you'll don't find much info here, see --help.

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.
    -f=FILE, --file=FILE:	Specify an alternarte config files other
				than /etc/X11/window-manager
-x=ENTRY, --xsession=ENTRY:	Product window-managers script of ENTRY.
	      -k,  --kdm:	Product window-managers list for kdm sessions.
	      -g,  --gdm:	Product window-managers script for gdm sessions.
	      -h, --help:	Product this help.

EOF
  exit($e);
}
  
sub parse_file {
  my $f=shift @_;
  open F, $f or die "Can't open $f\n";
  local $/ = "";
  while (<F>) {
     ($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; push @lf, $n; }
#     if (-x $e) { $script{$n} = $s; $exec{$n} = $e; $desc{$n} = $d; $icon{$n} = $i; push @lf, $n; }
  }
}

usage(1)
  if @ARGV < 1;

while ($ARGV[0] =~ /^--/ || $ARGV[0] =~ /^-/) {
  $_ = shift;
  if (/^--xsession=([^ ]+)/ || /^-x=([^ ]+)/) {
    $xsession = $1;
  } elsif (/^--first/ || /^-F/) {
    $first++;
  } elsif (/^--gdm/ || /^-g/) {
    die "You should be root to build gdm session\n" if $< != 0;
    $gdm++;
  } elsif (/^--list/ || /^-l/) {
    $list++;
  } elsif (/^--kdmsess/ || /^-k/) {
    $kdm++;
  } elsif (/^--test/ || /^-t/) {
    $test++;
  } elsif (/^--dir=([^ ]+)/ || /^-d=([^ ]+)/) {
    $dir = $1;
  } elsif (/^--help/ || /^-h/ || /^-\?/) {
    usage(0);
  } else {
    print STDERR "Unrecognized switch: $_\n";
    usage(1);
  }
}
  
$dir = $test ? './wmsession.d/' : '/etc/X11/wmsession.d/' unless $dir;
chdir $dir; 
for (<*>) {
    next if /.*~/;
    next if /.*\\.rpm(save|old)/;
    parse_file ("$dir/$_");
}

sub cat { my ($f) = @_; local *F; open F, $f; join '', <F> }
my ($e) = cat("/etc/sysconfig/desktop") =~ /(\S+)/;
@lf = sort { $b =~ /$e/i <=> $a =~ /$e/i } @lf;

if ($kdm) {
  $session="SessionTypes=";
  for(@lf) { $session .= /$lf[-1]/ ? "$_,failsafe,default" : "$_,"  }
  print "$session\n";
  exit(0);
}


if ($gdm) {
  my $d = '/etc/X11/dm/Sessions/';
  chdir $d;

  for my $file (@lf) {
    open FH, ">/etc/X11/dm/Sessions/$file.desktop" or die "Can't write to /etc/X11/dm/Sessions/$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 "Exec=/etc/X11/xdm/Xsession $file\n";
    print FH "Icon=\n";
    print FH "Type=Application\n";
    close FH;
    chmod 0755, $file;
  }

}

if ($xsession) {
  if ($script{$xsession}) {
    print "#!/bin/sh\n";
    print $script{$xsession}
  } else {
    print "xterm -geometry 100x25+0+0 &\n";
	if ( -x '/usr/X11R6/bin/icewm' ) {
		print "icewm\n";
	} elsif ( -x '/usr/X11R6/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) {
    my $p; for(@lf) { $p .= /$lf[-1]/ ? "$_ default failsafe" : "$_ " } print "$p\n";
 } else {
    print "Default\n";
  }
}
