Come associare tutti i tipi di file all'interno di Wine alla sua applicazione nativa corrispondente?


8

Questo è facilmente eseguibile per un singolo tipo di file, come indicato in Come associare un tipo di file in Wine a un'applicazione nativa? , creando un .regper il tipo di file desiderato. Ma questo è solo per AVI. Uso alcune app di vino (uTorrent, Soulseek, Eudora, solo per citarne alcune) che possono lanciare una vasta gamma di file. Gli allegati e-mail, ad esempio, possono essere JPG, DOC, PDF, PPS ... è impossibile (e non desiderabile) rintracciare tutti i possibili tipi di file che si possono ricevere in un'e-mail o scaricare in un torrent.

Quindi ho bisogno di una soluzione per essere più generica e ampia. Ho bisogno dell'associazione dei file per onorare qualsiasi app nativa attualmente configurata. E voglio che ciò avvenga per tutti i tipi di file configurati nel mio sistema.

Ho già capito come rendere generica la soluzione. Sostituendo semplicemente l'app avviata in .regper winebrowser, in questo modo:

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

Ho provato questo e funziona correttamente. Poiché winebrowser utilizza xdg-opencome backend e converte il mio percorso di Windows in Unix, viene avviata l'app corretta (Linux).

Quindi ho bisogno di un aggiornamento "batch" al registro di Wine, una specie di wine-update-associationsscript che posso eseguire ogni volta che viene installata una nuova app. Forse uno strumento che può:

  • Elenca tutti i tipi di Mime Tipi nel mio sistema a cui è associata un'app predefinita installata
  • Estrai tutte le informazioni necessarie (glob, tipo mime, ecc.)
  • Genera il file .REG nel formato sopra

La parte difficile è: ho cercato MOLTO per trovare informazioni su come si fa l'associazione in Ubuntu 10.10 in poi, e la documentazione è scarsa e confusa, per non dire altro. Freedesktop.org non ha specifiche complete e persino i documenti di Gnome sono obsoleti. Finora ho raccolto 4 file che contengono informazioni sull'associazione, ma non ho idea di quale (o perché) usare o come usarli per generare il .regfile:

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

Qualsiasi aiuto, copione o spiegazione sarebbe molto apprezzato!

Grazie!

Risposte:


2

