#!/bin/bash ############################################################# # Zenity interface for G203 (Prodigy & Ligthsync) driver # # Last change: 09-07-2021 # # Author: q3aql # # Contact: q3aql@protonmail.ch # # License: GPL v2.0 # ############################################################# VERSION="1.2" M_DATE="090721" # Variables iconPath="/usr/share/icons/logitech/logitech-black.png" imagesPath="/usr/share/icons/logitech/images" # Variables DPI & Polling rate numberDPI="" numberPolling="" # Function to check admin rights. function rootMessage() { mkdir -p /etc/root &> /dev/null administrador=$? if [ ${administrador} -eq 0 ] ; then rm -rf /etc/root else zenity --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --window-icon=${iconPath} --warning \ --width=340 --text "Administrator permissions are required" echo "" echo "* zenidrv-g203-lightsync ${VERSION} (${M_DATE}) (GPL v2.0)" echo "" echo "* Administrator permissions are required" echo "" exit fi } #Function to check ratbag dependence function checkRatbag(){ dependence="0" if [ -f "/usr/bin/ratbagctl" ] ; then dependence="1" elif [ -f "/bin/ratbagctl" ] ; then dependence="1" elif [ -f "/usr/local/bin/ratbagctl" ] ; then dependence="1" fi echo ${dependence} } # Show menu with options. showMenu=0 rootMessage while [ ${showMenu} -eq 0 ] ; do clear # Check dpi & polling rate to show in menu checkNumbers=$(checkRatbag) if [ "${checkNumbers}" == "1" ] ; then device_name=$(ratbagctl list | head -1 | cut -d ":" -f 1) get_rate=$(ratbagctl "$device_name" rate get) get_dpi=$(ratbagctl "$device_name" dpi get | cut -d "d" -f 1) numberDPI="(${get_dpi})" numberPolling="(${get_rate})" fi opcion=$(zenity --width=280 --height=415 --list --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" \ --window-icon=${iconPath} --imagelist --column "Icon" --column "Effect/Option" ${imagesPath}/solid.png "Solid" \ ${imagesPath}/cycle.png "Cycle" ${imagesPath}/breathe.png "Breathe" ${imagesPath}/wave.png "Wave" \ ${imagesPath}/blend.png "Blend" ${imagesPath}/intro-on.png "Intro (On)" ${imagesPath}/intro-off.png "Intro (Off)" \ ${imagesPath}/mouse-dpi.png "Set DPI ${numberDPI}" ${imagesPath}/light-off.png "Light off" ${imagesPath}/exit.png "Exit") if [ "${opcion}" == "${imagesPath}/solid.png" ] ; then color_selected=$(zenity --list --width=260 --height=570 --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" \ --window-icon=${iconPath} --imagelist --column "Color" --column "Name color" ${imagesPath}/custom.png Custom \ ${imagesPath}/white.png White ${imagesPath}/red.png Red ${imagesPath}/lime.png Lime ${imagesPath}/blue.png Blue \ ${imagesPath}/yellow.png Yellow ${imagesPath}/cyan.png Cyan ${imagesPath}/magenta.png Magenta \ ${imagesPath}/silver.png Silver ${imagesPath}/gray.png Gray ${imagesPath}/maroon.png Maroon \ ${imagesPath}/olive.png Olive ${imagesPath}/green.png Green ${imagesPath}/purple.png Purple ${imagesPath}/teal.png Teal \ ${imagesPath}/navy.png Navy) canceled=$? if [ ${canceled} -eq 0 ] ; then if [ "${color_selected}" == "${imagesPath}/custom.png" ] ; then custom_color=$(zenity --color-selection) # Crop numbers from rgb system first_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 1) second_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 2) third_value_prev=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 3) third_value=$(echo ${third_value_prev} | cut -d ")" -f 1) # Convert rgb numbers to hex first_hex=$(echo "obase=16; ${first_value}" | bc) second_hex=$(echo "obase=16; ${second_value}" | bc) third_hex=$(echo "obase=16; ${third_value}" | bc) # Apply number 0 after if have only one number if [ ${first_hex} == "0" ] ; then first_hex="00" elif [ ${first_hex} == "1" ] ; then first_hex="01" elif [ ${first_hex} == "2" ] ; then first_hex="02" elif [ ${first_hex} == "3" ] ; then first_hex="03" elif [ ${first_hex} == "4" ] ; then first_hex="04" elif [ ${first_hex} == "5" ] ; then first_hex="05" elif [ ${first_hex} == "6" ] ; then first_hex="06" elif [ ${first_hex} == "7" ] ; then first_hex="07" elif [ ${first_hex} == "8" ] ; then first_hex="08" elif [ ${first_hex} == "9" ] ; then first_hex="09" fi if [ ${second_hex} == "0" ] ; then second_hex="00" elif [ ${second_hex} == "1" ] ; then second_hex="01" elif [ ${second_hex} == "2" ] ; then second_hex="02" elif [ ${second_hex} == "3" ] ; then second_hex="03" elif [ ${second_hex} == "4" ] ; then second_hex="04" elif [ ${second_hex} == "5" ] ; then second_hex="05" elif [ ${second_hex} == "6" ] ; then second_hex="06" elif [ ${second_hex} == "7" ] ; then second_hex="07" elif [ ${second_hex} == "8" ] ; then second_hex="08" elif [ ${second_hex} == "9" ] ; then second_hex="09" fi if [ ${third_hex} == "0" ] ; then third_hex="00" elif [ ${third_hex} == "1" ] ; then third_hex="01" elif [ ${third_hex} == "2" ] ; then third_hex="02" elif [ ${third_hex} == "3" ] ; then third_hex="03" elif [ ${third_hex} == "4" ] ; then third_hex="04" elif [ ${third_hex} == "5" ] ; then third_hex="05" elif [ ${third_hex} == "6" ] ; then third_hex="06" elif [ ${third_hex} == "7" ] ; then third_hex="07" elif [ ${third_hex} == "8" ] ; then third_hex="08" elif [ ${third_hex} == "9" ] ; then third_hex="09" fi # Custom color in hex color_custom=$(echo ${first_hex}${second_hex}${third_hex}) color_apply="${color_custom}" elif [ "${color_selected}" == "${imagesPath}/white.png" ] ; then color_apply="FFFFFF" elif [ "${color_selected}" == "${imagesPath}/red.png" ] ; then color_apply="FF0000" elif [ "${color_selected}" == "${imagesPath}/lime.png" ] ; then color_apply="00FF00" elif [ "${color_selected}" == "${imagesPath}/blue.png" ] ; then color_apply="0000FF" elif [ "${color_selected}" == "${imagesPath}/yellow.png" ] ; then color_apply="FFFF00" elif [ "${color_selected}" == "${imagesPath}/cyan.png" ] ; then color_apply="00FFFF" elif [ "${color_selected}" == "${imagesPath}/magenta.png" ] ; then color_apply="FF00FF" elif [ "${color_selected}" == "${imagesPath}/silver.png" ] ; then color_apply="C0C0C0" elif [ "${color_selected}" == "${imagesPath}/gray.png" ] ; then color_apply="808080" elif [ "${color_selected}" == "${imagesPath}/maroon.png" ] ; then color_apply="800000" elif [ "${color_selected}" == "${imagesPath}/olive.png" ] ; then color_apply="808000" elif [ "${color_selected}" == "${imagesPath}/green.png" ] ; then color_apply="008000" elif [ "${color_selected}" == "${imagesPath}/purple.png" ] ; then color_apply="800080" elif [ "${color_selected}" == "${imagesPath}/teal.png" ] ; then color_apply="008080" elif [ "${color_selected}" == "${imagesPath}/navy.png" ] ; then color_apply="000080" fi if [ -z "${color_apply}" ] ; then color_apply="none" else sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Applying Solid effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync solid "${color_apply}" device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi color_apply="none" fi else color_apply="none" fi elif [ "${opcion}" == "${imagesPath}/cycle.png" ] ; then sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Applying Cycle effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync cycle device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi elif [ "${opcion}" == "${imagesPath}/breathe.png" ] ; then color_selected=$(zenity --list --width=260 --height=565 --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" \ --window-icon=${iconPath} --imagelist --column "Color" --column "Name color" ${imagesPath}/custom.png Custom \ ${imagesPath}/white.png White ${imagesPath}/red.png Red ${imagesPath}/lime.png Lime ${imagesPath}/blue.png Blue \ ${imagesPath}/yellow.png Yellow ${imagesPath}/cyan.png Cyan ${imagesPath}/magenta.png Magenta \ ${imagesPath}/silver.png Silver ${imagesPath}/gray.png Gray ${imagesPath}/maroon.png Maroon \ ${imagesPath}/olive.png Olive ${imagesPath}/green.png Green ${imagesPath}/purple.png Purple ${imagesPath}/teal.png Teal \ ${imagesPath}/navy.png Navy) canceled=$? if [ ${canceled} -eq 0 ] ; then if [ "${color_selected}" == "${imagesPath}/custom.png" ] ; then custom_color=$(zenity --color-selection) # Crop numbers from rgb system first_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 1) second_value=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 2) third_value_prev=$(echo ${custom_color} | cut -d "(" -f 2 | cut -d "," -f 3) third_value=$(echo ${third_value_prev} | cut -d ")" -f 1) # Convert rgb numbers to hex first_hex=$(echo "obase=16; ${first_value}" | bc) second_hex=$(echo "obase=16; ${second_value}" | bc) third_hex=$(echo "obase=16; ${third_value}" | bc) # Apply number 0 after if have only one number if [ ${first_hex} == "0" ] ; then first_hex="00" elif [ ${first_hex} == "1" ] ; then first_hex="01" elif [ ${first_hex} == "2" ] ; then first_hex="02" elif [ ${first_hex} == "3" ] ; then first_hex="03" elif [ ${first_hex} == "4" ] ; then first_hex="04" elif [ ${first_hex} == "5" ] ; then first_hex="05" elif [ ${first_hex} == "6" ] ; then first_hex="06" elif [ ${first_hex} == "7" ] ; then first_hex="07" elif [ ${first_hex} == "8" ] ; then first_hex="08" elif [ ${first_hex} == "9" ] ; then first_hex="09" fi if [ ${second_hex} == "0" ] ; then second_hex="00" elif [ ${second_hex} == "1" ] ; then second_hex="01" elif [ ${second_hex} == "2" ] ; then second_hex="02" elif [ ${second_hex} == "3" ] ; then second_hex="03" elif [ ${second_hex} == "4" ] ; then second_hex="04" elif [ ${second_hex} == "5" ] ; then second_hex="05" elif [ ${second_hex} == "6" ] ; then second_hex="06" elif [ ${second_hex} == "7" ] ; then second_hex="07" elif [ ${second_hex} == "8" ] ; then second_hex="08" elif [ ${second_hex} == "9" ] ; then second_hex="09" fi if [ ${third_hex} == "0" ] ; then third_hex="00" elif [ ${third_hex} == "1" ] ; then third_hex="01" elif [ ${third_hex} == "2" ] ; then third_hex="02" elif [ ${third_hex} == "3" ] ; then third_hex="03" elif [ ${third_hex} == "4" ] ; then third_hex="04" elif [ ${third_hex} == "5" ] ; then third_hex="05" elif [ ${third_hex} == "6" ] ; then third_hex="06" elif [ ${third_hex} == "7" ] ; then third_hex="07" elif [ ${third_hex} == "8" ] ; then third_hex="08" elif [ ${third_hex} == "9" ] ; then third_hex="09" fi # Custom color in hex color_custom=$(echo ${first_hex}${second_hex}${third_hex}) color_apply="${color_custom}" elif [ "${color_selected}" == "${imagesPath}/white.png" ] ; then color_apply="FFFFFF" elif [ "${color_selected}" == "${imagesPath}/red.png" ] ; then color_apply="FF0000" elif [ "${color_selected}" == "${imagesPath}/lime.png" ] ; then color_apply="00FF00" elif [ "${color_selected}" == "${imagesPath}/blue.png" ] ; then color_apply="0000FF" elif [ "${color_selected}" == "${imagesPath}/yellow.png" ] ; then color_apply="FFFF00" elif [ "${color_selected}" == "${imagesPath}/cyan.png" ] ; then color_apply="00FFFF" elif [ "${color_selected}" == "${imagesPath}/magenta.png" ] ; then color_apply="FF00FF" elif [ "${color_selected}" == "${imagesPath}/silver.png" ] ; then color_apply="C0C0C0" elif [ "${color_selected}" == "${imagesPath}/gray.png" ] ; then color_apply="808080" elif [ "${color_selected}" == "${imagesPath}/maroon.png" ] ; then color_apply="800000" elif [ "${color_selected}" == "${imagesPath}/olive.png" ] ; then color_apply="808000" elif [ "${color_selected}" == "${imagesPath}/green.png" ] ; then color_apply="008000" elif [ "${color_selected}" == "${imagesPath}/purple.png" ] ; then color_apply="800080" elif [ "${color_selected}" == "${imagesPath}/teal.png" ] ; then color_apply="008080" elif [ "${color_selected}" == "${imagesPath}/navy.png" ] ; then color_apply="000080" fi if [ -z "${color_apply}" ] ; then color_apply="none" else sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Applying Breathe effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync breathe "${color_apply}" device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi color_apply="none" fi else color_apply="none" fi elif [ "${opcion}" == "${imagesPath}/wave.png" ] ; then sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Applying Wave effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync wave device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi elif [ "${opcion}" == "${imagesPath}/blend.png" ] ; then sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Applying Blend effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync blend device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi elif [ "${opcion}" == "${imagesPath}/intro-on.png" ] ; then sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Enabling startup effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync intro on device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi elif [ "${opcion}" == "${imagesPath}/intro-off.png" ] ; then sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Disabling startup effect" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync intro off device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi elif [ "${opcion}" == "${imagesPath}/mouse-dpi.png" ] ; then dpi_number=$(zenity --entry --title "Set DPI (from 50 to 8000)" --window-icon=${iconPath} --text "Enter DPI number (from 50 to 8000):" --entry-text "800") if [ -z ${dpi_number} ] ; then echo > /dev/null else sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Setting DPI to ${dpi_number}" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync dpi ${dpi_number} device_error=$? if [ ${device_error} -eq 0 ] ; then checkNumbers=$(checkRatbag) if [ "${checkNumbers}" == "1" ] ; then device_name=$(ratbagctl list | head -1 | cut -d ":" -f 1) ratbagctl "$device_name" dpi set "${dpi_number}" fi else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi fi elif [ "${opcion}" == "${imagesPath}/light-off.png" ] ; then sleep 2 | zenity --progress --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --text "Turning off the light on the mouse" \ --window-icon=${iconPath} --pulsate --no-cancel --auto-close g203-led.py lightsync breathe 000000 1000 0 device_error=$? if [ ${device_error} -eq 0 ] ; then echo > /dev/null else zenity --title "zenidrv-g203-lightsync ${VERSION} ($M_DATE)" --error --window-icon=${iconPath} --width=280 \ --text "Device not found or connected" fi elif [ "${opcion}" == "${imagesPath}/exit.png" ] ; then showMenu=1 else zenity --title "zenidrv-g203-lightsync ${VERSION} (${M_DATE})" --window-icon=${iconPath} --warning \ --width=300 --text "Choose one of the menu options" fi done