¿Cómo asociar todos los tipos de archivo dentro de Wine con su correspondiente aplicación nativa?

8

Esto se hace fácilmente para un solo tipo de archivo, como se respondió en ¿Cómo asociar un tipo de archivo dentro de Wine con una aplicación nativa? , creando un .regpara el tipo de archivo deseado. Pero esto es solo para AVI. Utilizo algunas aplicaciones de vino (uTorrent, Soulseek, Eudora, por nombrar algunas) que pueden lanzar una amplia gama de archivos. Los archivos adjuntos de correo electrónico, por ejemplo, pueden ser JPG, DOC, PDF, PPS ... es imposible (y no deseable) rastrear todos los tipos de archivos posibles que uno puede recibir en un correo electrónico o descargar en un torrent.

Así que necesito una solución para ser más genérico y amplio. Necesito la asociación de archivos para honrar cualquier aplicación nativa que esté configurada actualmente. Y quiero que esto se haga para todos los tipos de archivos configurados en mi sistema.

Ya he descubierto cómo hacer que la solución sea genérica. Simplemente reemplazando la aplicación iniciada .regpor winebrowser, así:

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

He probado esto y funciona correctamente. Dado que winebrowser lo utiliza xdg-opencomo backend y convierte mi ruta de Windows a Unix, se inicia la aplicación correcta (Linux).

Así que necesito un actualizador "por lotes" para el registro de Wine, una especie de wine-update-associationsscript que puedo ejecutar cada vez que se instala una nueva aplicación. Quizás una herramienta que pueda:

  • Enumerar todos los tipos de Tipos Mime en mi sistema que tienen una aplicación instalada predeterminada asociada
  • Extraiga toda la información necesaria (glob, tipo mime, etc.)
  • Genere el archivo .REG en el formato anterior

La parte difícil es: he buscado MUCHO para encontrar información sobre cómo se realiza la asociación en Ubuntu 10.10 en adelante, y la documentación es escasa y confusa, por decir lo menos. Freedesktop.org no tiene especificaciones completas, e incluso los documentos de Gnome son obsoletos. Hasta ahora he reunido 4 archivos que contienen información de asociación, pero no tengo idea de qué (o por qué) usar, o cómo usarlos para generar el .regarchivo:

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

¡Cualquier ayuda, guión o explicación sería muy apreciada!

¡Gracias!

MestreLion
fuente

Respuestas:

2

Años después, hice una pequeña utilidad que escanea la base de datos MIME (tanto del sistema como del usuario) y registra todos los tipos mime nativos conocidos en el registro de Windows.

Se usa xdg-openpara abrir un archivo si hay una aplicación predeterminada (nativa) para ese tipo mime, de lo contrario se usa packagekitpara buscar un paquete que pueda manejar ese archivo (al igual que lo que hace Nautilus). Entonces, mi requisito inicial de registrar solo extensiones que tienen una aplicación nativa instalada ya no era necesaria. Sin embargo, una versión anterior de la secuencia de comandos filtraba solo esos tipos. El fragmento que lo hizo posible fue:

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

De manera predeterminada, mi script solo registra tipos nativos que no tienen un controlador en el registro de Windows, pero también puede anular dichas asociaciones (por ejemplo, los archivos jpeg se abren en el visor nativo en lugar del navegador Gecko wine predeterminado). También puede ignorar algunas extensiones incluso si no tienen un controlador en Windows.

Hace todo lo posible para ser amigable con el winemenubuilder, lo que significa que todas las asociaciones que crea no se publican como asociaciones nativas (o como mimetypes de x-wine-extension) por winemenubuilder, lo que sería feo y podría causar bucles. Esto es muy complicado y aún no es perfecto, especialmente con extensiones de mayúsculas y minúsculas (por ejemplo, .C y .c)

Dicho esto, espero que este script sea útil para todos:

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

¡Mejoras bienvenidas!

MestreLion
fuente
Su guión dice que tuvo éxito, pero nada en el vino cambió para mí. No es un gran problema, encontré otra solución en la aplicación de vino en Everythingsí, pero solo quería informarle
phil294
1