Anni dopo, ho creato una piccola utility che analizza il database MIME (sia di sistema che dell'utente) e registra tutti i tipi di mime nativi noti nel registro di Windows.

Utilizza xdg-openper aprire un file se esiste un'applicazione predefinita (nativa) per quel tipo mime, altrimenti usa packagekitper cercare un pacchetto in grado di gestire quel file (proprio come fa Nautilus). Quindi il mio requisito iniziale di registrare solo estensioni con un'applicazione nativa installata non era più necessario. Tuttavia, una versione iniziale dello script ha filtrato solo tali tipi. Lo snippet che lo ha reso possibile è stato:

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

Per impostazione predefinita, il mio script registra solo tipi nativi che non hanno un gestore nel registro di Windows, ma può anche sovrascrivere tali associazioni (quindi, ad esempio, i file jpeg vengono aperti nel visualizzatore nativo anziché nel browser Gecko wine predefinito). Può anche ignorare alcune estensioni anche se non hanno un gestore in Windows.

Fa del suo meglio per essere winemenubuilder amichevole, il che significa che tutte le associazioni che crea non sono pubblicate come associazioni native (o come mimetipi dell'estensione del vino x) da winemenubuilder, che sarebbe brutto e potenzialmente causerebbe loop. Questo è molto complicato e non ancora perfetto, specialmente con estensioni a caso misto (.C e .c per esempio)

Detto questo, spero che questo script sia utile per tutti:

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

Miglioramenti benvenuti!


la tua sceneggiatura dice che ci è riuscita, ma nulla nel vino è cambiato per me. Nessun grosso problema, ho trovato un'altra soluzione nell'app Everythingstessa per il vino , ma volevo solo informarti
phil294

1

MODIFICARE:

C'è un bug di vino su questo - che è più un miglioramento che un bug. Il punto è avere ShellExecutecall xdg-opene, se non trovato, cercare i valori predefiniti di gnome e kde. Dovresti essere in grado di applicare la patch e finalmente avere la magia :-). Questa soluzione è più pulita in quanto non necessita di confusione con il registro.

Per essere più completo qui è come patchare e compilare il vino dalla fonte .

MODIFICA FINE

Aggiornamento il registro del vino con lo script seguente per aggiungere un elenco di tipi di file comuni.
È possibile estendere l'elenco per aggiungere altri tipi.
Si utilizza /usr/bin/gnome-opennel gstart.exefile in modo che non funzionerà per i desktop non gnome così com'è .

Metti questo in 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"

Il gstart.exeè uno script..and bash è il ponte di entrambi i mondi:

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

Appunti:

  1. copiarlo gstart.exenella directory di lavoro corrente prima di eseguirlo conf_wine.shpoiché verrà copiato nella .winecartella.
  2. le posizioni delle cartelle possono essere modificate, ad es. gstart.exenon è necessario sedersi c:\.
  3. non fa magia: i nuovi tipi devono essere aggiunti manualmente. È possibile migliorarlo per leggere i file Linux (mimeapps.list, ..) e aggiornare il registro del vino, se necessario.
  4. testato per funzionare almeno nel vino 1.4.

Domande frequenti su Wine: come associare un programma nativo a un tipo di file in Wine?


+1 per lo sforzo, ma questo difficilmente risolve il mio problema. Innanzitutto, è inutile utilizzare gnome-openOver xdg-open, che ho già menzionato nella domanda, ed è molto più portatile. In secondo luogo, codificare alcune estensioni di file non è sufficiente per me: come ho detto, "ho bisogno dell'associazione di file per onorare qualsiasi app nativa attualmente configurata. E voglio che ciò avvenga per tutti i tipi di file configurati nel mio sistema". E sono consapevole che questo è difficile. È la "magia" che hai menzionato nella tua nota n. 3 che mi interessa;)
MestreLion

Immagino di aver letto la tua domanda un po 'troppo in fretta il primo .. Ho visto che stai usando xdg-open e lo cambierò nei miei script. A proposito della magia: un modo sarebbe leggere l'iterazione su tutti gli elementi nei file mime invece di averli. Ma dovrai eseguirlo ogni volta che aggiorni il tuo sistema poiché potrebbero essere state aggiunte nuove estensioni. Ciò non accade ogni giorno.
Rosch

O anche impostare brutalmente un cronjob per l'aggiornamento del registro ... modificando solo il registro se i mimi sono stati aggiornati.
Rosch

La parte difficile non è quando aggiornare il registro, ma come o, più precisamente, aggiornare per quali estensioni di file? Non so come analizzare costantemente il database mime per recuperare tutte le estensioni a cui è associata un'app predefinita installata . Oppure, come hai detto: come leggere ripetutamente tutti gli elementi nei file mime ? Ci sono alcuni tipi di mime nel mio mimeapps.lstche non ho installato qui e alcuni rimandano a un'app Wine (che causerebbe infiniti loop)
MestreLion

Mi dispiace per gli errori inglesi nel mio primo commento, l'ho modificato e si è incasinato un po '.. Per favore leggi il mio EDIT nella risposta, lì hai la magia come tutti i file sono curati.
Rosch

0

Ho raccolto informazioni in tutto il luogo e ho trovato il seguente per funzionare:

Ho creato un file chiamato ~ / .wine / drive_c / gstart.exe

con il seguente:

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

Quindi: ho creato un file chiamato linuxnative.reg nel mio ~ / bin

con il seguente:

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

allora fai un

regedit linuxnative.reg

Spero che sia di aiuto.


Grazie per aver cercato di aiutare! Ma un elenco codificato di alcune estensioni note non risolve il mio problema. Inoltre, le "informazioni che hai raccolto da tutto il luogo" sembrano essere le stesse informazioni già pubblicate da me e Rosch, inclusa una copia e incolla della sua gstart.exesceneggiatura.
MestreLion,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.