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:
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!
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!
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:
gstart.exe
dans votre répertoire de travail actuel avant d'exécuter conf_wine.sh
car il sera copié dans le dossier .wine
.gstart.exe
n'a pas besoin de s'asseoir dans c:\
.Wine FAQ: Comment associer un programme natif à un type de fichier dans Wine?
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.