diff --git a/winehelper b/winehelper index a63ea66..baca0dc 100755 --- a/winehelper +++ b/winehelper @@ -494,23 +494,47 @@ EOF } remove_desktop () { - if [[ -n "$1" ]] ; then - try_remove_file "$USER_WORK_PATH/$1.desktop" - try_remove_file "$WH_MENU_DIR/$1.desktop" - try_remove_file "$HOME/.local/share/applications/$1.desktop" - try_remove_file "$(xdg-user-dir DESKTOP)/$1.desktop" + local desktop_display_name="$*" # Объединяем все аргументы в одну строку + local desktop_filename="" + + if [[ -n "$desktop_display_name" ]] ; then + # Ищем файл ярлыка по его отображаемому имени (полю Name=) + for file in "$WH_MENU_DIR"/*.desktop; do + if [[ -f "$file" ]] && grep -q -E "^Name=${desktop_display_name}$" "$file"; then + desktop_filename=$(basename "$file" .desktop) + break + fi + done + + if [[ -z "$desktop_filename" ]]; then + print_error "Ярлык с именем \"$desktop_display_name\" не найден." + return 1 + fi + + print_info "Найден ярлык: $desktop_filename.desktop. Удаление..." + # Используем найденное имя файла для удаления из всех мест + try_remove_file "$USER_WORK_PATH/$desktop_filename.desktop" + try_remove_file "$WH_MENU_DIR/$desktop_filename.desktop" + try_remove_file "$HOME/.local/share/applications/$desktop_filename.desktop" + try_remove_file "$(xdg-user-dir DESKTOP)/$desktop_filename.desktop" + else + print_error "Не указано имя ярлыка для удаления." + return 1 fi # Удаляем категорию если она пуста if [[ -d "$WH_MENU_DIR" ]] && [[ -z "$(ls -A "$WH_MENU_DIR")" ]]; then + print_info "Категория WineHelper пуста, удаляем ее из меню." try_remove_dir "$WH_MENU_DIR" try_remove_file "$WH_MENU_CATEGORY" try_remove_file "$WH_MENU_CONFIG" fi # Обновляем кэш desktop файлов + print_info "Обновление базы данных приложений..." update-desktop-database "$HOME/.local/share/applications" + print_ok "Удаление ярлыка \"$desktop_display_name\" завершено." } check_installed_programs () { @@ -1264,19 +1288,22 @@ remove_prefix() { fi fi - if try_remove_dir "$WINEPREFIX" ; then - print_ok "Префикс "$PREFIX_NAME" успешно удален." + if try_remove_dir "$WINEPREFIX"; then + print_ok "Префикс \"$PREFIX_NAME\" успешно удален." + # Ищем и удаляем все ярлыки, связанные с этим префиксом for desktop_file in "$WH_MENU_DIR"/*.desktop; do if grep -q "$WINEPREFIX" "$desktop_file"; then + # Получаем имя файла ярлыка desktop_name=$(basename "$desktop_file") + # Удаляем ярлык без расширения remove_desktop "${desktop_name%.*}" fi done return 0 else - print_error "Не удалось удалить префикс "$PREFIX_NAME"." + print_error "Не удалось удалить префикс \"$PREFIX_NAME\"." return 1 fi } @@ -1495,6 +1522,39 @@ restore_prefix() { return 0 } +restore_shortcuts() { + export WINEPREFIX="$1" + check_prefix_var + + if [[ ! -f "$WINEPREFIX/desktop.list" ]]; then + fatal "Файл desktop.list не найден в префиксе $PREFIX_NAME. Нечего восстанавливать." + fi + + print_info "Восстановление ярлыков для префикса $PREFIX_NAME..." + export RESTORE_FROM_BACKUP="1" # Используем флаг, чтобы create_desktop не обновлял desktop.list + + while IFS= read -r line; do + # Пропускаем пустые строки + [[ -z "$line" ]] && continue + + local name_desktop + local exe_path + local icon_name + name_desktop=$(echo "$line" | cut -d'=' -f1) + exe_path=$(echo "$line" | cut -d'=' -f2) + icon_name=$(echo "$line" | cut -d'=' -f3) + + local full_exe_path="$WINEPREFIX${exe_path}" + local full_icon_path="$WINEPREFIX/icons/$icon_name" + + print_info "Восстановление ярлыка для '$name_desktop'" + create_desktop "$name_desktop" "$full_exe_path" "$full_icon_path" + done < "$WINEPREFIX/desktop.list" + + unset RESTORE_FROM_BACKUP + print_ok "Восстановление ярлыков для префикса $PREFIX_NAME завершено." +} + wh_info () { echo "Использование: $SCRIPT_NAME [команда] @@ -1508,6 +1568,8 @@ wh_info () { remove-all удалить WineHelper и все связанные данные remove-prefix [имя_префикса] удалить префикс и все связанные данные backup-prefix [имя_префикса] создать резерную копию префикса + remove-desktop [имя_ярлыка] удалить ярлык по имени (без .desktop) + restore-shortcuts [имя_префикса] восстановить все ярлыки для префикса restore-prefix \"путь/до/whpack\" восстановить префикс из резервной копии Параметры: @@ -1551,7 +1613,9 @@ case "$arg1" in run|-r) run_installed_programs "$1" ;; backup-prefix) backup_prefix "$@" ;; restore-prefix) restore_prefix "$@" ;; + restore-shortcuts) restore_shortcuts "$@" ;; remove-all) remove_winehelper "$@" ;; + remove-desktop) remove_desktop "$@" ;; remove-prefix) remove_prefix "$@" ;; *) if [[ -f "$arg1" ]] ; then