Comment associer tous les types de fichiers de Wine à son application native correspondante?

8

Cela se fait facilement pour un seul type de fichier, comme indiqué dans Comment associer un type de fichier dans Wine à une application native? , en créant un .regpour le type de fichier souhaité. Mais c'est uniquement pour AVI. J'utilise certaines applications Wine (uTorrent, Soulseek, Eudora, pour n'en nommer que quelques-unes) qui peuvent lancer un large éventail de fichiers. Les pièces jointes aux e-mails, par exemple, peuvent être JPG, DOC, PDF, PPS ... il est impossible (et non souhaitable) de retrouver tous les types de fichiers possibles que l'on peut recevoir dans un e-mail ou télécharger dans un torrent.

J'ai donc besoin d'une solution plus générique et plus large. J'ai besoin de l'association de fichiers pour honorer n'importe quelle 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 .regpour 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. Étant donné que winebrowser utilise xdg-opencomme backend et convertit mon chemin Windows vers un chemin Unix, l'application (Linux) correcte est lancée.

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

  • Liste de tous les types de types MIME de mon système auxquels une application installée par défaut est associée
  • Extraire toutes les informations nécessaires (glob, type mime, etc.)
  • Générez le fichier .REG dans le format ci-dessus

La partie délicate est: j'ai cherché beaucoup pour trouver des informations sur la façon dont l'association se fait dans Ubuntu 10.10 et la documentation est pour le moins rare et confuse. 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 qui contiennent des informations d'association, mais je ne sais pas sur lequel (ou pourquoi) utiliser, ni comment les utiliser pour générer le .regfichier:

~/.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!

MestreLion
la source

Réponses:

2

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

Il utilise xdg-openpour ouvrir un fichier s'il existe une application (native) par défaut pour ce type MIME, sinon il utilise packagekitpour rechercher un package capable de gérer ce fichier (tout comme Nautilus). Donc, mon exigence initiale d'enregistrer uniquement les extensions sur lesquelles une application native é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 qui n'ont pas de gestionnaire dans le registre Windows, mais il peut également remplacer de telles associations (ainsi, par exemple, les fichiers jpeg sont ouverts dans la visionneuse native au lieu du navigateur Gecko Wine 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 natives (ou en tant que mimetypes d'extension x-wine) par winemenubuilder, ce qui serait laid et pourrait provoquer 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 pour tout le monde:

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

Améliorations bienvenues!

MestreLion
la source
votre script dit que cela a réussi, mais rien dans le vin n'a changé pour moi. Pas de gros problème, j'ai trouvé une autre solution de contournement dans l'application Everything
Wine
1

ÉDITER:

Il y a un bug de vin à ce sujet - qui est plus une amélioration qu'un bug. Le point est d'avoir un ShellExecuteappel xdg-openet, s'il n'est pas trouvé, de rechercher les valeurs par défaut de gnome et kde. Vous devriez pouvoir appliquer le patch et enfin avoir la magie :-). Cette solution est plus propre car elle n'a pas besoin de jouer avec le registre.

Pour être plus complet, voici comment patcher et compiler du vin à partir de la source .

FIN DE LA MODIFICATION

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 d'autres types.
Il utilise /usr/bin/gnome-opendans le gstart.exefichier afin qu'il ne fonctionne pas tel quel pour les postes de travail non gnome .

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"

C'est gstart.exeun script bash ... et c'est le pont vers 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"

Remarques:

  1. copier gstart.exedans votre répertoire de travail actuel avant de l'exécuter conf_wine.shcar il le copiera dans le .winedossier.
  2. les emplacements des dossiers peuvent être modifiés, par exemple gstart.exen'a pas à s'asseoir c:\.
  3. ne fait pas de magie: de nouveaux types doivent être ajoutés manuellement. Vous pouvez l'améliorer pour lire les fichiers Linux (mimeapps.list, ..) et mettre à jour le registre wine si nécessaire.
  4. testé pour fonctionner au moins dans le vin 1.4.

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

rosch
la source
+1 pour l'effort, mais cela ne résout guère mon problème. Tout d'abord, il est inutile d'utiliser gnome-openover xdg-open, que j'ai déjà mentionné dans la question, et qui est beaucoup plus portable. Deuxièmement, le codage en dur de quelques extensions de fichier est insuffisant pour moi: comme je l'ai dit, "J'ai besoin de l'association de fichiers pour honorer n'importe quelle application native actuellement configurée. Et je veux que cela soit fait pour tous les types de fichiers configurés dans mon système." Et je sais que c'est délicat. C'est la "magie" dont vous avez parlé dans votre note # 3 qui m'intéresse;)
MestreLion
Je suppose que j'ai lu votre question un peu trop vite la première .. J'ai vu que vous utilisez xdg-open et je vais la changer dans mes scripts. À propos de la magie: une façon serait de lire l'itération sur tous les éléments des fichiers MIME au lieu de l'avoir. Mais vous devrez ensuite l'exécuter à chaque mise à jour de votre système car de nouvelles extensions peuvent avoir été ajoutées. Mais cela n'arrive pas tous les jours.
rosch
Ou même brutalement mis en place un cronjob pour la mise à jour du registre .. modifier uniquement le registre si les mimes ont été mis à jour.
rosch
La partie délicate n'est pas quand mettre à jour le registre, mais comment , ou, plus précisément, mettre à jour pour quelles extensions de fichier? Je ne sais pas comment analyser systématiquement la base de données MIME pour récupérer toutes les extensions qui ont une application installée par défaut associée . Ou, comme vous l'avez dit: comment lire l'itération sur tous les éléments des fichiers MIME ? Il y a certains types de mime dans mon mimeapps.lstque je n'ai pas installés ici, et certains pointent vers une application Wine (ce qui provoquerait des boucles infinies)
MestreLion
Désolé pour les erreurs anglaises dans mon premier commentaire, je l'ai édité et il s'est un peu foiré .. Veuillez lire mon EDIT dans la réponse, là vous avez la magie car tous les fichiers sont pris en charge.
rosch
0

J'ai rassemblé des informations partout et j'ai trouvé ce qui suit pour fonctionner:

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"

Ensuite: 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.

user300778
la source
Merci d'avoir essayé d'aider! Mais une liste codée en dur de quelques extensions bien connues ne résout pas mon problème. En outre, les "informations que vous avez recueillies de partout" semblent être les mêmes informations que moi et Rosch, déjà publiées, y compris un copier-coller de son gstart.exescript.
MestreLion