#!/usr/bin/bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
# Used as a source

ENABLED=yes
if [[ ${ENABLED} == "yes" ]]; then
    DEFAULT_CONF=$(< /usr/lib/ublinux/default)
    [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*SYSCONF=([^$|$'\n']+)[[:blank:]]*($|$'\n') ]] && SYSCONF=${BASH_REMATCH[2]} || SYSCONF="/etc/sysconf"
    [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*NUMLOCK=([^$|$'\n']+)[[:blank:]]*($|$'\n') ]] && NUMLOCK=${BASH_REMATCH[2]}

    SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
    SOURCE=${SYSCONF}/keyboard; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

    # Automatic detection PC/notebooks
    [[ -z ${NUMLOCK} ]] && { xinput list 2>/dev/null | grep -qi "touchpad" && NUMLOCK=no || NUMLOCK=yes; }
    [[ ${NUMLOCK} == @(yes|on|enable) ]] && numlockx on
    [[ ${NUMLOCK} == @(no|off|disable) ]] && numlockx off

    #Disable 2025-10-25
    #[[ ${RESETKBMODE} != @(no|disable) ]] && setxkbmap ${XKBLAYOUT} -model ${XKBMODEL} -option ${XKBOPTIONS}

    if [[ ${RESETKBMODE} != @("no"|"disable") && ! ${MKKBDFXORG} =~ @("no"|"disable"|"off") ]]; then
        if [[ ${XDG_SESSION_TYPE} == "x11" && -n ${DISPLAY} ]]; then
            if [[ -n ${XKBMODEL} ]]; then
                XKBMODEL=${XKBMODEL}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBMODEL[${LANG%%_*}]="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBMODEL=${BASH_REMATCH[2]}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBMODEL="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBMODEL=${BASH_REMATCH[2]}
            fi
            if [[ -n ${XKBLAYOUT} ]]; then
                XKBLAYOUT=${XKBLAYOUT}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBLAYOUT[${LANG%%_*}]="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBLAYOUT=${BASH_REMATCH[2]}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBLAYOUT="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBLAYOUT=${BASH_REMATCH[2]}
            fi
            if [[ -n ${XKBVARIANT} ]]; then
                XKBVARIANT=${XKBVARIANT}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBVARIANT[${LANG%%_*}]="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBVARIANT=${BASH_REMATCH[2]}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBVARIANT="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBVARIANT=${BASH_REMATCH[2]}
            fi
            if [[ -n ${XKBOPTIONS} ]]; then
                XKBOPTIONS=${XKBOPTIONS}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBOPTIONS[${LANG%%_*}]"=([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBOPTIONS=${BASH_REMATCH[2]}
            elif [[ ${DEFAULT_CONF} =~ (^|$'\n')[[:blank:]]*"XKBOPTIONS="([^$|$'\n']+)[[:blank:]]*($|$'\n') ]]; then
                XKBOPTIONS=${BASH_REMATCH[2]}
            fi
            if [[ -n ${XKBLAYOUT} && -n ${XKBMODEL} && -n ${XKBOPTIONS} ]]; then
                if [[ -n ${SUDO_USER}  || -n ${PKEXEC_UID} ]]; then
                # т.к. запуск возможет от sudo или pkexec, а приложения необходимо запустить пользователю, то выясняем реального пользователя и ему запускаем
        	    if [[ -n ${SUDO_USER} ]]; then
        		USER=${SUDO_USER}
            	    elif [[ -n ${PKEXEC_UID} ]]; then
	    		USER=$(getent passwd ${PKEXEC_UID} | cut -d: -f1)
    		    fi
                    #PKEXEC_ENV="env XDG_SESSION_DESKTOP=${XDG_SESSION_DESKTOP} XDG_CURRENT_DESKTOP=${XDG_CURRENT_DESKTOP} DESKTOP_SESSION=${DESKTOP_SESSION} DISPLAY=${DISPLAY} WAYLAND_DISPLAY=${WAYLAND_DISPLAY} XAUTHORITY=${XAUTHORITY} DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS} XDG_SESSION_TYPE=${XDG_SESSION_TYPE} XDG_RUNTIME_DIR='/run/user/$(id -u ${USER})' SESSION_MANAGER=${SESSION_MANAGER} GNOME_DESKTOP_SESSION_ID=${GNOME_DESKTOP_SESSION_ID} KDE_FULL_SESSION=${KDE_FULL_SESSION} HOME=${HOME}"
                    PKEXEC_ENV="env DISPLAY=${DISPLAY} WAYLAND_DISPLAY=${WAYLAND_DISPLAY}"
                    EXEC_STRING="setxkbmap ${XKBLAYOUT} ${XKBMODEL:+-model ${XKBMODEL}} ${XKBOPTIONS:+-option ${XKBOPTIONS}}"
                    su --login ${USER} --command "${PKEXEC_ENV} ${EXEC_STRING}"
                elif [[ -n ${XDG_SESSION_DESKTOP} && ${XDG_SESSION_TYPE} == "x11" ]]; then
                    setxkbmap ${XKBLAYOUT} ${XKBMODEL:+-model ${XKBMODEL}} ${XKBOPTIONS:+-option ${XKBOPTIONS}}
                fi
            fi
        fi
    fi
fi
