c++ - directo - lanzador de aplicacion sin confianza
¿Cómo se obtiene el icono, el tipo MIME y la aplicación asociada con un archivo en el escritorio de Linux? (7)
Acabo de encontrar KFileItem . Esta clase te ofrece todo lo que necesitas para íconos, tipos de mimos y cosas relacionadas en KDE. Estoy seguro de que hay un equivalente en gnome pero esto da acceso al mismo nivel en que funciona una aplicación QT.
Al usar C ++ en el escritorio de Linux, ¿cuál es la mejor manera de obtener el ícono, la descripción del documento y la aplicación "asociada" a una ruta de archivo / archivo arbitraria?
Me gustaría usar 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" a la línea de comandos y "bajo Las rutinas de "nivel" evitan reinventar la rueda yo mismo (sin analizar el archivo de tipo mime y demás).
Ediciones y notas:
Hola, 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 correcta en la medida de lo posible. PERO esta es una situación tan complicada que estoy abriendo la pregunta en busca de más información.
En particular, ya no me importa QT, solo busco la forma más canónica de encontrar el tipo mime a través de las llamadas de función C ++ / c en KDE y gnome (especialmente Gnome, ya que es donde las cosas me confunden más) . Quiero poder mostrar iconos y descripciones que coincidan con Nautilus en Gnome y Konquerer / lo que sea en KDE, así como abrir archivos de forma adecuada, 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 del gnomo es especialmente opaca. gnome-vsf tiene rutinas mime pero está en desuso y no puedo encontrar una rutina mime para GIO / GFS, reemplazo de gnome-vsf. Existe una vaga implicación de que uno debería 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 aceptados con mucho gusto. Una vez más, sé que la respuesta de las tres líneas es "no hay tal animal", pero estoy buscando la respuesta larga .
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 utilizar esta función. Documentación aquí / (Qt 5)
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 esa manera, usted no depende del sistema, pero al mismo tiempo necesita mantenerlo bastante exhaustivo. No estoy seguro acerca de los iconos.
Este es 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;
}
Ni QFileIconProvider ni QFileInfo harán nada con la base de datos mime del SO. Para acceder a los iconos asociados con diferentes tipos de mime, tendrá que usar las funciones del entorno de escritorio subyacente. En Qt no hay (todavía) ninguna forma canónica.
Considere que puede tener un ícono diferente en Gnome, en KDE y en Windows. Entonces, por ejemplo, en KDE KMimeType .
Puede usar las herramientas disponibles de xdg para eso, en particular la consulta xdg-mime query
.
Para averiguar el tipo de archivo de, por ejemplo, un archivo index.html
, debería
$ xdg-mime query filetype index.html
Esto devolverá el mimetype. Para consultar qué aplicación está asociada con ese uso mimético, 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, por supuesto podría ejecutar
$ xdg-open index.html
Lo que encendería la epifanía.
Las funciones de consulta para los 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 los enlaces de C, probablemente necesitará echar un vistazo al código de portland vinculado en la página xdg .
EDITAR:
Con respecto a libmagic
y sus amigos, deberá decidir cuáles son sus preferencias: mientras que libmagic parece ser más completo (y preciso) en términos de cobertura para tipos de archivo, no le importa en absoluto las aplicaciones o íconos predeterminados. Tampoco le proporciona herramientas para instalar tipos de mima adicionales.
Quizás vea este código: http://ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz
Este es el uso estándar de archivos que se encuentra 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 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 necesitas de todos modos para saber cómo puedes abrir el archivo. Estos son pasos separados. el archivo no le dice acerca del icono ni la aplicación para abrir el archivo.