I sent this to wmpeople and [EMAIL PROTECTED] yesterday.
Shaleh wrote: > > Currently Debian supports /etc/X11/window-managers as a place to > register window managers w/ X. The first window manager in the list is > run as default unless the user specifies on when X starts (in .xinitrc > or what not). However there is no way to modify this file short of hand > editing or programs like cat/sed/awk. Also no package claims this file > either. > > What Marcelo and I have done is write an update-windowmangers script > which behaves in a manner similar to the other update* scripts in > Debian. It can add, remove, or set a particular wm as default. It also > supports silent or queried running. The syntax is: > > update-windowmanagers {--add|--remove--default} [--ask] wm. It appends > /usr/X11R6/bin to the name unless full path is given. So users can also > use this to add their own wm's that may live in /usr/local or somewhere > else. > > The add and remove is straight forward. The default option adds the wm > if needed, or simply places it first in the list otherwise. > > I intend on submitting a wishlist bug on xbase for this to be included > there. Once it is part of Debian, all wm's can simply call this script > in their postinst/postrm scripts. Analogous to update-menus. > > Comments or suggestions welcome. As is code changes or additions. > > (Apologies for the attachment, I was at work when this was sent -- darn > M$) > > ------------------------------------------------------------------------ > #! /usr/bin/perl > ### > # > # written by Shaleh <[EMAIL PROTECTED]> > # cleaned up arg checking and --ask option by > # "Marcelo E. Magallon" <[EMAIL PROTECTED]> > # > ### > > while ($ARGV[0] =~ m/^--/) { > $_ = shift(@ARGV); > if (/--add/) { > $mode='add'; > } elsif (/--remove/) { > $mode='remove'; > } elsif (/--default/) { > $mode='default'; > } elsif (/--ask/) { > $ask='true'; > } else { > &usage; > } > } > > unless( @ARGV == 0 ) { > &usage; > } > > if( $ARGV[0] !~ m/^\// ) { > $WM = '/usr/X11R6/bin/' . $ARGV[0]; > } > else { > $WM = $ARGV[0]; > } > > if ( $ask eq 'true') { > &ask($mode, $WM); > } > > if( $mode eq 'add' ) { > &add_to_file($WM); > } > elsif( $mode eq 'default' ) { > &make_default($WM); > } > elsif( $mode eq 'remove' ) { > &rm_from_file($WM); > } > > ### > # > # Usage information > # > ### > sub usage { > print <<EOT; > Usage: $0 [--ask] {--add|--default|--remove} <wm> > > Options: > --ask Asks for confimation of the requested action > > Actions: > --add Adds the specified window manager to the bottom of the > /etc/X11/window-managers file > --remove Removes the specified window manager > --default Adds the specified window manager to the top of the > /etc/X11/window-managers file, thus making it the system > default > > <wm> can the the full path to the window manager excecutable, or just the > filename (/usr/X11R6/bin/ will be prepended to it). > > EOT > exit(0); > } > > ### > # > # Asks for confirmation of the requested action > # > ### > sub ask { > ($mode, $WM) = @_; > > if (open(WMFILE, '/etc/X11/window-managers')) { > @WMS = <WMFILE>; > close(WMFILE); > print "The following window managers are listed in > /etc/X11/window-managers:\n\n"; > foreach (@WMS) { > if (m/\//) { > print "\t" . $_; > } > } > print "\n"; > } > > if ($mode eq 'add') { > $prompt = "Do you want to add $WM to the list"; > } elsif ($mode eq 'remove') { > $prompt = "Do you want to remove $WM from the list"; > } elsif ($mode eq 'default') { > $prompt = "Do you want make $WM the default"; > } > > &ask_n($prompt) || exit(0); > } > > ### > # > # Asks a question, "No" is the default > # > ### > sub ask_n { > my $answer; > print @_,"? [No] "; > $answer=<STDIN>; > return ( $answer =~ /^\s*y/i ); > } > > ### > # > # Adds window manager passed to the end of window-managers file > # > ### > sub add_to_file { > ($wm) = @_; > > return unless( &ifexists($wm) eq 'false' ); > > open(WMFILE, '>>/etc/X11/window-managers') || > die("Could not open /etc/X11/window-managers for writing\n"); > print WMFILE "$wm\n"; > close(WMFILE); > } > > ### > # > # Makes window manager passed the default by putting it first > # > ### > sub make_default { > ($wm) = @_; > my $found = 0; > > if( &ifexists($wm) eq 'true' ) { > &rm_from_file($wm); > } > > open(WMFILE, '/etc/X11/window-managers') || > die("Could not open /etc/X11/window-managers\n"); > @WMS = <WMFILE>; > close(WMFILE); > open(WMFILE, '>/etc/X11/window-managers') || > die("Could not open /etc/X11/window-managers for writing\n"); > foreach (@WMS) { > if( m/^\// && $found == 0 ) { > print WMFILE "$wm\n"; > $found = 1; > } > print WMFILE; > } > close(WMFILE); > } > > ### > # > # Removes passed window manager from window-managers file > # > ### > sub rm_from_file { > ($wm) = @_; > > return unless( &ifexists($wm) eq 'true' ); > > open(WMFILE, '/etc/X11/window-managers') || > die("Could not open /etc/X11/window-managers\n"); > @WMS = <WMFILE>; > close(WMFILE); > open(WMFILE, '>/etc/X11/window-managers') || > die("Could not open /etc/X11/window-managers for writing\n"); > > foreach (@WMS) { > print WMFILE unless( m/$wm/ ); > } > } > > ### > # > # returns 'true' if window manager exists in the file, 'false' otherwise > # > ### > sub ifexists { > ($wm) = @_; > > open(WMFILE, '/etc/X11/window-managers') || > die("Could not open /etc/X11/window-managers\n"); > > @WMS = <WMFILE>; > close WMFILE; > foreach (@WMS) { > unless( m/^#/ ) { > if( m/$wm/ ) { > return 'true'; > } > } > } > return 'false'; > }