Wie ordne ich alle Dateitypen in Wine der entsprechenden nativen Anwendung zu?

8

Dies ist für einen einzelnen Dateityp einfach möglich , wie unter Wie ordne ich einen Dateityp in Wine einer nativen Anwendung zu? , indem Sie einen .regfür den gewünschten Dateityp erstellen. Dies gilt jedoch nur für AVI. Ich verwende einige Wein-Apps (uTorrent, Soulseek, Eudora, um nur einige zu nennen), mit denen eine Vielzahl von Dateien gestartet werden können. E-Mail-Anhänge können beispielsweise JPG, DOC, PDF, PPS sein. Es ist unmöglich (und nicht wünschenswert), alle möglichen Dateitypen aufzuspüren, die in einer E-Mail empfangen oder in einem Torrent heruntergeladen werden können.

Also brauchte ich eine Lösung, um allgemeiner und umfassender zu sein. Ich benötige die Dateizuordnung, um die derzeit konfigurierte native App zu berücksichtigen. Und ich möchte, dass dies für alle in meinem System konfigurierten Dateitypen durchgeführt wird.

Ich habe bereits herausgefunden, wie die Lösung generisch gemacht werden kann. Einfaches Austauschen der ins Leben gerufen App .regfür winebrowser, wie folgt aus :

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

Ich habe dies getestet und es funktioniert richtig. Da Winebrowser xdg-openals Backend verwendet und meinen Windows-Pfad in einen Unix-Pfad konvertiert, wird die richtige (Linux-) App gestartet.

Ich brauche also einen "Batch" -Update für die Registrierung von Wine, eine Art wine-update-associationsSkript, das ich ausführen kann, wenn eine neue App installiert wird. Vielleicht ein Werkzeug, das:

  • Listen Sie alle Mime-Typ-Typen in meinem System auf , denen eine standardmäßig installierte App zugeordnet ist
  • Extrahieren Sie alle benötigten Informationen (Glob, MIME-Typ usw.)
  • Generieren Sie die .REG-Datei im obigen Format

Der schwierige Teil ist: Ich habe viel gesucht, um Informationen darüber zu finden, wie die Zuordnung in Ubuntu 10.10 erfolgt, und die Dokumentation ist, gelinde gesagt, knapp und verwirrend. Freedesktop.org hat keine vollständige Spezifikation, und selbst Gnome-Dokumente sind veraltet. Bisher habe ich 4 Dateien gesammelt , die Zuordnungsinformationen enthalten, aber ich weiß nicht, welche (oder warum) ich sie verwenden soll oder wie ich sie zum Generieren der .regDatei verwenden soll:

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

Jede Hilfe, jedes Skript oder jede Erklärung wäre sehr dankbar!

Vielen Dank!

MestreLion
quelle

Antworten:

2

Jahre später habe ich ein kleines Dienstprogramm erstellt, das die MIME-Datenbank (sowohl System als auch Benutzer) durchsucht und alle bekannten nativen MIME -Typen in der Windows-Registrierung registriert.

Es wird verwendet xdg-open, um eine Datei zu öffnen, wenn es eine Standardanwendung (native Anwendung) für diesen MIME-Typ gibt. Andernfalls wird packagekitnach einem Paket gesucht, das diese Datei verarbeiten kann (genau wie Nautilus). Meine anfängliche Anforderung, nur Erweiterungen zu registrieren, auf denen eine native Anwendung installiert ist, wurde daher nicht mehr benötigt. In einer frühen Version des Skripts wurden jedoch nur solche Typen gefiltert. Das Snippet, das es möglich machte, war:

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

Standardmäßig registriert mein Skript nur native Typen, die keinen Handler in der Windows-Registrierung haben, kann aber auch solche Zuordnungen überschreiben (so werden beispielsweise JPEG-Dateien im nativen Viewer anstelle des Standard-Gecko-Weinbrowsers geöffnet). Einige Erweiterungen können auch dann ignoriert werden, wenn in Windows kein Handler vorhanden ist.

Es versucht sein Bestes, um Winemenubuilder-freundlich zu sein, was bedeutet, dass alle Assoziationen, die es erstellt, von Winemenubuilder nicht als native Assoziationen (oder als X-Wine-Extension-Mimetypen) veröffentlicht werden, was hässlich wäre und möglicherweise Schleifen verursachen würde. Dies ist sehr schwierig und noch nicht perfekt, insbesondere bei Erweiterungen mit gemischten Groß- und Kleinschreibung (z. B. .C und .c).

Trotzdem hoffe ich, dass dieses Skript für alle hilfreich ist:

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

Verbesserungen willkommen!

MestreLion
quelle
Ihr Drehbuch sagt, dass es gelungen ist, aber nichts an Wein hat sich für mich geändert. Kein großes Problem, ich habe eine andere Problemumgehung in der Wein-App Everythingselbst gefunden, aber ich wollte Sie nur informieren
phil294
1

BEARBEITEN:

