#!/bin/sh
# @vasm : XDMSET
# @level: root
# @description: setup display managers and its sessions
# 
# (c) Kocil, 2003
# (c) VLocity Linux, 2003

vdir=$(dirname $0)
. $vdir/vasm-functions

check_root

KDM_CMD=/opt/kde/bin/kdm
GDM_CMD=/opt/gnome2/bin/gdm
WDM_CMD=/usr/X11R6/bin/wdm
XDM_CMD=/usr/X11R6/bin/xdm

XINIT_DIR="/etc/X11/xinit"
KDMRC="/opt/kde/share/config/kdm/kdmrc"
WDMRC="/etc/X11/wdm/wdm-config"
#CONFIG="/etc/sysconfig/X11"
CONFIG="/etc/rc.d/rc.X"


new_dmconfig() {

cat<<EOF > $CONFIG
## X11 system configuration
## This file is read by /etc/rc.d/rc.X during init level 4/5
DISPLAY_MANAGER="$1"
WINDOW_MANAGER=
SOUND_SERVER=
EOF

}

## write down the configuration
set_dmconfig() {
  if [ -f $CONFIG ] ; then
    if grep -qe "^DISPLAY_MANAGER=" $CONFIG ; then
       sed -i "s!^DISPLAY_MANAGER=.*!DISPLAY_MANAGER=$1!" $CONFIG
    else
       echo "DISPLAY_MANAGER=$1" >> $CONFIG
    fi
  else
    new_dmconfig
  fi 
}

################################################
wm_description()
{
case "$1" in 
  KDE*|kde*) 
     echo "A desktop with more than anything you want"
     ;;
  GNOME*|gnome*) 
     echo "A desktop with almost everything you want"
     ;;
  dropline|metacity)
     echo "When GNOME is too heavy for you"
     ;;
  XFCE*|xfce*)
     echo "Good looking, medium weight desktop"
     ;;
  IceWM*|icewm*)
     echo "Cool, effective windows manager"
     ;;
  fluxbox*|openbox*)
     echo "No nonsense windows manager"
     ;;
  blackbox*)
     echo "The ancestor of *box windows manager"
     ;;
  enlightenment*)
     echo "Fancy yet light windows manager"
     ;;
  windowmaker*|wmmaker*)
     echo "The most decorated window manager"
     ;;
  ROX|rox|rof-filer)
     echo "This one rocks !!!"
     ;;
  *)
     echo "Another X window manager"
     ;;
esac
}

dm_status() {
  if [ "$1" = "$DISPLAY_MANAGER" ]; then
     echo "on"
  else
     echo "off"
  fi
}

# Check if KDM is configurable
# Only KDM 3.1> 
function checkkdm() {
if [ ! -f $KDMRC ]; then
   KDMPATH=`which kdm`
   if [ $? = 0 ]; then
     KDMPATH=`dirname $KDMPATH`
     KDMPATH=`dirname $KDMPATH`
     KDMRC="$KDMPATH/share/config/kdm/kdmrc"
   fi
fi
if [ ! -f $KDMRC ]; then
   return 1
fi
grep -e "^SessionTypes=" $KDMRC > /dev/null
if [ ! $? = 0 ]; then
  return 1
fi
return 0
}

function buildkdm() {
if [ ! -f $KDMRC ]; then
   KDMPATH=`which kdm`
   if [ $? = 0 ]; then
     KDMPATH=`dirname $KDMPATH`
     KDMPATH=`dirname $KDMPATH`
     KDMRC="$KDMPATH/share/config/kdm/kdmrc"
   fi
fi
if [ ! -f $KDMRC ]; then
   dbug "WARNING: Could not find $KDMRC"
   return 1
fi
SS=`echo $1 | sed -e 's/ /,/g'`
SS="$SS,default,failsafe"
cp $KDMRC $KDMRC.old
sed -e "s:^SessionTypes=.*:SessionTypes=${SS}:" < $KDMRC.old > $KDMRC
grep -e "^SessionTypes=${SS}" $KDMRC > /dev/null
if [ ! $? = 0 ]; then
  dbug "ERROR: Could not modify $KDMRC"
  return 2
else
  dbug "Sessions has been added to KDM".
fi
}

function buildwdm() {
if [ ! -f $WDMRC ]; then
   dbug "WARNING: Could not find $WDMRC"
   return 1
fi
cp $WDMRC $WDMRC.old
SS=`echo $SESSIONS | sed -e 's/ /:/g'`
SS="$SS:default"
sed -e "s/^DisplayManager\*wdmWm:.*/DisplayManager\*wdmWm: $SS/" < $WDMRC.old > $WDMRC
grep -e "^DisplayManager\*wdmWm: $SS" $WDMRC > /dev/null
if [ ! $? = 0 ]; then
  dbug "ERROR: Could not modify $WDMRC"
  return 2
else
  dbug "Sessions has been added to WDM".
fi
}

