Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

wmchoose

by blazar (Canon)
on Dec 27, 2004 at 21:58 UTC ( #417646=sourcecode: print w/replies, xml ) Need Help??
Category: Utility Scripts
Author/Contact Info blazar@lcm.mi.infn.it
Description: Naive Window Manager selection tool

Data used by the program is appended to it after the __END__ token. Embedded pod documentation describes its format for maintainers/admins (no perl experience/knowledge required). This is being actually used at a site: it's rudimentary but it works! Users seem to be satisfied.

Note that die()s and warn()ings intended for the final users are in "\n"-form, whereas those for maintainers are in the somewhat more informative "\n"-less one, so before pointing out there's an inconsistency consider that it's there by design...

Suggestions and improvements welcome. About the only feature I've considered adding myself is support for multi-line text to be inserted in ~/.xinitrc, but up until now nobody has requested it at least in the environment this is being used.

#!/usr/bin/perl -l

=head1 DESCRIPTION

Naive program for B<Window Manager> selection: (over)writes one's
F<`~/.xinitrc'>.  Data for the program is appended literally at
the end of it, after the __END__ token and has the form

C<< <key>:<name>:<cmd> >>

where <key> is the key to be selected by the user, preferably
consisting of one or at most a few chars, <name> is the name of
the Window Manager and <cmd> is the command to be put in F<`~/.xinitrc
+'>.
<key> is case-insensitive and shown uppercase.

In the unlikely event that any item contains literal C<:>'s, any longe
+r
string of colons can be used as a separator instead, like thus:

C<L::LCM:Cool!::exec lcmwm>

Lines with no colons are silently ignored.  No additional checking is
performed.

=cut

use strict;
use warnings;

my ($q,%wm,%saw)='Q'; # Quit Key

while (<DATA>) {
    chomp;
    my $sep;
    $sep |= $_ for /:+/g;
    $sep or next;
    my ($k,$n,$cmd)=split /$sep/;
    $k=uc $k;
    (warn "$0: Cannot use [$k] as a key for `$n'"),
      next if $k eq $q;
    (warn "$0: Duplicate key [$k]. Skipping `$n'"),
      next if $saw{$k}++;
    $wm{$k}=[$n,$cmd];
}

{
    print "Choose Window Manager:";
    print "[$_] $wm{$_}[0]" for sort keys %wm;
    print "[$q] <QUIT>";
    
    chomp(my $in=uc <STDIN>);
    last if $in eq $q;
    
    exists $wm{$in} or
      (warn "Invalid choice: [$in]\n"), redo;
    
    open my $fh, '>', "$ENV{HOME}/.xinitrc" or
      die "Can't write to ~/.xinitrc: $!\n";
    print $fh $wm{$in}[1];
    print <<"EOT";
`~/.xinitrc' successfully updated for use with $wm{$in}[0]!
Do you want to start X now? 
[y/Y] to do so, anything else to quit.
EOT
    exec 'startx' 
      if uc <STDIN> eq "Y\n";
}

__END__
G:Gnome:exec gnome-session
K:KDE:exec startkde
B:Blackbox:exec blackbox
E:Enlightenment:exec enlightenment
F:FVWM:exec fvwm
I:IceWM:exec icewm-session
S:Sawfish:exec sawfish
W:Window Maker:exec wmaker
A:Waimea:exec waimea
X:XFce3:exec xfwm
X4:XFce4:exec startxfce4
U:Fluxbox:exec fluxbox
L:evilwm:exec evilwm
Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://417646]
help
Chatterbox?
[TStanley]: I'm sitting in the airport in Tampa, Florida at the moment, getting ready to head home.
[talexb]: TStanley I'm flying to Vegas in two weeks time. After that flights leaving Vegas and Phoenix are late at night .. I've been hearing that it gets so hot that the air isn't dense enough for planes to take off. Weird. Guess you won't have that problem.
[Corion]: Yay, vacation time now - one week off work (but a Perl workshop in the middle ;)) )
[talexb]: TStanley I just realized that I was in your area for a convention back in April. We were at the high school for the weekend, the one with the long driveway. Nice spot.

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (8)
As of 2017-06-23 14:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How many monitors do you use while coding?















    Results (548 votes). Check out past polls.