added a button to create a program shortcut

the function of extracting an icon from an exe file is combined with the creation of a desktop file
added the function of automatic prefix detection if it is not specified
This commit is contained in:
Sergey Palcheh
2025-09-02 16:23:39 +06:00
parent 92a682ba8a
commit ab0e23952e
2 changed files with 254 additions and 79 deletions

View File

@@ -509,63 +509,29 @@ var_ld_library_path_update () {
return 0
}
extract_icon() {
check_prefix_var
local exe_file="$1"
local ico_name="$(basename "$exe_file" .exe).ico"
local png_name="$(basename "$exe_file" .exe).png"
local tmp_ico_dir="$WH_TMP_DIR/icons"
local user_icons="$WINEPREFIX/icons"
create_new_dir "$tmp_ico_dir"
if ! wrestool -x -t 14 "$exe_file" -o "$tmp_ico_dir/$ico_name" ; then
print_warning "Не удалось извлечь иконку из $exe_file"
try_remove_file "$tmp_ico_dir"
return 1
fi
if ! icotool -x -i 1 "$tmp_ico_dir/$ico_name" -o "$tmp_ico_dir/$png_name" ; then
print_warning "Не удалось извлечь иконку из $ico_name"
try_remove_file "$tmp_ico_dir"
return 1
fi
create_new_dir "$user_icons"
if ! try_copy_file "$tmp_ico_dir/$png_name" "$user_icons" ; then
print_warning "Не удалось копировать иконку в префикс"
try_remove_file "$user_icons"
return 1
fi
try_remove_dir "$tmp_ico_dir"
print_ok "Иконка сохранена: $user_icons/$png_name"
return 0
}
create_desktop () {
local name_desktop exe_file desktop_filename icon_file desktop_path
local name_desktop exe_file desktop_filename icon_file desktop_path icon_arg desktop_filename_arg
name_desktop="$1"
exe_file="$2"
if [[ -n $4 ]] && [[ $4 != "nocopy" ]];
then desktop_filename="$4"
else desktop_filename="$(basename "$exe_file" .exe | sed "s| |_|")"
fi
if [[ "$RESTORE_FROM_BACKUP" == "1" ]] && [[ -f "$3" ]]
then icon_file="$3"
elif [[ -f "$WH_IMAGE_PATH/$3.png" ]]
then icon_file="$WH_IMAGE_PATH/$3.png"
else icon_file="wine"
icon_arg="$3"
desktop_filename_arg="$4"
# Определяем имя desktop-файла
if [[ -n "$desktop_filename_arg" ]] && [[ "$desktop_filename_arg" != "nocopy" ]]; then
desktop_filename="$desktop_filename_arg"
else
desktop_filename="$(basename "$exe_file" .exe | sed "s| |_|g")"
fi
# Проверяем обязательные аргументы и наличие exe-файла
if [[ -z "$name_desktop" ]] || [[ -z "$exe_file" ]] ; then
fatal "Used: $SCRIPT_NAME --desktop \"desktop_name\" \"path_to_exe\" \"name_png_from_image\""
fatal "Использование: $0 create-desktop \"Имя ярлыка\" \"/путь/к/файлу.exe\" [иконка|auto] [имя_desktop_файла]"
elif [[ ! -f "$exe_file" ]] ; then
print_warning "Для создания ярлыка не найден исполняемый файл: $exe_file"
BASENAME_EXE="$(basename "$exe_file")"
local BASENAME_EXE="$(basename "$exe_file")"
print_info "Запускаем поиск $BASENAME_EXE"
local FIND_PATH
if [[ -z "$DRIVE_C" ]] || [[ ! -d "$DRIVE_C" ]]
then FIND_PATH="$WH_PREFIXES_DIR"
else FIND_PATH="$DRIVE_C"
@@ -575,11 +541,55 @@ create_desktop () {
-iname "$BASENAME_EXE")"
if [[ -z "$exe_file" ]] || [[ ! -f "$exe_file" ]]
then fatal "Для создания ярлыка не найден исполняемый файл: $BASENAME_EXE"
else print_ok "Исполняемый файл $BASENAME_EXE найден по пути $(dirname "$exe_file")/"
else print_ok "Исполняемый файл $BASENAME_EXE найден по пути: $(dirname "$exe_file")/"
fi
fi
# создаем .desktop файл
# --- Логика обработки иконки ---
local user_icons_dir="$WINEPREFIX/icons"
create_new_dir "$user_icons_dir"
# Случай 1: Восстановление из бэкапа (передан явный путь)
if [[ "$RESTORE_FROM_BACKUP" == "1" ]] && [[ -f "$icon_arg" ]]; then
icon_file="$icon_arg"
# Случай 2: 'auto' или пустой аргумент - пытаемся извлечь из EXE
elif [[ -z "$icon_arg" ]] || [[ "$icon_arg" == "auto" ]]; then
print_info "Попытка извлечь иконку из $exe_file..."
local png_name="$(basename "$exe_file" .exe).png"
local extracted_icon_path="$user_icons_dir/$png_name"
# Проверяем, существует ли иконка, чтобы избежать повторного извлечения
if [[ -f "$extracted_icon_path" ]]; then
print_info "Иконка уже существует: $extracted_icon_path"
icon_file="$extracted_icon_path"
else
local tmp_ico_dir="$WH_TMP_DIR/icons_$$" # Используем PID для временного каталога
create_new_dir "$tmp_ico_dir"
local ico_name="$(basename "$exe_file" .exe).ico"
if wrestool -x -t 14 "$exe_file" -o "$tmp_ico_dir/$ico_name" &>/dev/null && \
icotool -x -i 1 "$tmp_ico_dir/$ico_name" -o "$tmp_ico_dir/$png_name" &>/dev/null && \
try_copy_file "$tmp_ico_dir/$png_name" "$user_icons_dir/"; then
icon_file="$extracted_icon_path"
print_ok "Иконка успешно извлечена и сохранена: $icon_file"
else
print_warning "Не удалось извлечь иконку из $exe_file. Используется иконка по умолчанию."
icon_file="wine" # Запасной вариант
fi
try_remove_dir "$tmp_ico_dir"
fi
# Случай 3: Передано конкретное имя иконки
elif [[ -f "$WH_IMAGE_PATH/$icon_arg.png" ]]; then
icon_file="$WH_IMAGE_PATH/$icon_arg.png"
# Случай 4: Запасной вариант по умолчанию
else
print_info "Иконка '$icon_arg' не найдена. Используется иконка по умолчанию."
icon_file="wine"
fi
# --- Конец логики обработки иконки ---
# Создаем .desktop файл
create_new_dir "$WH_MENU_DIR"
{
echo "[Desktop Entry]"
@@ -596,19 +606,29 @@ create_desktop () {
cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$WH_MENU_DIR/"
if [[ "$RESTORE_FROM_BACKUP" == "1" ]] ; then
print_info "Пропускаем обновление desktop.list (режим восстановления из бэкапа)"
print_info "Пропускаем обновление desktop.list (режим восстановления)"
else
# добавляем информацию о приложении в "$WINEPREFIX/desktop.list"
# Добавляем информацию о приложении в "$WINEPREFIX/desktop.list"
if [[ -f "$WINEPREFIX/desktop.list" ]] \
&& grep -qe "^${name_desktop}=" "$WINEPREFIX/desktop.list"
then sed -i "/^$name_desktop=/d" "$WINEPREFIX/desktop.list"
fi
create_new_dir "$WINEPREFIX/icons"
try_copy_file "$icon_file" "$WINEPREFIX/icons/"
echo "$name_desktop=${exe_file//$WINEPREFIX/}=$(basename "$icon_file")" >> "$WINEPREFIX/desktop.list"
# Копируем финальную иконку в директорию иконок префикса, если ее там нет
local final_icon_name
if [[ -f "$icon_file" ]]; then
final_icon_name=$(basename "$icon_file")
if [[ ! -f "$user_icons_dir/$final_icon_name" ]]; then
try_copy_file "$icon_file" "$user_icons_dir/"
fi
else
final_icon_name="$icon_file" # например, "wine"
fi
echo "$name_desktop=${exe_file//$WINEPREFIX/}=${final_icon_name}" >> "$WINEPREFIX/desktop.list"
fi
# создаем файл категории для меню
# Создаем файл категории для меню
create_new_dir "$HOME/.local/share/desktop-directories"
if [[ ! -f "$WH_MENU_CATEGORY" ]] ; then
cat > "$WH_MENU_CATEGORY" <<EOF
@@ -619,7 +639,7 @@ Icon=wine
EOF
fi
# Создаем файл меню для всех приложений
# Создаем файл меню для всех приложений WineHelper
create_new_dir "$HOME/.config/menus/applications-merged"
if [[ ! -f "$WH_MENU_CONFIG" ]] ; then
cat > "$WH_MENU_CONFIG" <<EOF
@@ -638,15 +658,15 @@ EOF
EOF
fi
# Обновляем кэш desktop файлов
# Обновляем кэш desktop-файлов
update-desktop-database "$HOME/.local/share/applications"
if [[ $4 != "nocopy" ]] ; then
if [[ "$desktop_filename_arg" != "nocopy" ]] ; then
desktop_path="$(xdg-user-dir DESKTOP)"
print_info "В меню и на рабочем столе создан $desktop_filename.desktop"
print_info "В меню и на рабочем столе создан ярлык: $desktop_filename.desktop"
cp -f "$USER_WORK_PATH/$desktop_filename.desktop" "$desktop_path"
else
print_info "В меню создан $desktop_filename.desktop"
print_info "В меню создан ярлык: $desktop_filename.desktop"
fi
if [[ -n "$INSTALL_SCRIPT_NAME" ]] \
@@ -2044,6 +2064,16 @@ case "$arg1" in
*)
if [[ -f "$arg1" ]] ; then
WIN_FILE_EXEC="$(readlink -f "$arg1")"
# Автоматическое определение префикса, если он не задан
if [[ -z "$WINEPREFIX" ]] && [[ "$WIN_FILE_EXEC" == "$WH_PREFIXES_DIR"* ]]; then
extracted_prefix="$(echo "$WIN_FILE_EXEC" | grep -o ".*/prefixes/[^/]*")"
if [[ -d "$extracted_prefix" ]]; then
export WINEPREFIX="$extracted_prefix"
print_info "Префикс автоматически определен: $(basename "$WINEPREFIX")"
fi
fi
WIN_FILE_NAME="$(basename "$arg1")"
case "${WIN_FILE_NAME,,}" in
*.exe) prepair_wine ; wine_run $WINE_WIN_START "$WIN_FILE_EXEC" "$@" ;;