Comment obtenir l'icône, le type MIME et l'application associés à un fichier dans le bureau Linux?

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

  •  06-07-2019
  •  | 
  •  

Question

En utilisant C ++ sur le bureau Linux, quel est le meilleur moyen d’obtenir l’icône, la description du document et l’application "associé" " avec un fichier / chemin de fichier arbitraire?

Je voudrais utiliser le plus "canonique" moyen de trouver des icônes, des descriptions de type mime / type de fichier et les applications associées à la fois sur KDE et gnome et je voudrais éviter toute "suppression" de sur la ligne de commande et "bas niveau" évitant de réinventer moi-même la roue (pas d’analyse du fichier mime-types et autres).

Modifications et notes:

Hé, j’avais posé cette question à l’origine sur l’objet d’information sur le fichier QT et sur la réponse selon laquelle "il n’existe pas de réponse claire". semble être correct dans la mesure où il va. MAIS la situation est tellement chaotique que je pose la question pour plus d’informations.

Je ne me soucie plus de QT en particulier, je cherche juste le plus moyen le plus canonique de trouver le type mime via des appels de fonction C ++ / c sur KDE et gnome (en particulier Gnome, puisque c’est là que les choses me déroutent le plus). Je veux pouvoir afficher des icônes et des descriptions correspondant à Nautilus dans Gnome et Konquerer / que ce soit sur KDE, ouvrir des fichiers de manière appropriée, etc.

Je suppose que ce n’est pas grave si je l’obtiens séparément pour KDE et Gnome. La grande question est de savoir quel est le moyen le plus courant / le meilleur / le plus canonique d’obtenir toutes ces informations pour le bureau Linux. La documentation de Gnome est particulièrement opaque. gnome-vsf a des routines mime, mais il est obsolète et je ne trouve pas de routine mime pour GIO / GFS, le remplacement de gnome-vsf. Il y a une vague suggestion que l'on devrait utiliser les applications de bureau ouvertes, mais celle qui est utilisée est obscure. Et où se situent libmagic et xdg?

Pointeurs vers un essai résumant les problèmes acceptés avec joie. Encore une fois, je sais que la réponse en trois lignes est "Aucun animal de ce genre". mais je cherche la réponse longue .

Était-ce utile?

La solution

Voici un exemple d'utilisation de GLib / GIO pour obtenir les informations souhaitées.

#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;
}

Autres conseils

Vous pouvez utiliser les outils disponibles sur xdg , notamment xdg-mime requête .

Pour connaître le type de fichier, par exemple, un fichier index.html que vous feriez

$ xdg-mime query filetype index.html

Ceci retournera le type MIME. Pour demander quelle application est associée à ce mimetye, utilisez par exemple

.
$ xdg-mime query default text/html

Ceci retourne epiphany.desktop ici, c'est-à-dire $ APPNAME.desktop , il est donc facile d'extraire le nom de l'application. Si vous souhaitez simplement ouvrir le fichier dans l’application par défaut, vous pouvez bien sûr exécuter

$ xdg-open index.html

qui déclencherait l'épiphanie.

Les fonctions de requête pour les ressources d'icônes ne semblent pas être disponibles dans xdg-utils , mais vous pouvez écrire un petit script python à l'aide de pyxdg qui offre également une multitude de fonctionnalités supplémentaires.

Pour les liaisons en C, vous devrez probablement consulter le code portland . sur la page xdg .

EDIT:

En ce qui concerne libmagic et ses amis, vous devrez choisir vos préférences: bien que libmagic semble être plus complet (et précis) en termes de couverture des types de fichiers, il ne s’en soucie pas tout sur les applications ou les icônes par défaut. De plus, il ne vous fournit pas les outils nécessaires pour installer des types MIME supplémentaires.

Dans Qt > = 4.6, une nouvelle fonction est disponible pour les systèmes X11

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

Vous pouvez utiliser cette fonction. Documentation ici / (Qt 5)

Ni QFileIconProvider ni QFileInfo ne feront quoi que ce soit avec la base de données OS mime. Pour accéder aux icônes associées à différents types MIME, vous devez utiliser les fonctions de l'environnement de bureau sous-jacent. En Qt, il n'y a pas (encore) de voie canonique.

Considérez que vous pouvez avoir une icône différente dans Gnome, KDE et Windows. Ainsi, par exemple, dans KDE, vous utiliseriez KMimeType .

Je viens de trouver KFileItem . Cette classe vous donne tout ce dont vous avez besoin pour les icônes, les types MIME et les objets associés dans KDE. Je suis sûr qu'il existe un équivalent dans gnome mais cela donne un accès au même niveau qu'une application QT.

Vous pouvez utiliser le système " /etc/mime.types" fichier. C'est également une bonne idée de conserver la copie de votre programme d'un fichier de type MIME. De cette façon, vous ne dépendez pas du système, mais vous devez en même temps le garder assez exhaustif. Pas sûr des icônes.

Peut-être jetez un oeil à ce code: http: //ftp.devil-linux. org / pub / devel / sources / 1.2 / file-4.23.tar.gz

Il s'agit de l'utilitaire de fichier standard que l'on trouve sur la plupart des distributions Linux / Unix. Vous obtiendrez le type MIME et quelques informations supplémentaires.

Je pense que Gnome et KDE ont chacun leur propre façon de déterminer cela et également de définir l'icône et l'application standard correspondante.

Quoi qu’il en soit, cet outil est probablement le meilleur moyen d’obtenir le type MIME et la description du document. Et dans certains cas, même quelques détails sur le contenu.

Cela vous donnera le type mime. C’est ce dont vous avez besoin de toute façon pour savoir comment vous pouvez ouvrir le fichier. Ce sont des étapes séparées. Le fichier ne vous dit pas à propos de l'icône ni de l'application avec laquelle ouvrir le fichier.

Environ 8 ans de retard, mais toujours utile.

Pour obtenir les applications associées dans KDE, vous pouvez faire ce que Joe a suggéré (en utilisant KFileItem ). Cependant, cela nécessite l'inclusion d'un grand nombre de bibliothèques. Le code ci-dessous nécessite moins.

#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();
  }
}

Pour compiler le code, ajoutez QT + = KService KCoreAddons à votre fichier qmake .pro .

Liens vers KMimeTypeTrader & amp; Documentation KService:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top