#!/usr/bin/perl # (c) MandrakeSoft, Chmouel Boudjnah # 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. -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. -k, --kdm: Produce window-managers list for kdm sessions. -g, --gdm: Produce window-managers script for gdm 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 $/ = ""; } 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, $createdefault, $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=/etc/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; } if ($createdefault) { open FH, ">$d/Default.desktop" or die "Can't write to $d/Default.desktop\n"; print FH "[Desktop Entry]\n"; print FH "Encoding=UTF-8\n"; print FH "Name=Default\n"; print FH "Comment=Default\n"; print FH "Exec=/etc/X11/xdm/Xsession\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 (/^--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); } } # 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 ($kdm) { gen_desktops('/usr/share/apps/kdm/sessions', 0, 0); } if ($gdm) { gen_desktops('/etc/X11/dm/Sessions', 1, 1); } 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"; } }