¿Cómo se obtiene el icono, el tipo MIME y la aplicación asociados con un archivo en el escritorio de Linux?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Usando C ++ en el escritorio de Linux, ¿cuál es la mejor manera de obtener el icono, la descripción del documento y la aplicación "asociada"? con un archivo arbitrario / ruta de archivo?

Me gustaría utilizar la mayoría de los "canónicos" manera de encontrar íconos, descripciones de tipo mime-type / file y aplicaciones asociadas tanto en KDE como en gnome y me gustaría evitar cualquier "desvanecimiento" a la línea de comando y " bajo nivel " rutinas, así como evitar reinventar la rueda yo mismo (sin analizar el archivo de tipos MIME y tal).

Ediciones y notas:

Oye, originalmente hice esta pregunta sobre el objeto de información del archivo QT y la respuesta de que "no hay una respuesta clara". parece ser correcto en lo que va. PERO esta es una situación tan jodida que estoy abriendo la pregunta en busca de más información.

Ya no me importa QT en particular, solo estoy buscando la forma canónica most para encontrar el tipo mime a través de llamadas de función C ++ / c en KDE y gnome (especialmente Gnomo, ya que ahí es donde las cosas me confunden más). Quiero poder mostrar íconos y descripciones que coincidan con Nautilus en Gnome y Konquerer / lo que sea en KDE, así como abrir archivos adecuadamente, etc.

Supongo que está bien que obtenga esto por separado para KDE y Gnome. La gran pregunta es ¿cuál es la forma más común / mejor / canónica de obtener toda esta información para el escritorio de Linux? La documentación de Gnome es especialmente opaca. gnome-vsf tiene rutinas mime pero está en desuso y no puedo encontrar una rutina mime para GIO / GFS, el reemplazo de gnome-vsf. Existe una vaga implicación de que uno debe usar las aplicaciones de escritorio abiertas, pero cuál usar es oscuro. ¿Y dónde encajan libmagic y xdg?

Punteros a un ensayo que resume los temas con mucho gusto aceptado. Una vez más, sé que la respuesta de tres líneas es "no existe ese animal". pero estoy buscando la respuesta larga .

¿Fue útil?

Solución

Aquí hay un ejemplo del uso de GLib / GIO para obtener la información que desea.

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

Otros consejos

Puede usar las herramientas disponibles en xdg para eso, en particular xdg-mime consulta .

Para averiguar el tipo de archivo, p. un archivo index.html que lo haría

$ xdg-mime query filetype index.html

Esto devolverá el tipo mime. Para consultar qué aplicación está asociada con ese mimetye, por ejemplo,

$ xdg-mime query default text/html

Esto devuelve epiphany.desktop aquí, es decir, $ APPNAME.desktop , por lo que es fácil obtener el nombre de la aplicación. Si solo desea abrir el archivo en la aplicación predeterminada, podría ejecutar

$ xdg-open index.html

que dispararía la epifanía.

Las funciones de consulta para recursos de iconos no parecen estar disponibles en xdg-utils , pero puede escribir un pequeño script de Python usando pyxdg que también ofrece toneladas de funcionalidades adicionales.

Para los enlaces en C probablemente necesitará echar un vistazo al código portland vinculado en la xdg .

EDIT:

Con respecto a libmagic y sus amigos, deberá decidir sus preferencias: Si bien libmagic parece ser más completo (y preciso) en términos de cobertura de tipos de archivos, a no le importa todo sobre aplicaciones o iconos predeterminados. Tampoco le proporciona herramientas para instalar tipos MIME adicionales.

En Qt > = 4.6, hay una nueva función para los sistemas X11

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

Puede usar esta función. Documentación aquí / (Qt 5)

Ni QFileIconProvider ni QFileInfo harán nada con la base de datos mime del sistema operativo. Para acceder a los iconos asociados con diferentes tipos de MIME, deberá utilizar las funciones del entorno de escritorio subyacente. En Qt no hay (todavía) forma canónica.

Considere que puede tener un icono diferente en Gnome, en KDE y en Windows. Entonces, por ejemplo, en KDE usaría KMimeType .

Acabo de encontrar KFileItem . Esta clase le brinda todo lo que necesita para iconos, tipos mime y cosas relacionadas en KDE. Estoy seguro de que hay un equivalente en gnome, pero esto da acceso al mismo nivel que funciona una aplicación QT.

Es posible que desee utilizar el sistema " /etc/mime.types" expediente. También es una buena idea mantener la copia de su programa de un archivo de tipo MIME. De esa manera, no depende del sistema, pero al mismo tiempo debe mantenerlo bastante exhaustivo. No estoy seguro acerca de los iconos.

Quizás eche un vistazo a este código: http: //ftp.devil-linux. org / pub / devel / sources / 1.2 / file-4.23.tar.gz

Esta es la utilidad de archivo estándar que se encuentra en la mayoría de las distribuciones de Linux / Unix. Obtendrá el tipo MIME y algo más de información.

Creo que tanto Gnome como KDE tienen sus propias formas de determinar esto y también de configurar el icono y la aplicación estándar para ello.

De todos modos, esa herramienta de archivo es probablemente la mejor manera de obtener el tipo MIME y la descripción del documento. Y en algunos casos, incluso algunos detalles sobre el contenido.

Esto te dará el tipo mime. Eso es lo que necesita de todos modos para saber cómo puede abrir el archivo. Estos son pasos separados. el archivo no dice sobre el icono ni la aplicación para abrir el archivo.

Aproximadamente 8 años de retraso, pero sigue siendo útil.

Para obtener las aplicaciones asociadas en KDE, puede hacer lo que Joe sugirió (usando KFileItem ). Sin embargo, eso requiere la inclusión de muchas bibliotecas. El siguiente código requiere menos.

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

Para compilar el código, agregue QT + = KService KCoreAddons a su archivo qmake .pro .

Enlaces a KMimeTypeTrader & amp; Documentación de KService:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top