Skip to content

Instantly share code, notes, and snippets.

@Langerz82
Created February 26, 2026 11:10
Show Gist options
  • Select an option

  • Save Langerz82/3addd98155e057e396250205961a2e3f to your computer and use it in GitHub Desktop.

Select an option

Save Langerz82/3addd98155e057e396250205961a2e3f to your computer and use it in GitHub Desktop.
EE - set_dolphin_joy.sh - 4.9
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2020-present Shanti Gilbert (https://github.com/shantigilbert)
# Source predefined functions and variables
. /etc/profile
# Configure ADVMAME players based on ES settings
CONFIG_DIR="/storage/.config/emuelec/configs/dolphin-emu"
CONFIG=${CONFIG_DIR}/GCPadNew.ini
WII_CONFIG=${CONFIG_DIR}/WiimoteNew.ini
MAIN_CONFIG=${CONFIG_DIR}/Dolphin.ini
CONFIG_TMP=/tmp/jc/GCPadNew.tmp
WII_CONFIG_TMP=/tmp/jc/WiimoteNew.tmp
source joy_common.sh "dolphin"
BTN_H0=$(get_ee_setting dolphin_btn_h0)
[[ -z "${BTN_H0}" ]] && BTN_H0=6
H0_AXIS1=$(( BTN_H0+0 ))
H0_AXIS2=$(( BTN_H0+1 ))
declare -A GC_DOLPHIN_VALUES=(
[h0.1]="Hat 0 N"
[h0.4]="Hat 0 S"
[h0.8]="Hat 0 W"
[h0.2]="Hat 0 E"
[b0]="Button 0"
[b1]="Button 1"
[b2]="Button 2"
[b3]="Button 3"
[b4]="Button 4"
[b5]="Button 5"
[b6]="Button 6"
[b7]="Button 7"
[b8]="Button 8"
[b9]="Button 9"
[b10]="Button 10"
[b11]="Button 11"
[b12]="Button 12"
[b13]="Button 13"
[b14]="Button 14"
[b15]="Button 15"
[b16]="Button 16"
)
declare -A GC_DOLPHIN_BUTTONS=(
[dpleft]="D-Pad/Left"
[dpright]="D-Pad/Right"
[dpup]="D-Pad/Up"
[dpdown]="D-Pad/Down"
[x]="Buttons/Y"
[y]="Buttons/X"
[a]="Buttons/B"
[b]="Buttons/A"
[lefttrigger]="Triggers/L"
[righttrigger]="Triggers/R"
[start]="Buttons/Start"
[rightshoulder]="Buttons/Z"
[guide]="Buttons/Hotkey"
)
declare -A WII_DOLPHIN_BUTTONS=(
[dpleft]="D-Pad/Left"
[dpright]="D-Pad/Right"
[dpup]="D-Pad/Up"
[dpdown]="D-Pad/Down"
[x]="Buttons/Y"
[y]="Buttons/X"
[a]="Buttons/B"
[b]="Buttons/A"
[leftshoulder]="Triggers/L"
[rightshoulder]="Triggers/R"
[back]="Buttons/-"
[start]="Buttons/+"
[lefttrigger]="Buttons/L-Analog"
[righttrigger]="Buttons/R-Analog"
[guide]="Buttons/Home"
[leftstick]="Buttons/ZL"
[rightstick]="Buttons/ZR"
)
BTN_SWAP_XY=$(get_ee_setting dolphin_joy_swap_xy)
if [[ "${BTN_SWAP_XY}" == "1" ]]; then
GC_DOLPHIN_BUTTONS[x]="Buttons/X"
GC_DOLPHIN_BUTTONS[y]="Buttons/Y"
fi
BTN_SWAP_AB=$(get_ee_setting dolphin_joy_swap_ab)
if [[ "${BTN_SWAP_AB}" == "1" ]]; then
GC_DOLPHIN_BUTTONS[a]="Buttons/A"
GC_DOLPHIN_BUTTONS[b]="Buttons/B"
fi
declare -A WII_DOLPHIN_STICKS=(
["leftx,0"]="Left Stick/Left"
["leftx,1"]="Left Stick/Right"
["lefty,0"]="Left Stick/Up"
["lefty,1"]="Left Stick/Down"
["rightx,0"]="Right Stick/Left"
["rightx,1"]="Right Stick/Right"
["righty,0"]="Right Stick/Up"
["righty,1"]="Right Stick/Down"
)
declare -A GC_DOLPHIN_STICKS=(
["leftx,0"]="Main Stick/Left"
["leftx,1"]="Main Stick/Right"
["lefty,0"]="Main Stick/Up"
["lefty,1"]="Main Stick/Down"
["rightx,0"]="C-Stick/Left"
["rightx,1"]="C-Stick/Right"
["righty,0"]="C-Stick/Up"
["righty,1"]="C-Stick/Down"
)
# Declare an associative array to store ID counts
declare -A id_counts=()
# Function to add or increment an ID
add_or_increment_id() {
local id=$1
# Check if the ID already exists as a key in the associative array
if [[ -v id_counts["${id}"] ]]; then
# If present, increment its value (count)
(( id_counts["${id}"]++ ))
else
# If not present, add it to the array and set the count to 1
id_counts["$id"]=0
fi
}
# Cleans all the inputs for the gamepad with name ${GAMEPAD} and player ${1}
clean_pad() {
declare -a params=(".*Stick\/Modifier\/Range" ".*Stick\/Dead\ Zone")
jc_wipe_config_sub_heading "${CONFIG}" "[GCPad${1}]" "${CONFIG_TMP}" "${params[@]}"
jc_wipe_config_sub_heading "${WII_CONFIG}" "[Wiimote${1}]" "${WII_CONFIG_TMP}"
echo "[Wiimote${1}]" >> ${WII_CONFIG}
echo "Source = 0" >> ${WII_CONFIG}
}
# Sets pad depending on parameters.
# ${1} = Player Number
# ${2} = js[0-7]
# ${3} = Device GUID
# ${4} = Device Name
set_pad() {
local DEVICE_GUID=${3}
local JOY_NAME="${4}"
echo "DEVICE_GUID=${DEVICE_GUID}"
local GC_CONFIG="${5}"
echo "GC_CONFIG=${GC_CONFIG}"
[[ -z ${GC_CONFIG} ]] && return
sed -i "/\[Wiimote${1}\]/,+1 d" ${WII_CONFIG}
local GC_MAP=$(echo ${GC_CONFIG} | cut -d',' -f3-)
echo "[GCPad${1}]" >> ${CONFIG}
add_or_increment_id "${JOY_NAME}"
local JOY_INDEX=${id_counts[${JOY_NAME}]}
echo "Device = evdev/${JOY_INDEX}/${JOY_NAME}" >> ${CONFIG}
echo "[Wiimote${1}]" >> ${WII_CONFIG}
echo "Device = evdev/${JOY_INDEX}/${JOY_NAME}" >> ${WII_CONFIG}
echo "Extension = Classic" >> ${WII_CONFIG}
echo "Source = 1" >> ${WII_CONFIG}
set -f
local GC_ARRAY=(${GC_MAP//,/ })
for index in "${!GC_ARRAY[@]}"
do
local REC=${GC_ARRAY[${index}]}
local BUTTON_INDEX=$(echo ${REC} | cut -d ":" -f 1)
local TVAL=$(echo ${REC} | cut -d ":" -f 2)
local BUTTON_VAL=${TVAL:1}
local BTN_TYPE=${TVAL:0:1}
local VAL="${GC_DOLPHIN_VALUES[${TVAL}]}"
# CREATE BUTTON MAPS (inlcuding hats).
local GC_INDEX="${GC_DOLPHIN_BUTTONS[${BUTTON_INDEX}]}"
if [[ ! -z "${GC_INDEX}" ]]; then
if [[ "${BTN_TYPE}" == "b" || "${BTN_TYPE}" == "h" ]]; then
[[ ! -z "${VAL}" ]] && echo "${GC_INDEX} = \`${VAL}\`" >> ${CONFIG_TMP}
fi
if [[ "${BTN_TYPE}" == "a" ]]; then
echo "${GC_INDEX} = \`Axis ${BUTTON_VAL}+\`" >> ${CONFIG_TMP}
fi
fi
# Wii CREATE BUTTON MAPS (inlcuding hats).
local WII_INDEX="${WII_DOLPHIN_BUTTONS[${BUTTON_INDEX}]}"
if [[ ! -z "${WII_INDEX}" ]]; then
if [[ "${BTN_TYPE}" == "b" || "${BTN_TYPE}" == "h" ]]; then
[[ ! -z "${VAL}" ]] && echo "Classic/${WII_INDEX} = \`${VAL}\`" >> ${WII_CONFIG_TMP}
fi
if [[ "${BTN_TYPE}" == "a" ]]; then
echo "Classic/${WII_INDEX} = \`Axis ${BUTTON_VAL}-+\`" >> ${WII_CONFIG_TMP}
fi
fi
# Create Axis Maps
case ${BUTTON_INDEX} in
leftx|lefty|rightx|righty)
GC_INDEX="${GC_DOLPHIN_STICKS[${BUTTON_INDEX},0]}"
echo "${GC_INDEX} = \`Axis ${BUTTON_VAL}-\`" >> ${CONFIG_TMP}
GC_INDEX="${GC_DOLPHIN_STICKS[${BUTTON_INDEX},1]}"
echo "${GC_INDEX} = \`Axis ${BUTTON_VAL}+\`" >> ${CONFIG_TMP}
;;
esac
# Wii Create Axis Maps
case ${BUTTON_INDEX} in
leftx|lefty|rightx|righty)
WII_INDEX="${WII_DOLPHIN_STICKS[${BUTTON_INDEX},0]}"
echo "Classic/${WII_INDEX} = \`Axis ${BUTTON_VAL}-\`" >> ${WII_CONFIG_TMP}
WII_INDEX="${WII_DOLPHIN_STICKS[${BUTTON_INDEX},1]}"
echo "Classic/${WII_INDEX} = \`Axis ${BUTTON_VAL}+\`" >> ${WII_CONFIG_TMP}
;;
esac
done
local JOYSTICK="Main Stick"
local GC_RECORD
GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier *= *(.*)$")
[[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier = Shift_L" >> ${CONFIG_TMP}
GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier/Range *= *(.*)$")
[[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier/Range = 50.000000000000000" >> ${CONFIG_TMP}
GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Dead Zone *= *(.*)$")
[[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Dead Zone = 25.000000000000000" >> ${CONFIG_TMP}
JOYSTICK="C-Stick"
GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier *= *(.*)$")
[[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier = Control_L" >> ${CONFIG_TMP}
GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Modifier/Range *= *(.*)$")
[[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Modifier/Range = 50.000000000000000" >> ${CONFIG_TMP}
GC_RECORD=$(cat ${CONFIG_TMP} | grep -E "^${JOYSTICK}/Dead Zone *= *(.*)$")
[[ -z "${GC_RECORD}" ]] && echo "${JOYSTICK}/Dead Zone = 25.000000000000000" >> ${CONFIG_TMP}
cat "${CONFIG_TMP}" | sort >> ${CONFIG}
rm "${CONFIG_TMP}"
cat "${WII_CONFIG_TMP}" | sort >> ${WII_CONFIG}
rm "${WII_CONFIG_TMP}"
}
init_config() {
local SIDevices=$( cat "${MAIN_CONFIG}" | grep -E "^SIDevice[0-9] *= *[^6]$")
[[ -z "${SIDevices}" ]] && return
declare -i LN=$( cat "${MAIN_CONFIG}" | grep -n -E "SIDevice[0-9] *= *[0-9]" | cut -d: -f1 | head -1 )
[[ "${LN}" == "0" ]] && LN=$( cat "${MAIN_CONFIG}" | grep -n "\[Core\]" | cut -d: -f1 | head -1 )
if [ ${LN} -ne 0 ]; then
sed -i '/SIDevice[0-9] *\= *[0-9]/d' "${MAIN_CONFIG}"
sed -i "${LN} i SIDevice0=6\nSIDevice1=6\nSIDevice2=6\nSIDevice3=6" "${MAIN_CONFIG}"
fi
}
init_config
jc_get_players
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment