#!/bin/sh
# A script to change the XkbVariant variable in xorg.conf
# Part of the Puppy XkbConfigurator

##--------variables---------->>
INFILE='/etc/X11/xorg.conf'
OUTFILE='/etc/X11/xorg.conf.tmp3'
TMPDIALOG=/tmp/XkbVariantDialog
TMPLIST=/tmp/XkbVariantList
LIST="/etc/X11/xkb/rules/xorg.lst"
# exported the following from main
#ERRMSG='Xdialog --title "ERROR" --msgbox "An Error has occured! Try again." 0 0'
#SUCCESS='Xdialog --title "Success!" --no-buttons --infobox "Changes applied successfuly!" 0 0 2000'

# the full lines containing XkbVariant and XkbLayout:
ORIGINAL=`fgrep '"XkbVariant"' $INFILE | grep -v '^#'`
LAYOUTSLINE=`fgrep '"XkbLayout"' $INFILE | grep -v '^#'`
[ "$ORIGINAL" = "" ] && NEWLINE="yes"

#find current variants and layouts:
CURRENT=`echo "$ORIGINAL" | cut -d'"' -f4`
OLD="$CURRENT" #needed if line exists but nothing in it
LAYOUTS=`echo "$LAYOUTSLINE" | cut -d'"' -f4`

# create list of variants available for our layouts:
if [ ! `echo "$CURRENT" | tr -d ','` = "" ]; then
	EXIST=$(echo "$CURRENT" | tr ',' '\n' | while read AVAR ;do
[ "$AVAR" = "" ] && continue
POS=`echo "$CURRENT" | tr ',' '\n' | fgrep -n "$AVAR" | cut -d: -f1`
MYLAY=`echo "$LAYOUTS" | cut -d',' -f$POS`
fgrep " $AVAR " $LIST | fgrep -w "$MYLAY:"
done)
	MESSAGE="現在、次の変形を使っています:
"$EXIST"

変形を取り外すには、下から選んで「OK」を押して下さい。
新しいものを追加するには、選んで「OK」を押して下さい。

注意: 既に持っているレイアウト用に変形を選択すると、
変形は古いものから新しいものに置き換えます。"
else
	OLD=`echo "$LAYOUTS" | tr -d 'a-zA-Z_/'`
	MESSAGE='追加したい変形を選んで、「OK」を押して下さい。'
fi

# create list of available variants:
INDEX=1
echo "$LAYOUTS" | tr ',' '\n' | while read ALAY;
do fgrep " $ALAY:" $LIST | tr -s ' ' ; done | while read AVAR ; do
	TAG=`echo "$AVAR" |cut -d' ' -f1`
	INFO=`echo "$AVAR" |cut -d' ' -f2-`
	echo "\"$INDEX: $TAG\" \""$INFO"\""; INDEX=`expr $INDEX + 1` ; done > $TMPLIST

# create dialog with all options (in temp file)
echo -n '#!/bin/sh
Xdialog --left --stdout --title "Select XkbModel" --menubox "' >$TMPDIALOG
echo -n "$MESSAGE\" 0 0 15 " >>$TMPDIALOG
cat $TMPLIST | tr '\n' ' ' >>$TMPDIALOG
chmod 755 $TMPDIALOG

# run dialog and get choice
CHOICE=`eval $TMPDIALOG`
[ "$CHOICE" = "" ] && echo "cancelled" && exit
echo "$CHOICE"

# find the variant chosen and its position
NEWVAR=`fgrep "$CHOICE" $TMPLIST | cut -d'"' -f2 | cut -d' ' -f2`
ITSLAY=`fgrep "$CHOICE" $TMPLIST | cut -d'"' -f4 | cut -d: -f1`
ITSPOS=`echo "$LAYOUTS" | tr ',' '\n' | fgrep -n "$ITSLAY" | cut -d: -f1`


#the last sed is since we need to cut off the last , (echo -n doesn't work well)
NEW=`echo "$OLD" | tr ',' '\n' | sed "${ITSPOS}s/.*/$NEWVAR/" | tr '\n' ',' | sed 's/,$//'`

# if old is same as new: remove
[ "$NEW" = "$OLD" ] && NEW=`echo "$OLD" | tr ',' '\n' | sed "${ITSPOS}s/.*//" | tr '\n' ',' | sed 's/,$//'`

# add new variant to line, or entire line, if it doesn't exist:
if [ "$NEWLINE" = "yes" ] ;then
	ORIGINAL="$LAYOUTSLINE"
	MODIFIED="$ORIGINAL\n	Option      \"XkbVariant\" \"$NEW\""
else
	MODIFIED=`echo "$ORIGINAL" | sed "s%\"$CURRENT\"%\"$NEW\"%"`
fi

# add to file
cat $INFILE | sed "s%$ORIGINAL%$MODIFIED%" >$OUTFILE

if ! fgrep -q '"XkbModel"' $OUTFILE ;then
	eval $ERRMSG
	rm -f $OUTFILE
else
	mv -f $OUTFILE $INFILE
	eval $SUCCESS
fi
exit