Como associar todos os tipos de arquivo no Wine ao seu aplicativo nativo correspondente?

8

Isso é feito facilmente para um único tipo de arquivo, conforme respondido em Como associar um tipo de arquivo no Wine a um aplicativo nativo? , criando um .regpara o tipo de arquivo desejado. Mas isso é apenas para AVI. Eu uso alguns aplicativos de vinho (uTorrent, Soulseek, Eudora, para citar alguns) que podem iniciar uma ampla variedade de arquivos. Os anexos de email, por exemplo, podem ser JPG, DOC, PDF, PPS ... é impossível (e não desejável) rastrear todos os tipos de arquivos possíveis que se pode receber em um email ou baixar em um torrent.

Então, eu precisava de uma solução para ser mais genérica e ampla. Preciso da associação do arquivo para honrar qualquer aplicativo nativo atualmente configurado. E eu quero que isso seja feito para todos os tipos de arquivos configurados no meu sistema.

Eu já descobri como tornar a solução genérica. Simplesmente substituindo o aplicativo lançado .regpor winebrowser, desta forma:

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

Eu testei isso e funciona corretamente. Como o winebrowser usa xdg-opencomo back-end e converte o caminho do meu Windows para o Unix, o aplicativo (Linux) correto é iniciado.

Portanto, preciso de um atualizador em "lote" para o registro do wine, um tipo de wine-update-associationsscript que eu possa executar sempre que um novo aplicativo for instalado. Talvez uma ferramenta que possa:

  • Listar todos os tipos de MIME no meu sistema que tenham um aplicativo instalado padrão associado
  • Extraia todas as informações necessárias (glob, tipo MIME, etc)
  • Gere o arquivo .REG no formato acima

A parte complicada é: eu procurei MUITO para encontrar informações sobre como a associação é feita no Ubuntu 10.10 em diante, e a documentação é escassa e confusa, para dizer o mínimo. O Freedesktop.org não possui especificações completas e até os documentos do Gnome são obsoletos. Até agora, reuni 4 arquivos que contêm informações de associação, mas não tenho noção de qual (ou por que) usar ou como usá-los para gerar o .regarquivo:

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

Qualquer ajuda, script ou explicação seria muito apreciada!

Obrigado!

MestreLion
fonte

Respostas:

2

Anos depois, criei um pequeno utilitário que verifica o banco de dados MIME (sistema e usuário) e registra todos os tipos MIME nativos conhecidos no registro do Windows.

Ele usa xdg-openpara abrir um arquivo se houver um aplicativo padrão (nativo) para esse tipo de mime, caso contrário, ele packagekitprocura um pacote que possa manipular esse arquivo (exatamente como o Nautilus faz). Portanto, meu requisito inicial de registrar apenas extensões que possuem um aplicativo nativo instalado não era mais necessário. No entanto, uma versão anterior do script filtrava apenas esses tipos. O trecho que tornou possível foi:

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)
    }'

Por padrão, meu script registra apenas tipos nativos que não possuem manipulador no registro do Windows, mas também pode substituir essas associações (por exemplo, os arquivos jpeg são abertos no visualizador nativo, em vez do navegador de vinhos Gecko padrão). Também pode ignorar algumas extensões, mesmo que elas não possuam manipulador no Windows.

Ele tenta o seu melhor para ser amigável ao winemenubuilder, o que significa que todas as associações que ele cria não são publicadas como associações nativas (ou como mimetypes de extensão x-wine) pelo winemenubuilder, o que seria feio e causaria loops potencialmente. Isso é muito complicado e ainda não é perfeito, especialmente com extensões de maiúsculas e minúsculas (.C e .c, por exemplo)

Dito isto, espero que este script seja útil para todos:

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

Melhorias bem-vindas!

MestreLion
fonte
seu script diz que foi bem-sucedido, mas nada no vinho mudou para mim. Não é grande problema, eu encontrei outra solução no aplicativo vinho Everythingem si, mas eu só queria informá-lo
phil294
1

EDITAR:

