Как связать все типы файлов в Wine с соответствующим родным приложением?

8

Это легко сделать для одного типа файла, как описано в разделе Как связать тип файла в Wine с собственным приложением? , создав .regдля нужного типа файла. Но это только для AVI. Я использую некоторые винные приложения (uTorrent, Soulseek, Eudora, чтобы назвать несколько), которые могут запускать широкий спектр файлов. Например, вложения электронной почты могут быть в формате JPG, DOC, PDF, PPS ... невозможно (и не желательно) отследить все возможные типы файлов, которые можно получить по электронной почте или загрузить через торрент.

Поэтому мне нужно, чтобы решение было более общим и широким. Мне нужно, чтобы файловая ассоциация учитывала любое настроенное приложение. И я хочу, чтобы это было сделано для всех типов файлов, настроенных в моей системе.

Я уже понял, как сделать решение универсальным. Просто заменив запущенное приложение на .regfor winebrowser, вот так:

[HKEY_CLASSES_ROOT\.pdf]
@="PDFfile"
"Content Type"="application/pdf"
[HKEY_CLASSES_ROOT\PDFfile\Shell\Open\command]
@="C:\\windows\\system32\\winebrowser.exe \"%1\""

Я проверил это, и он работает правильно. Поскольку winebrowser использует xdg-openв качестве бэкэнда и преобразует мой путь к Windows в Unix, запускается правильное (Linux) приложение.

Поэтому мне нужен «пакетный» апдейт для реестра Wine, своего рода wine-update-associationsсценарий, который я могу запускать при установке нового приложения. Может быть, инструмент, который может:

  • Перечислите все типы Mime Types в моей системе, с которыми связано установленное приложение по умолчанию
  • Извлеките всю необходимую информацию (glob, mime type и т. Д.)
  • Создайте файл .REG в вышеуказанном формате

Сложность заключается в следующем: я искал ЛОТ, чтобы найти информацию о том, как осуществляется ассоциация в Ubuntu 10.10 и далее, и документация скудна и запутана, если не сказать больше. У Freedesktop.org нет полной спецификации, и даже документы по Gnome устарели. На данный момент я собрал 4 файла, которые содержат информацию об ассоциации, но я не знаю, какой (или почему) использовать, или как использовать их для создания .regфайла:

~/.local/share/applications/mimeapps.list
~/.local/share/applications/miminfo.cache
/usr/share/applications/miminfo.cache
/etc/gnome/defaults.list

Любая помощь, сценарий или объяснение будет принята с благодарностью!

Спасибо!

MestreLion
источник

Ответы:

2

Спустя годы я создал небольшую утилиту, которая сканирует базу данных MIME (как системную, так и пользовательскую) и регистрирует все известные собственные типы mime в реестре Windows.

Он использует xdg-openдля открытия файла, если есть приложение по умолчанию (нативное) для этого типа MIME, в противном случае используется packagekitдля поиска пакета, который может обработать этот файл (так же, как это делает Nautilus). Поэтому мое первоначальное требование регистрации только расширений, на которых установлено установленное нативное приложение, больше не требовалось. Однако ранняя версия скрипта фильтровала только такие типы. Фрагмент, который сделал это возможным, был:

perl -e '
    use strict; use warnings;
    use File::MimeInfo::Magic; use File::MimeInfo::Applications;
    while (my $line = <STDIN>) {
      chomp($line);
      my ($ext, $mime) = (split/\t/, $line);
      my ($def, @apps) = mime_applications_all($mime);
      print "$line\n" if ($def || @apps)
    }'

По умолчанию мой сценарий регистрирует только собственные типы, которые не имеют обработчика в реестре Windows, но он также может переопределять такие ассоциации (например, файлы jpeg открываются в собственном средстве просмотра вместо стандартного браузера вина Gecko). Он также может игнорировать некоторые расширения, даже если у них нет обработчика в Windows.

Он старается изо всех сил быть дружественным к winemenubuilder, что означает, что все ассоциации, которые он создает, не публикуются как родные ассоциации (или как mimetypes с расширением x-wine) от winemenubuilder, что может быть уродливо и потенциально может привести к появлению петель. Это очень сложно и еще не идеально, особенно со смешанными расширениями (например, .C и .c)

Тем не менее, я надеюсь, что этот скрипт полезен для всех:

https://github.com/MestreLion/wine-tools/blob/master/wine-import-extensions

Улучшения приветствуются!

MestreLion
источник
Ваш сценарий говорит, что это удалось, но ничего в вине для меня не изменилось. Никаких больших проблем, я нашел другой обходной путь в самом винном приложении Everything, но я просто хотел сообщить вам
phil294
1

РЕДАКТИРОВАТЬ:

В этом есть винная ошибка, которая является скорее улучшением, чем ошибкой. Смысл в том, чтобы ShellExecuteвызывать xdg-open, и, если не найден, искать gnome и kde по умолчанию. Вы должны быть в состоянии применить патч и, наконец, иметь магию :-). Это решение является более чистым, так как не требует возни с реестром.

Чтобы быть более полным здесь, как патчить и компилировать вино из исходного кода .

КОНЕЦ РЕДАКТИРОВАНИЯ

Я обновляю винный реестр с помощью сценария ниже, чтобы добавить список распространенных типов файлов.
Вы можете расширить список, чтобы добавить больше типов.
Он использует /usr/bin/gnome-openв gstart.exeфайле, поэтому он не будет работать для рабочих столов не-gnome, как есть .

Поместите это в conf_wine.sh:

#!/bin/bash

SRC=~
WINE=~/.wine
REG=$WINE/system.reg
GSTART=gstart.exe
GSTART_TARGET=$WINE/drive_c
EXE_TARGET=$WINE/drive_c/windows
FNKEY=/tmp/"key"$(date +%F_%H-%M-%S)".reg"

[ -e $FNKEY ] && { echo "temporary key file exists..try again"; exit 1; }

echo "copying gstart.exe"
cp $SRC/$GSTART $GSTART_TARGET
chmod +x $GSTART_TARGET

echo "backing up the registry"
cp $REG $REG.$(date +%F_%H-%M-%S).old

echo "setting new wine registry keys"
for i in http doc docx ppt pptx xls xlsx odt ods xml txt pdf odt svg zip ; do {
    echo "setting $i"
key='[HKEY_CLASSES_ROOT\.'$i']
@="'$i'file"
"Content Type"="application/'$i'"
[HKEY_CLASSES_ROOT\'$i'file\Shell\Open\command]
@="C:\\gstart.exe \"%1\""'
    echo "$key" > $FNKEY
    regedit $FNKEY
}
done

echo "done"

Это gstart.exeскрипт bash .. и мост к обоим мирам:

#!/bin/bash

OPEN_HANDLER=/usr/bin/gnome-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG

# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR

# finally open the file
$OPEN_HANDLER "$RESULT"

Ноты:

  1. gstart.exeперед запуском скопируйте в текущий рабочий каталог, так conf_wine.shкак он скопирует его в .wineпапку.
  2. расположение папок может быть изменено, например gstart.exe, не нужно сидеть c:\.
  3. не волшебство: новые типы должны быть добавлены вручную. Вы можете улучшить его, чтобы читать файлы Linux (mimeapps.list, ..) и обновлять винный реестр, если это необходимо.
  4. проверено на работу хотя бы в вине 1.4.

Wine FAQ: Как связать нативную программу с типом файла в Wine?

Rosch
источник
+1 за усилия, но это вряд ли решит мою проблему. Во-первых, нет смысла использовать gnome-openover xdg-open, о котором я уже упоминал в этом вопросе, и он гораздо более переносим. Во-вторых, жесткое кодирование нескольких расширений файлов для меня недостаточно: как я сказал: «Мне нужно, чтобы сопоставление файлов соответствовало любому настроенному в данный момент приложению. И я хочу, чтобы это было сделано для всех типов файлов, настроенных в моей системе». И я знаю, что это сложно. Меня интересует "магия", о которой вы упомянули в заметке №3;)
MestreLion
Я думаю, что прочитал ваш вопрос слишком быстро в первую очередь .. Я видел, что вы используете xdg-open, и я изменю его в моих сценариях. О магии: одним из способов было бы прочитать итерации по всем элементам в файлах MIME вместо того, чтобы иметь. Но тогда вам придется запускать его каждый раз, когда вы обновляете свою систему, поскольку новые расширения могли быть добавлены. Это не происходит каждый день, хотя.
Рощ
Или даже жестоко настроить cronjob для обновления реестра .. только изменяя реестр, если mimes были обновлены.
Рощ
Сложность заключается не в том, когда обновлять реестр, а в том , как или, точнее, в каких расширениях обновлять файлы? Я не знаю, как последовательно анализировать базу данных MIME для получения всех расширений, с которыми связано установленное приложение по умолчанию . Или, как вы сказали: как читать итерации по всем элементам в файлах MIME ? Есть несколько типов MIME, mimeapps.lstкоторые я не установил здесь, и некоторые указывают на приложение Wine (которое может вызвать бесконечные циклы)
MestreLion
Извините за английские ошибки в моем первом комментарии, я отредактировал его, и он немного испортился .. Пожалуйста, прочитайте мой РЕДАКТИРОВАТЬ в ответ, там у вас есть магия, как все файлы заботятся.
Рощ
0

Я собрал информацию повсюду и нашел следующее для работы:

Я создал файл с именем ~ / .wine / drive_c / gstart.exe

со следующим:

#!/bin/bash
OPEN_HANDLER=/usr/bin/xdg-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG
# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR
# finally open the file
$OPEN_HANDLER "$RESULT"

Затем: создал файл с именем linuxnative.reg в моем ~ / bin

со следующим:

REGEDIT4
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.rtf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.odt]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.pdf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.tif]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.docx]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.jpg]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\linuxnative]
[HKEY_CLASSES_ROOT\linuxnative\shell]
[HKEY_CLASSES_ROOT\linuxnative\shell\open]
[HKEY_CLASSES_ROOT\linuxnative\shell\open\command]
@="c:\\gstart.exe \"%1\""

тогда вы делаете

regedit linuxnative.reg

Надеюсь это поможет.

user300778
источник
Спасибо за попытку помочь! Но жестко закодированный список нескольких известных расширений не решает мою проблему. Кроме того, «информация, которую вы собрали повсюду», кажется, та же самая информация, уже опубликованная мной и Рошем, включая копирование и вставку его gstart.exeсценария.
МестреЛион