Como você recebe o ícone, tipo MIME e aplicativo associado com um arquivo no Linux Desktop?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Usando C ++ no ambiente de trabalho Linux, qual é a melhor maneira de obter o ícone, a descrição do documento ea aplicação "associado" com um caminho de arquivo / arquivo arbitrário?

Eu gostaria de usar a forma mais "canônico" para encontrar ícones, mime-type / descrições de tipo de arquivo e aplicativos associados em ambos KDE e GNOME e eu gostaria de evitar qualquer "descascar para fora" para a linha de comando e rotinas "de baixo nível", bem como evitar a re-inventar a roda me (sem analisar o arquivo mime-types e tal).

Edições e Notas:

Ei, eu originalmente feito esta pergunta sobre as informações do arquivo objeto QT ea resposta que "não há uma resposta clara" parece ser correta, tanto quanto ele vai. Mas esta é uma situação tão ferrado que eu estou abrindo a questão à procura de mais informações.

Eu não me importo com QT em particular mais, eu só estou procurando o mais caminho canônico para encontrar o tipo mime através de chamadas ++ / c função C em ambos KDE e GNOME (especialmente Gnome, já que é onde as coisas que mais me) confundem. Eu quero ser ícones mostram capazes e descrições correspondentes Nautilus no Gnome e Konquerer / whatever no KDE, bem como arquivos de abertura de forma adequada, etc.

Acho que é OK que eu recebo este separadamente para KDE e Gnome. A grande questão é qual é a melhor maneira mais comum / / canônico para obter todas essas informações para o desktop Linux? Gnome documentação é especialmente opaco. gnome-VSF tem rotinas mime mas está obsoleto e não consigo encontrar uma rotina de mime para GIO / GFS, a substituição do gnome-VSF. Há uma vaga insinuação de que deve-se usar os aplicativos de desktop abertos, mas qual deles usar é obscura. E onde se encaixa libmagic e xdg em?

Ponteiros para um ensaio resumindo as questões aceitou de bom grado. Mais uma vez, eu sei a resposta de três linha é "tais animais não", mas eu estou olhando para o longo resposta.

Foi útil?

Solução

Aqui está um exemplo do uso GLib / GIO para obter as informações desejadas.

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

Outras dicas

Você pode usar as ferramentas disponíveis a partir xdg para que, em particular xdg-mime query.

Para saber o tipo de arquivo de exemplo um index.html arquivo que você faria

$ xdg-mime query filetype index.html

Isso irá retornar as mimetype. Para consulta qual aplicativo está associado a esse mimetye usar por exemplo.

$ xdg-mime query default text/html

Este retornos epiphany.desktop aqui, ou seja, $APPNAME.desktop, por isso é fácil de obter o nome da aplicação a partir dele. Se você apenas deseja abrir o arquivo no aplicativo padrão que você poderia, claro, apenas executar

$ xdg-open index.html

que o fogo até epifania.

funções de pesquisa para recursos de ícone não parecem estar disponível em xdg-utils, mas você poderia escrever um pequeno script Python usando pyxdg que oferece toneladas de funcionalidades adicionais, também.

Para ligações C você provavelmente terá que ter um olhar para o código portland ligados na href="http://portland.freedesktop.org/wiki" rel="nofollow noreferrer"> página .

EDIT:

No que diz respeito libmagic e amigos, você terá de decidir sobre suas preferências: Enquanto libmagic parece ser mais completo (e precisa) em termos de cobertura para tipos de arquivos, que não se importa em tudo sobre default aplicações ou ícones. Também não lhe fornecer ferramentas para instalar mimetypes extras.

Nem QFileIconProvider nem QFileInfo vai fazer nada com o banco de dados OS mime. Para ícones de acesso associados a diferentes tipos de MIME, você terá que usar as funções do ambiente de trabalho subjacente. Em Qt existe (ainda) nenhuma maneira canônica.

Considere que você pode ter um ícone diferente no Gnome, no KDE e no Windows. Assim, por exemplo, no KDE você usaria KMimeType .

Eu só descobri KFileItem . Esta classe dá-lhe tudo o que você para ícones, tipos MIME e coisas relacionadas no KDE. Tenho certeza de que não há um equivalente no gnome, mas este dá acesso ao mesmo nível de um QT aplicativo funciona.

Você pode querer usar "/etc/mime.types" arquivos do sistema. Também é uma boa idéia para manter a cópia do seu programa de um arquivo tipo MIME. Dessa forma, você não é dependente do sistema, mas, ao mesmo tempo que você precisa para mantê-lo bastante exaustiva. Não tenho certeza Icons.

Talvez dê uma olhada neste código: http: //ftp.devil-linux. org / pub / devel / sources / 1.2 / file-4.23.tar.gz

Este é o arquivo padrão util encontrado na maioria das distribuições Linux / Unix. Você vai ter o tipo MIME e mais algumas informações.

Eu acho que ambos Gnome e KDE têm suas próprias maneiras de determinar isso e também para definir o ícone eo aplicativo padrão para ele.

De qualquer forma, esse arquivo-ferramenta é provavelmente a melhor maneira de obter o tipo de mímica e a descrição do documento. E, em alguns casos, até mesmo alguns detalhes sobre o conteúdo.

Isso vai te dar o mime-type. Isso é o que você precisa de qualquer maneira de saber como você pode abrir o arquivo. Estes são passos seperated. arquivo não dizer-lhe sobre o ícone, nem a aplicação para abrir o arquivo com.

Sobre 8 anos de atraso, mas ainda útil.

Para obter os aplicativos associados no KDE que você pode fazer o que Joe sugeriu (usando KFileItem). No entanto, isso requer a inclusão de um grande número de bibliotecas. O código abaixo requer 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 o suplemento QT += KService KCoreAddons código ao seu arquivo qmake .pro.

Links para KMimeTypeTrader & KService documentação:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top