EDITAR:

Hay un error en el vino sobre esto , que es más una mejora que un error. El punto es tener una ShellExecutellamada xdg-open, y si no se encuentra, busque los valores predeterminados de gnome y kde. Deberías poder aplicar el parche y finalmente tener la magia :-). Esta solución es más limpia ya que no necesita meterse con el registro.

Para ser más completo aquí es cómo parchar y compilar vino desde la fuente .

EDICIÓN FINAL

Actualizo el registro de vinos con el script a continuación para agregar una lista de tipos de archivos comunes.
Puede ampliar la lista para agregar más tipos.
Se utiliza /usr/bin/gnome-openen el gstart.exearchivo, por lo que no funcionará para equipos de escritorio que no sean gnomos tal como está .

Pon esto en 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"

El gstart.exees un script bash ... y es el puente a ambos 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.exeen su directorio de trabajo actual antes de ejecutarlo, conf_wine.shya que lo copiará a la .winecarpeta.
  2. las ubicaciones de las carpetas se pueden cambiar, por ejemplo gstart.exe, no tiene que sentarse c:\.
  3. no hace magia: hay que agregar nuevos tipos manualmente. Puede mejorarlo para leer los archivos de Linux (mimeapps.list, ..) y actualizar el registro de vinos si es necesario.
  4. probado para trabajar al menos en vino1.4.

Preguntas frecuentes sobre Wine: ¿Cómo asocio un programa nativo con un tipo de archivo en Wine?

rosch
fuente
+1 por el esfuerzo, pero esto apenas resuelve mi problema. Primero, no tiene sentido usar gnome-openover xdg-open, que ya mencioné en la pregunta, y es mucho más portátil. En segundo lugar, codificar algunas extensiones de archivo es insuficiente para mí: como dije, "Necesito la asociación de archivos para honrar cualquier aplicación nativa que esté configurada actualmente. Y quiero que esto se haga para todos los tipos de archivos configurados en mi sistema". Y sé que esto es complicado. Es la "magia" que mencionaste en tu nota # 3 lo que me interesa;)
MestreLion
Supongo que leí tu pregunta demasiado rápido la primera vez. Vi que estás usando xdg-open y lo cambiaré en mis scripts. Sobre la magia: una forma sería leer iterar sobre todos los elementos en los archivos MIME en lugar de tener. Pero luego deberá ejecutarlo cada vez que actualice su sistema, ya que podrían haberse agregado nuevas extensiones. Sin embargo, eso no sucede todos los días.
rosch
O incluso configurar brutalmente un cronjob para la actualización del registro ... solo modificando el registro si los mimos se han actualizado.
rosch
La parte difícil no es cuándo actualizar el registro, sino cómo o, más precisamente, ¿para qué extensiones de archivo se actualizan? No sé cómo analizar constantemente la base de datos mime para recuperar todas las extensiones que tienen una aplicación instalada predeterminada asociada . O, como dijiste: ¿cómo leer iterar sobre todos los elementos en los archivos MIME ? Hay algunos tipos mime en mi mimeapps.lstque no he instalado aquí, y algunos apuntan de nuevo a una aplicación Wine (lo que causaría bucles infinitos)
MestreLion
Perdón por los errores en inglés en mi primer comentario, lo edité y se estropeó un poco. Por favor, lea mi EDITAR en la respuesta, ahí tiene la magia ya que todos los archivos están a cargo.
rosch
0

He reunido información por todo el lugar y he encontrado que lo siguiente funciona:

He creado un archivo llamado ~ / .wine / drive_c / gstart.exe

con lo siguiente :

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

Entonces: Creé un archivo llamado linuxnative.reg en mi ~ / bin

con lo siguiente :

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

entonces haces un

regedit linuxnative.reg

Espero que esto ayude.

user300778
fuente
¡Gracias por intentar ayudar! Pero una lista codificada de algunas extensiones conocidas no resuelve mi problema. Además, la "información que recopiló de todas partes" parece ser la misma información que ya publicamos Rosch y yo, que incluye copiar y pegar su gstart.exeguión.
MestreLion