Como associar todos os tipos de arquivos no Wine com seu aplicativo nativo correspondente?

8

Isso é feito facilmente para um tipo de arquivo único , conforme respondido em Como associar um tipo de arquivo ao Wine com um aplicativo nativo? , criando um .reg para 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 gama de arquivos. Anexos de e-mail, por exemplo, podem ser JPG, DOC, PDF, PPS ... é impossível (e não desejável) rastrear todos os tipos de arquivos possíveis que um pode receber em um email ou baixar em um torrent.

Então eu decidi que uma solução fosse mais genérica e ampla. Eu preciso da associação de arquivos para honrar qualquer aplicativo nativo que esteja configurado atualmente. E quero que isso seja feito para todos os tipos de arquivo todos configurados no meu sistema.

Eu já descobri como tornar a solução genérica. Basta substituir o aplicativo lançado em .reg por winebrowser , assim:

[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-open como backend e converte meu caminho do Windows para um Unix, o aplicativo correto (Linux) é iniciado.

Então, eu preciso de um atualizador "em lote" para o registro do wine, uma espécie de script wine-update-associations que eu possa executar sempre que um novo aplicativo for instalado. Talvez uma ferramenta que possa:

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

A parte difícil é: eu procurei muito para encontrar informações sobre como a associação é feita no Ubuntu 10.10, e a documentação é escassa e confusa, para dizer o mínimo. O Freedesktop.org não possui uma especificação completa, e até mesmo os documentos do Gnome são obsoletos. Até agora, reuni 4 arquivos que contêm informações de associação, mas não sei onde (ou por quê) usar ou como usá-los para gerar o arquivo .reg :

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

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

Obrigado!

    
por MestreLion 30.06.2011 / 23:48

3 respostas

2

Anos mais tarde, eu fiz um pequeno utilitário que varre o banco de dados MIME (tanto o sistema quanto o usuário) e registra todos mime-types nativos conhecidos no registro do Windows.

Ele usa xdg-open para abrir um arquivo se houver um aplicativo padrão (nativo) para esse arquivo. tipo mime, caso contrário, usa packagekit para procurar por um pacote que possa manipular esse arquivo (assim como o Nautilus faz). Portanto, meu requisito inicial de registrar apenas as extensões que têm um aplicativo nativo instalado não era mais necessário. No entanto, uma versão inicial do script filtrou 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 windows registro, mas também pode substituir tais associações (por exemplo, jpeg os arquivos são abertos no visualizador nativo em vez do navegador de vinhos Gecko padrão). Ele também pode ignorar algumas extensões, mesmo que elas não tenham manipulador nas janelas.

Ele tenta o seu melhor para ser um membro do winemenubuilder, ou seja, todas as associações que cria não é publicado como associações nativas (ou como x-wine-extension mimetypes) por winemenubuilder, o que seria feio e potencialmente causaria loops. Isso é muito complicado e ainda não é perfeito, especialmente com extensões de casos mistos (.C e .c por exemplo)

Dito isso, espero que este roteiro seja útil para todos:

link

Melhorias bem-vindas!

    
por MestreLion 29.04.2013 / 06:57
1

EDITAR:

Há um erro de vinho sobre isso - que é mais uma melhoria do que um bug. O ponto é ter ShellExecute call xdg-open , e se não for encontrado, procure pelos padrões gnome e kde. Você deve ser capaz de aplicar o patch e finalmente ter a mágica :-). Esta solução é mais limpa porque não precisa mexer com o registro.

Para ser mais completo, veja como corrigir e compilar o vinho da fonte .

END EDIT

Eu atualizo o registro do wine com o script abaixo para adicionar uma lista de tipos de arquivos comuns. Você pode estender a lista para adicionar mais tipos. Ele faz uso de /usr/bin/gnome-open no arquivo gstart.exe , de forma que não funcionará para desktops não-gnome como é .

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.exe no seu diretório de trabalho atual antes de executar conf_wine.sh , uma vez que irá copiá-lo para a pasta .wine .
  2. as localizações das pastas podem ser alteradas, por ex. gstart.exe não precisa sente-se em c:\ .
  3. não faz mágica: novos tipos precisam ser adicionados manualmente. Você poderia melhorá-lo para ler os arquivos do Linux (mimeapps.list, ..) e atualizar o registro de vinhos, se necessário.
  4. testado para trabalhar pelo menos em vinho1.4.

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

    
por rosch 05.10.2012 / 01:13
0

Reuni informações em todo o lugar e encontrei o seguinte para trabalhar:

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: Criado 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 isso ajude.

    
por user300778 05.07.2014 / 20:29