diff --git a/data_from_portwine/scripts/functions_helper b/data_from_portwine/scripts/functions_helper index e5c32b44..52503782 100755 --- a/data_from_portwine/scripts/functions_helper +++ b/data_from_portwine/scripts/functions_helper @@ -975,10 +975,25 @@ debug_timer () { fi } +fix_icon_name_png () { + if [[ $1 =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_OLD=$1 + local ICON_NAME_NEW=$ICON_NAME_OLD + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + ICON_NAME_NEW="${ICON_NAME_NEW//$i/}" + done + sed -i "s|Icon=$ICON_NAME_OLD|Icon=$ICON_NAME_NEW|" "$2" + return 0 + else + return 1 + fi +} + # Поиск нужного .desktop файла по $portwine_exe (для показа в комментариях нужного времени) # Параллельное создание базы по времени после завершения приложения search_desktop_file () { - local desktop_file desktop_file_new line1 line2 FILE_SHA256SUM_ARRAY EXEC_DESKTOP BROKEN_LINE FILE_SHA256SUM_FOUND FILE_SHA256SUM_NOT_FOUND + local desktop_file desktop_file_new line1 line2 FILE_SHA256SUM_ARRAY EXEC_DESKTOP ICON_NAME BROKEN_LINE FILE_SHA256SUM_FOUND FILE_SHA256SUM_NOT_FOUND if [[ -z $FILE_SHA256SUM ]] ; then read -r -a FILE_SHA256SUM_ARRAY < <(sha256sum "$portwine_exe") FILE_SHA256SUM=${FILE_SHA256SUM_ARRAY[0]} @@ -996,7 +1011,9 @@ search_desktop_file () { EXEC_DESKTOP=${line1//Exec=env \"$PORT_SCRIPTS_PATH\/start.sh\" /} fi fi + [[ $line1 =~ ^Icon= ]] && ICON_NAME=${line1//Icon=/} done < "$desktop_file" + fix_icon_name_png "$ICON_NAME" "$desktop_file" if [[ $portwine_exe == "${EXEC_DESKTOP//\"/}" ]] ; then DESKTOP_CORRECT_FILE="$desktop_file" break @@ -2986,9 +3003,15 @@ pw_create_gui_png () { edit_db_from_gui PORTPROTON_NAME FILE_DESCRIPTION fi - resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128" + resize_png "$portwine_exe" "${PORTPROTON_NAME}" "48" "128" PORTPROTON_NAME_PNG="${PORTPROTON_NAME// /_}" + if [[ $PORTPROTON_NAME_PNG =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + PORTPROTON_NAME_PNG="${PORTPROTON_NAME_PNG//$i/}" + done + fi if [[ -z "${PW_ICON_FOR_YAD}" ]] ; then if [[ -n "$(file "${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png" | grep "${PW_RESIZE_TO} x ${PW_RESIZE_TO}")" ]] ; then export PW_ICON_FOR_YAD="${PORT_WINE_PATH}/data/img/${PORTPROTON_NAME_PNG}.png" @@ -6078,35 +6101,49 @@ resize_png () { print_error "no argument specified for resize_png" return 1 else - local RESIZE_FILE="$1" - local RESIZE_NAME_PNG="${2// /_}" - local RESIZE_TO="$3" + local RESIZE_FILE RESIZE_NAME_PNG resize_to resize_to_helper + RESIZE_FILE="$1" + RESIZE_NAME_PNG="${2// /_}" fi - if [[ -f "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" ]] \ - || [[ ! -f "${RESIZE_FILE}" ]] \ - || [[ ! ${RESIZE_FILE,,} =~ .exe$ ]] - then - return 0 - fi - try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png" - try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png" - - if check_flatpak ; then - if ! timeout 3 \ - exe-thumbnailer --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" \ - && [[ "$ALPINE_FP" != "1" ]] - then - print_error "exe-thumbnailer - broken!" + for resize_to in "${@:3}" ; do + if [[ $resize_to == 128 ]] + then resize_to_helper="" + else resize_to_helper="_$resize_to" fi - else - print_warning "use portable exe-thumbnailer" - env PYTHONPATH="${PW_PLUGINS_PATH}/portable/lib/python3.9/site-packages/" \ - LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" \ - "${PW_WINELIB}/runtime/files/bin/python3.9" \ - "${PW_PLUGINS_PATH}/portable/bin/exe-thumbnailer" --force-resize -s "$RESIZE_TO" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}.png" - fi - return 0 + + if [[ $RESIZE_NAME_PNG =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + RESIZE_NAME_PNG="${RESIZE_NAME_PNG//$i/}" + done + fi + + if [[ -f "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}${resize_to_helper}.png" ]] \ + || [[ ! -f "${RESIZE_FILE}" ]] \ + || [[ ! ${RESIZE_FILE,,} =~ .exe$ ]] + then + return 0 + fi + + try_remove_file "${PORT_WINE_PATH}/data/img/launcher.png" + try_remove_file "${PORT_WINE_PATH}/data/img/Launcher.png" + + if check_flatpak ; then + if ! timeout 3 \ + exe-thumbnailer --force-resize -s "$resize_to" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}${resize_to_helper}.png" \ + && [[ "$ALPINE_FP" != "1" ]] + then + print_error "exe-thumbnailer - broken!" + fi + else + print_warning "use portable exe-thumbnailer" + env PYTHONPATH="${PW_PLUGINS_PATH}/portable/lib/python3.9/site-packages/" \ + LD_LIBRARY_PATH="${PW_PLUGINS_PATH}/portable/lib/lib64" \ + "${PW_WINELIB}/runtime/files/bin/python3.9" \ + "${PW_PLUGINS_PATH}/portable/bin/exe-thumbnailer" --force-resize -s "$resize_to" "$(readlink -f "${RESIZE_FILE}")" "${PORT_WINE_PATH}/data/img/${RESIZE_NAME_PNG}${resize_to_helper}.png" + fi + done } # GUI CREATE SHORTCUT @@ -6126,6 +6163,12 @@ portwine_create_shortcut () { export name_desktop="$PW_NAME_DESKTOP_PROXY" [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}" + if [[ $name_desktop_png =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + name_desktop_png="${name_desktop_png//$i/}" + done + fi OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \ --gui-type="settings-shortcut" \ @@ -6291,7 +6334,7 @@ pw_auto_create_shortcut () { print_info "Created link for: $link_name" PORTPROTON_NAME="$link_name" export portwine_exe="$exe_path" - resize_png "$portwine_exe" "${PORTPROTON_NAME}" "128" + resize_png "$portwine_exe" "${PORTPROTON_NAME}" "48" "128" export PW_NO_RESTART_PPDB=1 portwine_create_shortcut fi @@ -6331,6 +6374,12 @@ portwine_change_shortcut () { pw_create_gui_png [[ -z "${name_desktop_png}" ]] && name_desktop_png="${PORTPROTON_NAME// /_}" + if [[ $name_desktop_png =~ [\!\%\$\&\<] ]] ; then + local ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + name_desktop_png="${name_desktop_png//$i/}" + done + fi OUTPUT=$("${pw_yad}" --title="${translations[Choices]}" --form \ --gui-type="settings-shortcut" \ diff --git a/data_from_portwine/scripts/start.sh b/data_from_portwine/scripts/start.sh index 1d55a7bb..c134875d 100755 --- a/data_from_portwine/scripts/start.sh +++ b/data_from_portwine/scripts/start.sh @@ -645,6 +645,12 @@ else fi [[ $line1 =~ ^Icon= ]] && PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]=${line1//Icon=/} done < "$desktop_file" + if fix_icon_name_png "${PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]}" "$desktop_file" ; then + ICON_NAME_REGEX=(\! % \$ \& \<) + for i in "${ICON_NAME_REGEX[@]}" ; do + PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]="${PW_ICON_PATH["$AMOUNT_GENERATE_BUTTONS"]//$i/}" + done + fi PW_ALL_DF["$AMOUNT_GENERATE_BUTTONS"]="$desktop_file_new" # Для конвертации существующих .desktop файлов flatpak в натив и наоборот if [[ ${PW_NAME_D_ICON["$AMOUNT_GENERATE_BUTTONS"]} =~ ^"Exec=flatpak run ru.linux_gaming.PortProton " ]] ; then @@ -702,20 +708,6 @@ else for dp in "${PW_AMOUNT_NEW_DESKTOP[@]}" "${PW_AMOUNT_OLD_DESKTOP[@]}" ; do PW_DESKTOP_FILES="${PW_ALL_DF[$dp]}" PW_DESKTOP_FILES_SHOW="$PW_DESKTOP_FILES" - PW_ICON_PATH[dp]=${PW_ICON_PATH[dp]%.png} - PW_NAME_D_ICON_NEW="${PW_NAME_D_ICON[dp]//\"/}" - - PW_NAME_D_ICON_128="${PW_ICON_PATH[dp]}" - resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_128//"${PORT_WINE_PATH}/data/img/"/}" "128" - if [[ $PW_DESKTOP_FILES =~ [\!\%\$\&\<] || ${PW_ICON_PATH[dp]} =~ [\!\%\$\&\<] ]] ; then - PW_DESKTOP_FILES_SHOW_REGEX=(\! % \$ \& \<) - for i in "${PW_DESKTOP_FILES_SHOW_REGEX[@]}" ; do - PW_DESKTOP_FILES_SHOW="${PW_DESKTOP_FILES_SHOW//$i/}" - PW_ICON_PATH[dp]="${PW_ICON_PATH[dp]//$i/}" - done - fi - PW_NAME_D_ICON_48="${PW_ICON_PATH[dp]}_48" - resize_png "$PW_NAME_D_ICON_NEW" "${PW_NAME_D_ICON_48//"${PORT_WINE_PATH}/data/img/"/}" "48" if [[ $PW_DESKTOP_FILES =~ [\(\)\!\$\%\&\`\'\"\>\<\\\|\;] ]] ; then PW_DESKTOP_FILES_REGEX=(\( \) \! \$ % \& \` \' \" \> \< \\ \| \;) @@ -726,7 +718,19 @@ else done fi - PW_GENERATE_BUTTONS+="--field= $(print_wrapped "${PW_DESKTOP_FILES_SHOW//".desktop"/""}" "25" "...")!${PW_NAME_D_ICON_48}.png!:FBTNR%@bash -c \"button_click --desktop "${PW_DESKTOP_FILES// /#@_@#}"\"%" + if [[ $PW_DESKTOP_FILES_SHOW =~ [\!\%\$\&\<] ]] ; then + PW_DESKTOP_FILES_SHOW_REGEX=(\! % \$ \& \<) + for i in "${PW_DESKTOP_FILES_SHOW_REGEX[@]}" ; do + PW_DESKTOP_FILES_SHOW="${PW_DESKTOP_FILES_SHOW//$i/}" + done + fi + + PW_ICON_PATH[dp]=${PW_ICON_PATH[dp]%.png} + PW_NAME_D_ICON_NEW="${PW_NAME_D_ICON[dp]//\"/}" + + resize_png "$PW_NAME_D_ICON_NEW" "${PW_ICON_PATH[dp]//"${PORT_WINE_PATH}/data/img/"/}" "48" "128" + + PW_GENERATE_BUTTONS+="--field= $(print_wrapped "${PW_DESKTOP_FILES_SHOW//".desktop"/""}" "25" "...")!${PW_ICON_PATH[dp]}_48.png!:FBTNR%@bash -c \"button_click --desktop "${PW_DESKTOP_FILES// /#@_@#}"\"%" done if [[ $AMOUNT_GENERATE_BUTTONS == 1 ]] ; then