Es gibt einen Weinfehler - der eher eine Verbesserung als ein Fehler ist. Der Punkt ist, einen ShellExecuteAnruf zu haben xdg-openund, falls nicht gefunden, nach Gnome- und KDE-Standardeinstellungen zu suchen. Sie sollten in der Lage sein, den Patch anzuwenden und endlich die Magie zu haben :-). Diese Lösung ist sauberer, da sie nicht mit der Registrierung in Konflikt geraten muss.

Um vollständiger zu sein, erfahren Sie hier, wie Sie Wein aus der Quelle patchen und kompilieren .

END EDIT

Ich aktualisiere die Weinregistrierung mit dem folgenden Skript, um eine Liste gängiger Dateitypen hinzuzufügen.
Sie können die Liste erweitern, um weitere Typen hinzuzufügen.
Es wird /usr/bin/gnome-openin der gstart.exeDatei verwendet, sodass es für Nicht-Gnome-Desktops nicht so funktioniert, wie es ist .

Geben Sie dies ein 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"

Das gstart.exeist ein Bash-Skript ... und ist die Brücke zu beiden Welten:

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

Anmerkungen:

  1. Kopieren gstart.exeSie es vor dem Ausführen in Ihr aktuelles Arbeitsverzeichnis, conf_wine.shda es in den .wineOrdner kopiert wird .
  2. Die Ordnerpositionen können geändert werden, müssen z. B. gstart.exenicht sitzen c:\.
  3. macht keine Magie: Neue Typen müssen manuell hinzugefügt werden. Sie können es verbessern, um die Linux-Dateien (mimeapps.list, ..) zu lesen und die Weinregistrierung bei Bedarf zu aktualisieren.
  4. getestet, um mindestens in Wein zu arbeiten1.4.

Wine FAQ: Wie verbinde ich ein native Programm mit einem Dateityp in Wein?

rosch
quelle
+1 für die Mühe, aber das löst mein Problem kaum. Erstens macht es wenig Sinn, gnome-openover zu verwenden xdg-open, was ich bereits in der Frage erwähnt habe, und es ist weitaus portabler. Zweitens reicht die Hardcodierung einiger Dateierweiterungen für mich nicht aus: Wie gesagt: "Ich benötige die Dateizuordnung, um die derzeit konfigurierte native App zu berücksichtigen. Dies soll für alle in meinem System konfigurierten Dateitypen erfolgen." Und mir ist bewusst, dass dies schwierig ist. Es ist die "Magie", die Sie in Ihrer Notiz Nr. 3 erwähnt haben, die mich interessiert;)
MestreLion
Ich glaube, ich habe Ihre Frage beim ersten Mal etwas zu schnell gelesen. Ich habe gesehen, dass Sie xdg-open verwenden, und ich werde es in meinen Skripten ändern. Über die Magie: Eine Möglichkeit wäre, alle Elemente in den MIME-Dateien iterativ zu lesen, anstatt sie zu haben. Sie müssen es dann jedoch jedes Mal ausführen, wenn Sie Ihr System aktualisieren, da möglicherweise neue Erweiterungen hinzugefügt wurden. Das passiert aber nicht jeden Tag.
Rosch
Oder richten Sie sogar brutal einen Cronjob für das Registrierungsupdate ein. Ändern Sie die Registrierung nur, wenn die Mimen aktualisiert wurden.
Rosch
Der schwierige Teil ist nicht, wann die Registrierung aktualisiert werden muss, sondern wie oder genauer gesagt, für welche Dateierweiterungen? Ich weiß nicht, wie ich die MIME-Datenbank konsistent analysieren soll, um alle Erweiterungen abzurufen , denen eine standardmäßig installierte App zugeordnet ist . Oder, wie Sie sagten: Wie lese ich iterativ über alle Elemente in den MIME-Dateien ? Es gibt einige MIME-Typen in meinem mimeapps.lst, die ich hier nicht installiert habe, und einige verweisen auf eine Wine-App (die Endlosschleifen verursachen würde)
MestreLion
Entschuldigung für die englischen Fehler in meinem ersten Kommentar, ich habe ihn bearbeitet und er wurde ein bisschen durcheinander gebracht. Bitte lesen Sie meine BEARBEITUNG in der Antwort, da haben Sie die Magie, da alle Dateien erledigt sind.
Rosch
0

Ich habe überall Informationen gesammelt und festgestellt, dass Folgendes funktioniert:

Ich habe eine Datei mit dem Namen ~ / .wine / drive_c / gstart.exe erstellt

mit den folgenden :

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

Dann: Erstellt eine Datei namens linuxnative.reg in meinem ~ / bin

mit den folgenden :

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

dann machst du a

regedit linuxnative.reg

Hoffe das hilft.

user300778
quelle
Danke, dass du versucht hast zu helfen! Eine fest codierte Liste einiger bekannter Erweiterungen löst mein Problem jedoch nicht. Außerdem scheinen die "Informationen, die Sie überall gesammelt haben" die gleichen Informationen zu sein, die ich und rosch bereits gepostet haben, einschließlich des Kopierens und Einfügens seines gstart.exeSkripts.
MestreLion