#!/usr/bin/perl # (c) MandrakeSoft, Chmouel Boudjnah # 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 () { $n = $1 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; $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; parse_file ("$dir/$_") for <*>; sub cat { my ($f) = @_; local *F; open F, $f; join '', } 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/gdm/Sessions/'; chdir $d; #Any better way ? opendir D, $d or die "Can't open $d\n"; for ( readdir(D)) { next if /^\.\.?/;next if /^Failsafe/; chmod 0644, $_; } closedir D; for my $file (@lf) { open FH, ">/etc/X11/gdm/Sessions/$file" or die "Can't write to /etc/X11/gdm/Sessions/$file\n"; print FH "#!/bin/sh\n"; print FH "exec /etc/X11/xdm/Xsession $file\n"; close FH; chmod 0755, $file; } unlink 'Default'; symlink shift @lf, 'Default'; } 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"; } }