aboutsummaryrefslogtreecommitdiffstats
path: root/sbin/chksession
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/chksession')
-rw-r--r--sbin/chksession167
1 files changed, 167 insertions, 0 deletions
diff --git a/sbin/chksession b/sbin/chksession
new file mode 100644
index 0000000..196414f
--- /dev/null
+++ b/sbin/chksession
@@ -0,0 +1,167 @@
+#!/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.
+ -k, --kdm3: Produce window-managers list for kdm3 sessions.
+ -K, --kdm4: Produce window-managers list for kdm4 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 $/ = "";
+ <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 (/^--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 ($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";
+}
+