#######################################################################################
# CHOOSE DISPLAY MANAGER
menuA()
{

DISPLAY_MANAGER=`grep -e "^DISPLAY_MANAGER=" $CONFIG | cut -d = -f 2`
LAST=$(grep ^DISPLAY /etc/rc.d/rc.X|cut -d "=" -f2)
DIMENSION="17 56 5"
TITLE="DISPLAY MANAGER CONFIGURATOR"
TEXT="\n
Welcome to display manager configurator. Display\n
manager is the program for GUI mode login.\n\n
Use SPACE BAR to select the DM, then press OK:"

echo '$DCMD --backtitle "$BACKTITLE" --title "$TITLE" --radiolist "$TEXT" $DIMENSION \' > $fmenu

which kdm &> /dev/null
if [ $? = 0 ]; then
   echo 'KDM  "State of the art from KDE"' $(dm_status KDM) '\' >> $fmenu
fi
which gdm &> /dev/null
if [ $? = 0 ]; then
   echo 'GDM  "State of the art from GNOME"' $(dm_status GDM) '\' >> $fmenu
fi
which wdm &> /dev/null
if [ $? = 0 ]; then
   echo 'WDM  "Diet choice from Window Maker"' $(dm_status WDM) '\' >> $fmenu
fi

which entrance &> /dev/null
if [ $? = 0 ]; then
   echo 'EDM  "Enlightened Display Manager"' $(dm_status EDM) '\' >> $fmenu
fi

which xdm &> /dev/null
if [ $? = 0 ]; then
echo 'XDM  "The original recipe from X-Window"' $(dm_status XDM) '\' >> $fmenu
fi
echo ' 2> $freply' >> $fmenu

#cat $fmenu
. $fmenu

status=$?
[ $status != 0 ] && return $status

CHOICE=`cat $freply`

dbug "CHOICE=$CHOICE"

if [ ! "$CHOICE" = "$LAST" ]; then
  set_dmconfig $CHOICE
  DISPLAY_MANAGER=$CHOICE
fi
dbug "DISPLAY_MANAGER=$DISPLAY_MANAGER"
#case $DISPLAY_MANAGER in
#  WDM)
#    return 0
#    ;;
#  KDM)
#    #[ `check_kdm` ] && return 0
#    return 0
#    ;;
#esac
# SKIP to the END
wizard menuC
}

#########################################################################
menuB()
{
DIMENSION="20 70 6"
TITLE="DISPLAY MANAGER SESSIONS"
TEXT="\n
You may select the sessions menu for $DISPLAY_MANAGER.\n 
The session scripts are located at $XINIT_DIR.\n
If you want more options, just make your own script\n
there then call this program again.\n\n
For now please toggle your choices:"

echo '$WCMD --backtitle "$BACKTITLE" --title "$TITLE" --checklist "$TEXT" $DIMENSION \' > $fmenu 
for XINIT in $XINIT_DIR/xinitrc.*; do
   if [ -x $XINIT ]; then
      FNAME=`basename $XINIT`
      FEXT=`echo $FNAME | cut -d . -f 2`
      # WARNING: this will be broken if the script name has more than one period 
      DESCRIPTION=`grep "@description:" $XINIT | cut -d : -f 2 | sed -e "s/^ //g"`
      [ -z "$DESCRIPTION" ] && DESCRIPTION="$FEXT session"
      echo "$FEXT \"$DESCRIPTION\" on \\" >> $fmenu
   fi
done
echo ' 2> $freply ' >> $fmenu

# cat $fmenu
. $fmenu 

status=$?
[ $status != 0 ] && return $status

if [ "$CMD" = "" ]; then
  SESSIONS=`cat $freply | sed -e 's/"/ /g' -e 's/  / /g'`
else
  SESSIONS=`cat $freply | sed -e 's!/! !g' -e 's/  / /g'`
fi
case $DISPLAY_MANAGER in
  KDM)
     buildkdm "$SESSIONS"
     ;;
  WDM)
     buildwdm "$SESSIONS"
     ;;
esac
if [ ! $? = 0 ]; then
  $DCMD --backtitle "$BACKTITLE" --title " ERROR " --msgbox \
  "\nCould not setup $DISPLAY_MANAGER\nPlease check your installation" 0 0
  clean_exit 1
fi
return 0
}

menuC() {

if [ "$DISPLAY" ]; then
DIMENSION="14 50"
TITLE=" DONE "
TEXT="\n
Display manager has been configured to $DISPLAY_MANAGER.\n
Since you are running from a GUI,\n
to activate this new DM you should:\n
- logout or exit from the GUI\n
- switch to a console (press Ctrl-Alt-F1)\n
- login as root\n
- call init 2\n
- call init 4\n"

$DCMD --backtitle "$BACKTITLE" --title "$TITLE" --msgbox "$TEXT" $DIMENSION 

else

DIMENSION="10 50"
TITLE=" DONE "
TEXT="\n
Display manager has been configured to $DISPLAY_MANAGER.\n
Do you want to try it now ?\n
Warning, running X will be killed !"

$DCMD --backtitle "$BACKTITLE" --title "$TITLE" \
--yesno "$TEXT" $DIMENSION 2> $freply

status=$?
[ $status != 0 ] && return $status

clean_tmp
clear

run_level=$(runlevel | cut -f 2 -d " ")
case $run_level in
  5)
     init 3
     sleep 5
     init 5
     ;;
  4)
     init 2
     sleep 5
     init 4
     ;;
  *)
     # Kill X, if any
     skill X
     sleep 3
     init 5
     ;;
esac
fi

clean_exit
}

####################################################################################
# MAIN PROGRAM

wizard menuA menuB menuC

clean_exit
