#! /bin/bash

if [ $UID -ne 0 ]; then
  echo "You need to be root to run this program"
  exit 0
fi

vconsole_conf_file=/etc/vconsole.conf
sysconfig_file=/etc/sysconfig/keyboard
previous_x11conf_file=/etc/X11/xorg.conf.d/90-keytable.conf
systemd_x11conf_file=/etc/X11/xorg.conf.d/00-keyboard.conf
keyboard_map_systemd=/usr/share/systemd/kbd-model-map
keyboard_map_xdm=/etc/X11/xdm/Keyboard.map

function setkeyboard {
  # xorg.conf.d snippet is only written if a valid snippet is already
  # available, so create an us sample if neccessary
  
  if [ ! -f $systemd_x11conf_file ]; then    
    NEWKEYMAP=$(echo "$1" | sed "s/ $//" )
    
    # check systemd mapping
    opts=$(grep -P "^$NEWKEYMAP\t" "$keyboard_map_systemd" | sed -re "s/[^\t]*//" -e "s/[\t]+/ /g" )
    if [ -z "$opts" ]; then
       echo "W: Can not found mapping in $keyboard_map_systemd"
       echo "W: Please report bug of systemd."
       
       # fallback to xdm mapping
       opts=$(grep -Po "^$NEWKEYMAP[ ]*:[^:]*:[^:]*:[^:]*:" "$keyboard_map_xdm" | sed -re "s/([^:]*):([^:]*):([^:]*):([^:]*):/\3 \2 \4/" -e "s/[ ]+/ /g")
       
       if [ -z "$opts" ]; then
          echo "W: Can not found mapping in $keyboard_map_xdm"
          echo "W: Fallback to US keyboard"
          opts="us"
       else
          echo "I: Using fallback $keyboard_map_xdm mapping"
       fi
       
    else
       echo "I: Using default $keyboard_map_systemd mapping"
       # `localectl set-keymap $1` will create $systemd_x11conf_file correctly
    fi    
    
    echo "Command: localectl set-x11-keymap $opts"
    localectl set-x11-keymap $opts
    
  fi  
  
  echo "Command: localectl set-keymap $1"
  localectl set-keymap $1
    
  if [ -f $systemd_x11conf_file ]; then
    if [ $systemd_x11conf_file -nt $previous_x11conf_file ]; then
      rm -f $previous_x11conf_file
    fi
    exit 0
  else
    echo "$systemd_x11conf_file has not been created!" 
  fi
}

if [ -f $vconsole_conf_file ]; then
  echo "$vconsole_conf_file available"
  . $vconsole_conf_file
  if [ ! -z $KEYMAP ]; then
    echo "KEYMAP: $KEYMAP"
    options="$KEYMAP $KEYMAP_TOGGLE"
    setkeyboard "$options"
  else
    echo "KEYMAP not set"
  fi 
else
  echo "$vconsole_conf_file not available"
fi

if [ -f $sysconfig_file ]; then
  echo "$sysconfig_file available"
  . $sysconfig_file
  if [ ! -z $KEYTABLE ]; then
    KEYTABLE=${KEYTABLE%.gz}
    KEYTABLE=${KEYTABLE%.map}
    echo "KEYTABLE: $KEYTABLE"
    options="$KEYTABLE"
    setkeyboard "$options"
  else
    echo "KEYTABLE not set"
  fi
else
  echo "$sysconfig_file not available"
fi

echo "Keyboard layout could not be set"
exit 1
