2009-10-27 19 views
23

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 una ruta de archivo/archivo arbitraria?¿Cómo se obtiene el icono, el tipo MIME y la aplicación asociada a un archivo en el escritorio de Linux?

Me gustaría utilizar la forma más "canónica" de encontrar iconos, descripciones de tipo mime/tipo de archivo y aplicaciones asociadas tanto en KDE como en gnome y me gustaría evitar cualquier "bombardeo" al línea de comando y rutinas de "bajo nivel", así como evitar reinventar la rueda yo mismo (sin analizar el archivo mime-types y tal).

ediciones y Notas:

Hey, originalmente formulado esta pregunta sobre el QT fichero Info objeto y la respuesta que "no hay una respuesta clara" parece ser correcta en lo que va. PERO esta es una situación tan jodida que estoy abriendo la pregunta buscando más información.

No me importa acerca de QT en particular más, sólo estoy buscando la más forma canónica para encontrar el tipo MIME a través función de C++/C pide a KDE y GNOME (especialmente Gnome, ya que 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 también abrir archivos apropiadamente, 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 de mimo pero está obsoleto y no puedo encontrar una rutina de mimo para GIO/GFS, reemplazo de gnome-vsf. Hay 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?

Sugerencias para un ensayo que resuma los problemas aceptados con mucho gusto. Una vez más, sé que la respuesta de tres líneas es "no hay tal animal", pero estoy buscando la respuesta larga.

+0

Por cierto, sin más respuestas más detalladas, dejaré que la generosidad respuesta expira sin dar a nadie ... –

Respuesta

12

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; 
} 
+0

Me parece o menos como lo que estoy buscando. Cualquier enlace que documente estas funciones? –

+0

http://library.gnome.org/devel/gio/stable/ es la página principal para los documentos de GIO, en qué sección se encuentra una función debería ser obvia en función del nombre. –

+0

Se ve bien: GIO tiene como objetivo "proporcionar una API tan buena que los desarrolladores la prefieran a través de llamadas POSIX sin procesar" - ¡si los desarrolladores alguna vez pueden encontrar esta página! No hay enlaces desde las viejas páginas de gnomeVFS y no usa la palabra clave "Mime" o "asociaciones de archivos y no apareció en una búsqueda de Google bastante larga, bueno, ahora lo sé! Gracias –

1

Ni QFileIconProvider ni QFileInfo harán nada con la base de datos mime del sistema operativo. Para acceder a iconos asociados con diferentes tipos de mime, tendrá que usar funciones del entorno de escritorio subyacente. En Qt no hay (todavía) ninguna manera canónica.

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

+0

s/entorno de gestor/escritorio de Windows/ – ephemient

+0

Gracias, ninguna idea acerca de GNOME? –

+0

Ver mis notas de edición sobre cómo cambiar la dirección de la pregunta ... –

0

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

1

Acabo de encontrar KFileItem. Esta clase te ofrece todo lo que necesitas para iconos, tipos de mimo 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.

0

Tal vez echar un vistazo a este código: http://ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

Este es el archivo estándar util encontrado en la mayoría de las distribuciones de Linux/Unix. Obtendrá el tipo MIME y más información.

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

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

Esto le dará el tipo de mimo. 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 ícono ni la aplicación para abrir el archivo.

+0

¿Puede proporcionar una explicación un poco más? He estado revisando mucho código ya. –

+0

Además, el archivo no era válido cuando lo descargué –

+0

¿Qué es exactamente lo que quiere saber? ¿No conoces el comando 'archivo'? Simplemente abre una terminal y escribe "file $ somefile". Esta herramienta es muy buena para detectar automáticamente el tipo de archivo. Y es bastante estándar. He actualizado el enlace, parece que se ha vuelto inválido. – Albert

2

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

Para saber el tipo de archivo de, por ejemplo, un archivo index.html lo haría

$ xdg-mime query filetype index.html 

Esto devolverá el tipo MIME. Para consultar qué aplicación está asociada con ese mimetéo, p. Ej.

$ xdg-mime query default text/html 

Esto devuelve epiphany.desktop aquí, es decir $APPNAME.desktop, por lo que es fácil de obtener el nombre de la aplicación de la misma. Si usted acaba de querer abrir el archivo en la aplicación por defecto que podría, por supuesto, tan sólo ejecute

$ xdg-open index.html 

que el fuego de epifanía.

Las funciones de consulta para recursos de iconos no parecen estar disponibles en xdg-utils, pero podría escribir un pequeño script de python usando pyxdg que también ofrece toneladas de funcionalidad adicional.

Para encuadernaciones C, probablemente necesite echarle un vistazo al código portland vinculado en la página xdg.

EDIT:

En cuanto libmagic y amigos, usted tendrá que decidir sobre sus preferencias: Mientras libmagic parece ser más completa (y exacta) en términos de cobertura de tipos de archivos, que no se preocupa por lo todos sobre aplicaciones o iconos predeterminados. Tampoco le proporciona herramientas para instalar tipos miméticos adicionales.

+0

1. ¿Cómo podría llamar a xdg desde C++ 2. ¿Podría ampliar las diferencias de xdg/libmagic? –

+0

1. Los xdg-utils son solo scripts de shell, por lo que debe usar sth. como popen(). Si puedes usar pyth write sth. dedicado usando pyxdg (o reimplementar partes dedicadas en C++). 2. AFAIK xdg-utils son solo frontends para tratar con KDE o la extensión GNOME-> bases de datos mimetype y solo si estas fallan en el archivo libmagic/para identificar el tipo mimetype. Libmagic es un db que contiene incluso encabezados de archivos binarios, por lo que puede ser mucho más preciso. La gran ventaja del uso de xdg es que puede delegar la responsabilidad de algunas funciones fuera de su código en lugar de volver a escribir todo desde cero. –

3

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

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

Se puede utilizar esta función. Documentation here/(Qt 5)

Cuestiones relacionadas