Há um bug do vinho sobre isso - o que é mais uma melhoria do que um bug. O objetivo é ShellExecutechamar xdg-open, e se não for encontrado, procure os padrões do gnome e do kde. Você deve poder aplicar o patch e finalmente ter a mágica :-). Esta solução é mais limpa , pois não precisa mexer com o registro.

Para ser mais completo aqui, é preciso corrigir e compilar o vinho da fonte .

EDIT FIM

Eu atualizo o registro do vinho com o script abaixo para adicionar uma lista de tipos de arquivos comuns.
Você pode estender a lista para adicionar mais tipos.
Ele é usado /usr/bin/gnome-openno gstart.exearquivo para não funcionar em áreas de trabalho não-gnome como está .

Coloque isso em 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"

O gstart.exeé um script bash .. e é a ponte para os dois mundos:

#!/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"

Notas:

  1. copie gstart.exeem seu diretório de trabalho atual antes de executar, conf_wine.shpois ele será copiado para a .winepasta
  2. os locais das pastas podem ser alterados, por exemplo, gstart.exenão é necessário sentar-se c:\.
  3. não faz mágica: novos tipos precisam ser adicionados manualmente. Você pode aprimorá-lo para ler os arquivos do Linux (mimeapps.list, ..) e atualizar o registro do vinho, se necessário.
  4. testado para funcionar pelo menos no vinho1.4.

Wine FAQ: Como associo um programa nativo a um tipo de arquivo no Wine?

rosch
fonte
+1 pelo esforço, mas isso dificilmente resolve meu problema. Primeiro, há pouco sentido em usar gnome-openover xdg-open, que eu já mencionei na pergunta, e é muito mais portátil. Segundo, codificar algumas extensões de arquivo é insuficiente para mim: como eu disse, "eu preciso da associação de arquivos para honrar qualquer aplicativo nativo atualmente configurado. E quero que isso seja feito para todos os tipos de arquivos configurados no meu sistema". E eu sei que isso é complicado. É a "mágica" que você mencionou na sua nota # 3 que me interessa;)
MestreLion 08/10/12
Acho que li a sua pergunta um pouco rápido demais no início. Vi que você está usando o xdg-open e vou alterá-lo nos meus scripts. Sobre a mágica: uma maneira seria ler a iteração sobre todos os itens nos arquivos mime, em vez de ter. Mas você precisará executá-lo sempre que atualizar seu sistema, pois novas extensões podem ter sido adicionadas. Isso não acontece todos os dias.
rosch 8/10/12
Ou até mesmo configurar brutalmente um cronjob para a atualização do registro .. apenas modificando o registro se os mimos tiverem sido atualizados.
rosch 8/10/12
A parte complicada não é quando atualizar o registro, mas como ou, mais precisamente, atualizar para quais extensões de arquivo? Não sei como analisar consistentemente o banco de dados mime para recuperar todas as extensões que possuem um aplicativo instalado padrão associado . Ou, como você disse: como ler iterar sobre todos os itens nos arquivos MIME ? Existem alguns tipos mime no meu mimeapps.lstque eu não estão instalados aqui, e algum ponto de volta para um aplicativo Wine (o que causaria loops infinitos)
MestreLion
Desculpe pelos erros de inglês no meu primeiro comentário, eu editei e ficou um pouco bagunçado. Por favor, leia minha EDIT na resposta, você tem a magia, pois todos os arquivos são resolvidos.
rosch 9/10/12
0

Reuni informações em todo o lugar e descobri o seguinte:

Eu criei um arquivo chamado ~ / .wine / drive_c / gstart.exe

com o seguinte :

#!/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"

Então: criei um arquivo chamado linuxnative.reg no meu ~ / bin

com o seguinte :

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\""

então você faz um

regedit linuxnative.reg

Espero que isto ajude.

user300778
fonte
Obrigado por tentar ajudar! Mas uma lista codificada de algumas extensões conhecidas não resolve o meu problema. Além disso, as "informações que você coletou de todo o lugar" parecem ser as mesmas informações já publicadas por mim e por rosch, incluindo uma cópia e colar de seu gstart.exescript.
MestreLion 3/08/14