#!/usr/bin/perl -w # # update_slim_wmlist, based on: # update_wdm_wmlist, (c) 1998 Marcelo Magallón # rewriten to use the x-window-manager alternative # modified to also use the x-session-manager alternative by Arthur Korn # Copyright 2000 Wichert Akkerman # Modified to use the freedesktop.org .desktop like kdm and gdm # # This script will read the list of installed window managers from # the freedesktop .desktop files in /X11/sessions/:/dm/Sessions/: # /xsessions/ # and update the sessions line in /etc/slim.conf. # BEWARE: It doesn't ask any questions about this. It just does it. It # takes an optional list of window managers. use strict; use File::DesktopEntry; my $wm_list=''; my %desktop_files; unless (@ARGV) { #my @wm_list = ('default'); my @wm_list; foreach my $dir ('/etc/X11/sessions/','/etc/dm/Sessions/','/usr/share/xsessions/') { next unless (opendir DIR, $dir); my @files; @files = grep { /\.desktop$/ && -r "$dir/$_" } readdir(DIR); foreach my $file (@files) { push @{$desktop_files{$file}}, "$dir/$file"; } } DESKTOP: foreach my $desktop_file (keys(%desktop_files)) { foreach my $file (@{$desktop_files{$desktop_file}}) { my $entry = File::DesktopEntry->new_from_file($file); next DESKTOP if (defined($entry->get_value('Hidden')) and $entry->get_value('Hidden') eq 'true'); if ($entry->get_value('Name') =~ /^gnome$/i) { push (@wm_list, 'gnome'); } elsif ($entry->get_value('Name') =~ /^kde$/i) { push (@wm_list, 'kde'); } elsif (defined($entry->get_value('Exec'))) { push (@wm_list, $entry->get_value('Exec')); } else { # not found, go to next file next; } # found, proceed to next destop file next DESKTOP; } } $wm_list = join (',', sort @wm_list) . ',custom'; } else { $wm_list = join (',', sort @ARGV); } open (SLIM_CONFIG_FILE, '/etc/slim.conf.new') or die "Can't open /etc/slim.conf.new for writing: $!"; while () { s|^(sessions\s*).*|$1$wm_list|; print NEW_SLIM_CONFIG_FILE; } close(SLIM_CONFIG_FILE); close(NEW_SLIM_CONFIG_FILE); rename '/etc/slim.conf.new', '/etc/slim.conf' or die "Can't rename /etc/slim.conf.new: $!"; exit 0;