#!/usr/bin/perl
# Filename:      grml-quickconfig
# Purpose:       get fast access to some basic grml-scripts
# Authors:       Michael Schierl <schierlm-public@gmx.de>, Alexander Wirt <formorer@grml.org>
# Bug-Reports:   see http://grml.org/bugs/
# License:       This file is licensed under the GPL v2.
################################################################################

# menu with quick config options

use Term::ReadKey;
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);

# enable alternate charset support (needed for screen)
print "\e(B\e)0";

open (my $fh, '/proc/cmdline');
my $cmdline = <$fh>;
close($fh);

my $color = 1 unless $cmdline =~ /nocolor/;

# variables for nice display
if ($color) {
    $W = "\e[0;32;1m";     # White
    $N = "\x0f\e[0m";      # Normal
    $M = "\e[0;35;1m";     # Magenta (for commands)
    $B = "\e[0;34;1m\x0e"; # Blue, line drawing characters
} else {
    $B = "\x0e";
    $N = "\x0f";
}

$HLINE=$B."x".$N;      # A single horizontal line drawing character

# menu options
%menu_commands = (
    d => 'grml-lang de',
    a => 'grml-lang at',
    c => 'grml-lang ch',
    u => 'grml-lang us',
    s => 'grml-lang es',
    n => 'grml-network',
    e => 'netcardconfig',
    i => 'grml-info',
    h => 'grml2hd',
    m => 'pdmenu -c',
    q => 'exit',
# x and Return are handled manually
);

# window managers
%windowmanagers = (
    a => 'awesome',
    d => 'dwm',
    e => 'evilwm',
    f => 'fluxbox',
    v => 'fvwm',
    2 => 'fvwm2',
    c => 'fvwm-crystal',
    j => 'jwm',
    o => 'openbox',
    k => 'pekwm',
    r => 'ratpoison',
    t => 'twm',
    9 => 'w9wm',
    w => 'windowlab',
    i => 'wmii',
    n => 'wm-ng',
);

sub getKey
{
  print "Press a key: ".$M;
  ReadMode 4; # Turn off controls keys

  # HACK: this is necessary because startx/Xorg sets the console where it outputs
  #       to non-blocking mode
  $flags = fcntl(STDIN, F_GETFL, 0) or die "Can't get flags for STDIN: $!\n";
  $flags = fcntl(STDIN, F_SETFL, $flags & ~O_NONBLOCK) or die "Can't set flags for STDIN: $!\n";

  while (not defined ($x = ReadKey(0))) {}
  ReadMode 0; # Reset tty mode before exiting
  return $x;
}

# main loop
while(1) {
# main loop
    $command="";
    while($command eq "") {
  print <<"EOF";

   ${B}lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk${N}
   $HLINE Welcome to ${M}grml-quickconfig${M}                            $HLINE
   $HLINE Press a highlighted key to perform an action, or press $HLINE
   $HLINE ${W}Return${N} or ${W}q${N} to go back to the shell.                   $HLINE
   ${B}tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu${N}
   $HLINE Set keyboard layout (${M}grml-lang${N}): ${W}d${N}e ${W}a${N}t ${W}c${N}h e${W}s${N} ${W}u${N}s        $HLINE
   $HLINE Configure ${W}n${N}etwork (${M}grml-network${N})                       $HLINE
   $HLINE -> Configure ${W}e${N}thernet card directly (${M}netcardconfig${N})    $HLINE
   ${B}tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu${N}
   $HLINE Show ${W}i${N}nformation about grml (${M}grml-info${N})                $HLINE
   $HLINE Start ${W}x${N} (${M}grml-x${N})                                       $HLINE
   $HLINE Show an application ${W}m${N}enu (${M}pdmenu${N})                      $HLINE
   $HLINE Install grml to ${W}h${N}ard disk (${M}grml2hd${N})                    $HLINE
   ${B}mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj${N}

EOF
  $x = getKey();

  print $N.$/.$/;
  if (defined($menu_commands{$x})) {
      $command = $menu_commands{$x};
  } elsif ($x eq "\n" || $x eq ' ') {
      $command= 'exit';
  } elsif ($x eq "x") {
      print <<"EOF";

   ${B}lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk${N}
   $HLINE Select a window manager (unsorted list):                $HLINE
   $HLINE Press any other key to return to the main menu.         $HLINE
   ${B}tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu${N}
   $HLINE ${W}a${N}wesome ${W}d${N}wm ${W}e${N}vilwm ${W}f${N}luxbox f${W}v${N}wm fvwm${W}2${N} fvwm-${W}c${N}rystal ${W}j${N}wm  ${N}$HLINE
   $HLINE ${W}o${N}penbox pe${W}k${N}wm ${W}r${N}atpoison ${W}t${N}wm w${W}9${N}wm ${W}w${N}indowlab wm${W}i${N}i wm-${W}n${N}g   ${N}$HLINE
   ${B}mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj${N}

EOF
      $x = getKey();

      print $N.$/.$/;
      if (defined($windowmanagers{$x})) {
    $command = "su - grml -c 'grml-x ".$windowmanagers{$x}."'";
      } else {
    print "Unknown key, not bound to a windowmanager.\n";
    print "Returning to main menu.\n";
      }
  } else {
      print "Unknown key.\n";
  }
    }

# reenable input buffering
    system "stty", 'icanon', 'eol', '^@';

    if ($command eq "exit") {
  last;
    }
    print $W . "Running command: " . $M . $command . $N . $/;
    system($command);
    print $/;
}
print "Happy hacking!\n";

## END OF FILE #################################################################
# vim: ai expandtab ft=perl
