web-dev-qa-db-fra.com

Comment associer tous les types de fichiers dans Wine avec l'application native correspondante?

Cela se fait facilement pour un type de fichier unique , comme indiqué dans la section Comment associer un type de fichier dans Wine à une application native? , en créant un .reg pour le type de fichier souhaité. Mais ceci est uniquement pour AVI. J'utilise des applications de vin (uTorrent, Soulseek, Eudora, pour n'en nommer que quelques-unes) qui peuvent lancer une large gamme de fichiers. Les pièces jointes, par exemple, peuvent être des fichiers JPG, DOC, PDF, PPS ... il est impossible (et non souhaitable) de rechercher tous les types de fichiers possibles que l’on peut recevoir dans un courrier électronique ou télécharger dans un torrent.

Il me faut donc une solution plus générique et plus large. J'ai besoin de l'association de fichier pour respecter l'application native actuellement configurée. Et je veux que cela soit fait pour tous les types de fichiers configurés dans mon système.

J'ai déjà compris comment rendre la solution générique. Il suffit de remplacer l'application lancée dans .reg pour winebrowser, comme ceci:

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

J'ai testé cela et cela fonctionne correctement. Puisque winebrowser utilise xdg-open comme back-end et convertit le chemin de mes fenêtres en un chemin Unix, la bonne application (Linux) est lancée.

J'ai donc besoin d'un programme de mise à jour "batch" vers le registre de wine, une sorte de script wine-update-associations que je peux exécuter à chaque fois qu'une nouvelle application est installée. Peut-être un outil qui peut:

  • Répertorie tous les types de types Mime de mon système pour lesquels un paramètre par défaut est installé associé
  • Extraire toutes les informations nécessaires (glob, type mime, etc.)
  • Générez le fichier .REG au format ci-dessus

La partie la plus délicate est la suivante: j’ai BEAUCOUP cherché beaucoup d’informations sur la façon dont l’association est faite dans Ubuntu 10.10 et ultérieur, et la documentation est pour le moins rare et déroutante. Freedesktop.org n’a pas de spécifications complètes et même les documents Gnome sont obsolètes. Jusqu'à présent, j'ai rassemblé 4 fichiers contenant des informations sur les associations, mais ne contenant aucun renseignement sur lequel (ou pourquoi) utiliser, ou comment les utiliser pour générer le fichier .reg:

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

Toute aide, script ou explication serait grandement appréciée!

Merci!

8
MestreLion

Des années plus tard, j'ai créé un petit utilitaire qui analyse la base de données MIME (le système et l'utilisateur) et enregistre tous les types natifs connus dans le registre Windows.

Il utilise xdg-open pour ouvrir un fichier s'il existe une application (native) par défaut pour ce type mime. Sinon, il utilise packagekit pour rechercher un package capable de gérer ce fichier (comme ce que fait Nautilus). Donc, mon exigence initiale d'enregistrer uniquement les extensions sur lesquelles une application native installée était installée n'était plus nécessaire. Cependant, une première version du script ne filtrait que ces types. L'extrait qui a rendu cela possible était:

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

Par défaut, mon script enregistre uniquement les types natifs sans gestionnaire dans le registre Windows, mais il peut également remplacer ces associations (ainsi, les fichiers jpeg sont ouverts dans le visualiseur natif au lieu du navigateur de vin Gecko par défaut). Il peut également ignorer certaines extensions même si elles n’ont pas de gestionnaire dans Windows.

Il fait de son mieux pour être compatible avec winemenubuilder, ce qui signifie que toutes les associations qu'il crée ne sont pas publiées en tant qu'associations indigènes (ou en tant que mimétypes x-wine-extension) par winemenubuilder, ce qui pourrait être laide et potentiellement causer des boucles. C'est très délicat et pas encore parfait, spécialement avec les extensions à casse mixte (.C et .c par exemple)

Cela dit, j'espère que ce script est utile à tout le monde:

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

Les améliorations sont les bienvenues!

2
MestreLion

EDIT:

Il y a un bug de vin à ce sujet - qui est plus une amélioration qu'un bug. Le but est d’avoir ShellExecute appel xdg-open, et s’il n’est pas trouvé, recherchez gnome et kde par défaut. Vous devriez pouvoir appliquer le patch et enfin avoir la magie :-). Cette solution est plus propre car il n’est pas nécessaire de s’immiscer dans le registre.

Pour être plus complet, voici comment procéder patcher et compiler le vin de la source .

END EDIT

Je mets à jour le registre des vins avec le script ci-dessous pour ajouter une liste des types de fichiers courants.
Vous pouvez étendre la liste pour ajouter plus de types.
Il utilise /usr/bin/gnome-open dans le fichier gstart.exe de sorte qu'il ne fonctionne pas pour les ordinateurs de bureau autres que des gnomes tel quel .

Mettez ceci dans 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"

Le gstart.exe est un script bash..et un pont entre les deux mondes:

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

Notes:

  1. copiez gstart.exe dans votre répertoire de travail actuel avant d'exécuter conf_wine.sh car il sera copié dans le dossier .wine.
  2. les emplacements de dossier peuvent être modifiés, par exemple. gstart.exe n'a pas besoin de s'asseoir dans c:\.
  3. ne fait pas de magie: les nouveaux types doivent être ajoutés manuellement. Vous pouvez l’améliorer pour lire les fichiers Linux (mimeapps.list, ..) et mettre à jour le registre des vins si nécessaire.
  4. testé pour fonctionner au moins dans le vin1.4.

Wine FAQ: Comment associer un programme natif à un type de fichier dans Wine?

1
rosch

J'ai rassemblé des informations partout et j'ai trouvé les éléments suivants qui fonctionnent:

J'ai créé un fichier appelé ~/.wine/drive_c/gstart.exe

avec ce qui suit:

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

Puis: a créé un fichier appelé linuxnative.reg dans mon ~/bin

avec ce qui suit:

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

alors tu fais un

regedit linuxnative.reg

J'espère que cela t'aides.

0
user300778