Come si ottiene l'icona, il tipo MIME e l'applicazione associati a un file nel desktop Linux?

StackOverflow https://stackoverflow.com/questions/1629172

  •  06-07-2019
  •  | 
  •  

Domanda

Usando C ++ sul desktop Linux, qual è il modo migliore per ottenere l'icona, la descrizione del documento e l'applicazione "associata"? con un percorso file / file arbitrario?

Vorrei usare il maggior numero di "canonici" modo di trovare icone, descrizioni di tipo mime / tipo di file e applicazioni associate su KDE e gnome e vorrei evitare qualsiasi "bombardamento" alla riga di comando e " di basso livello " routine oltre a evitare di reinventare me stesso la ruota (senza analizzare il file mime-types e simili).

Modifiche e note:

Ehi, inizialmente avevo posto questa domanda sull'oggetto info del file QT e sulla risposta che "non esiste una risposta chiara" sembra essere corretto per quanto va. MA questa è una situazione così sbagliata che sto aprendo la domanda alla ricerca di ulteriori informazioni.

Non mi interessa più di QT in particolare, sto solo cercando il modo most cannonico per trovare il tipo mime tramite le chiamate di funzione C ++ / c sia su KDE che su gnome (specialmente Gnome, dato che è lì che le cose mi confondono di più). Voglio poter mostrare icone e descrizioni corrispondenti a Nautilus in Gnome e Konquerer / qualunque cosa su KDE, nonché aprire i file in modo appropriato, ecc.

Suppongo sia OK che lo ottenga separatamente per KDE e Gnome. La grande domanda è qual è il modo più comune / migliore / cannonico per ottenere tutte queste informazioni per il desktop Linux? La documentazione di Gnome è particolarmente opaca. gnome-vsf ha routine mime ma è deprecato e non riesco a trovare una routine mime per GIO / GFS, la sostituzione di gnome-vsf. C'è una vaga implicazione che si dovrebbero usare le applicazioni desktop aperte ma quale usare è oscuro. E dove si inseriscono libmagic e xdg?

Indica un saggio che riassume le questioni accettate volentieri. Ancora una volta, so che la risposta a tre righe è "nessun animale di questo tipo" ma sto cercando la lunga risposta.

È stato utile?

Soluzione

Ecco un esempio dell'uso di GLib / GIO per ottenere le informazioni desiderate.

#include <gio/gio.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
    g_thread_init (NULL);
    g_type_init ();

    if (argc < 2)
        return -1;

    GError *error;
    GFile *file = g_file_new_for_path (argv[1]);
    GFileInfo *file_info = g_file_query_info (file,
                                              "standard::*",
                                              0,
                                              NULL,
                                              &error);

    const char *content_type = g_file_info_get_content_type (file_info);
    char *desc = g_content_type_get_description (content_type);
    GAppInfo *app_info = g_app_info_get_default_for_type (
                                  content_type,
                                  FALSE);

    /* you'd have to use g_loadable_icon_load to get the actual icon */
    GIcon *icon = g_file_info_get_icon (file_info);

    printf ("File: %s\nDescription: %s\nDefault Application: %s\n",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    return 0;
}

Altri suggerimenti

Puoi utilizzare gli strumenti disponibili da xdg , in particolare xdg-mime interrogazione .

Per scoprire il tipo di file di es un file index.html che dovresti

$ xdg-mime query filetype index.html

Questo restituirà il mimetype. Per interrogare quale applicazione è associata a tale mimetismo utilizzare ad esempio

$ xdg-mime query default text/html

Questo restituisce epiphany.desktop qui, cioè $ APPNAME.desktop , quindi è facile ottenere il nome dell'applicazione da esso. Se desideri semplicemente aprire il file nell'app predefinita, puoi ovviamente eseguire

$ xdg-open index.html

che accenderebbe l'epifania.

Le funzioni di query per le risorse dell'icona non sembrano essere disponibili in xdg-utils , ma potresti scrivere un piccolo script Python usando pyxdg che offre anche tonnellate di funzionalità aggiuntive.

Per gli attacchi C probabilmente dovrai dare un'occhiata al portland collegato nella xdg .

Modifica

Per quanto riguarda libmagic e gli amici, dovrai decidere le tue preferenze: mentre libmagic sembra essere più completo (e accurato) in termini di copertura per i tipi di file, non gli interessa tutto su applicazioni o icone predefinite. Inoltre non fornisce strumenti per installare mimetipi extra.

In Qt > = 4.6, c'è una nuova funzione per i sistemi X11

QIcon QIcon::fromTheme ( const QString & name, const QIcon & fallback = QIcon() ) [static]

È possibile utilizzare questa funzione. Documentazione qui / (Qt 5)

Né QFileIconProvider né QFileInfo faranno nulla con il database mime del sistema operativo. Per accedere alle icone associate a diversi tipi MIME, dovrai utilizzare le funzioni dell'ambiente desktop sottostante. In Qt non esiste (ancora) un modo canonico.

Considera che puoi avere un'icona diversa in Gnome, in KDE e in Windows. Ad esempio, in KDE useresti KMimeType .

Ho appena trovato KFileItem . Questa classe ti offre tutto ciò che ti serve per icone, tipi di mime e cose correlate in KDE. Sono sicuro che esiste un equivalente in gnome ma questo dà accesso allo stesso livello di un'applicazione QT.

Potresti voler usare il sistema " /etc/mime.types" file. È anche una buona idea conservare la copia del programma di un file di tipo MIME. In questo modo, non dipendi dal sistema, ma allo stesso tempo devi mantenerlo abbastanza esaustivo. Non sono sicuro delle icone.

Forse dai un'occhiata a questo codice: http: //ftp.devil-linux. org / pub / devel / fonti / 1,2 / file-4.23.tar.gz

Questo è l'utilità di file standard presente nella maggior parte delle distribuzioni Linux / Unix. Otterrai il tipo MIME e qualche informazione in più.

Penso che sia Gnome che KDE abbiano i loro modi per determinarlo e anche per impostare l'icona e l'applicazione standard per esso.

Comunque, quel file-tool è probabilmente il modo migliore per ottenere il tipo mime e la descrizione del documento. E in alcuni casi anche alcuni dettagli sul contenuto.

Questo ti darà il tipo mime. Questo è quello che ti serve comunque per sapere come puoi aprire il file. Questi sono passaggi separati. il file non ti dice dell'icona né dell'applicazione con cui aprire il file.

Con circa 8 anni di ritardo, ma comunque utile.

Per ottenere le applicazioni associate in KDE puoi fare ciò che Joe ha suggerito (usando KFileItem ). Tuttavia, ciò richiede l'inclusione di molte librerie. Il codice seguente richiede meno.

#include <QCoreApplication>
#include <QMimeDatabase>
#include <QDebug>

#include <KMimeTypeTrader>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  if (argc < 2)
  {
    qDebug() << "missing argument <filename>";
    return 1;
  }
  QMimeDatabase mimeDb;
  QMimeType     mimeType = mimeDb.mimeTypeForFile(QString::fromLocal8Bit(argv[1]));

  KService::List services = KMimeTypeTrader::self()->query(
      mimeType.name(),QStringLiteral("Application"));

  foreach(const QExplicitlySharedDataPointer<KService>& svc, services)
  {
    qDebug() << "service: " << svc->name();
    qDebug() << "exec: " << svc->exec();
  }
}

Per compilare il codice aggiungi QT + = KService KCoreAddons al tuo file qmake .pro .

Collegamenti a KMimeTypeTrader & amp; Documentazione di KService:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top