API do Unity Launcher para C ++

10

Estou tentando desenvolver algum programa no QT com o QT SDK. Ontem eu estava lendo sobre a API do Unity Launcher no site oficial do Ubuntu. Mas há exemplo apenas para Vala e python. É possível usar a API do Unity Launcher (listas rápidas, contadores e barras de progresso) com linguagem C ++ e, se possível, poste um exemplo.

kv1dr
fonte
O que é essa linguagem Qt? Você está falando sobre o QScript ou está apenas pedindo um exemplo em C ou C ++?
Javier Rivera
Estou falando sobre isso: qt.nokia.com/products Por mais que eu entenda, o Qt é apenas uma estrutura para C ++.
kv1dr
Não é apenas uma biblioteca completa que pode ser usada com muitas linguagens, incluindo Python. Entendo que você está pedindo um exemplo de C ++, se você usa o Qt ou qualquer outra biblioteca, não importa. Você pode editar a pergunta para esclarecer? (BTW: Unity 2D é feita com o Qt),
Javier Rivera
Ok, então ... eu quero dizer um exemplo para C ++ :)
kv1dr 10/10

Respostas:

6

Também estou aprendendo Qt e tentei encontrar uma maneira de usar a API do Unity no Qt, só consegui usar a API Dbus, mas não tive sorte com o Quicklist, pois ele precisa de um DbusMenu e não sei como implementá-lo (ainda estou aprendendo :) )

Este é o exemplo que eu criei para mim e espero que seja útil para os outros. Talvez os desenvolvedores do Unity possam ajudar a corrigir / corrigir / adicionar novo código (lista rápida) a ele :)

/*
    Unity Launcher Dbus API exmable for Qt
    foxoman [gplus.to/foxoman][[email protected]]

    https://wiki.ubuntu.com/Unity/LauncherAPI#Low_level_DBus_API:_com.canonical.Unity.LauncherEntry

    First step : add this line to your Qt project file .pro
     QT       += dbus
*/

/* I will run this example as Qt console apps */
#include <QtCore/QCoreApplication>

/* Include Qt Dbus required */
#include <QtDBus>

// Qt Main Method
int main(int argc, char *argv[])
{


    /* Qt console Main Loop [ in GUI application the Main loop is QApplication ]
        Unity API need Main Loop to run */
    QCoreApplication a(argc, argv);


    /* Create Qt Dbus Signal to send Dbus Message to unity Dbus API
        signal com.canonical.Unity.LauncherEntry.Update (in s app_uri, in a{sv} properties)
    */
    QDBusMessage signal = QDBusMessage::createSignal(
     "/", /* Path */
     "com.canonical.Unity.LauncherEntry", /* Unity DBus Interface */
     "Update"); /* Update Signal */


    /* app_uri
       Desktop ID ex: firefox -> need to be pined in the launcher to see the effect
    */
    signal << "application://firefox.desktop";


    /* properties : A map of strings to variants with the properties to set on the launcher icon */
    QVariantMap setProperty;

    /* A number to display on the launcher icon */
    setProperty.insert("count", qint64(80));

    /* show count */
    setProperty.insert("count-visible", true);

    /* progress bar count must be float between 0 and 1 (mean from 0.00 to 0.100)*/
    setProperty.insert("progress", double(0.80));

    /* show progress bar */
    setProperty.insert("progress-visible", true);

    /* Tells the launcher to get the users attention  */
    setProperty.insert("urgent",true);

    /* Pack the properties Map to the signal */
    signal << setProperty;

    /* Send the signal */
    QDBusConnection::sessionBus().send(signal);


    return a.exec();
}

faça o download do exemplo aqui http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

foxoman
fonte
Não tenho nenhuma experiência em C ++, mas por que você não importa apenas a liberdade (#include <unity / unity / unity.h>) e usa a API?
21411 Javier Rivera
Obrigado foxoman. Isso funciona como um encanto :) Aviso para todos: Não esqueça o primeiro passo (como eu fiz), caso contrário, isso não funcionará. :) (Primeiro passo: adicione esta linha ao seu arquivo de projeto QT += dbus
.t do
@JavierRivera: Tentei importar libunidade, mas ela não encontra unity.h. Há uma tonelada de bibliotecas que posso importar (de acordo com a função de preenchimento automático), mas não há uma biblioteca chamada unidade.
kv1dr
1
Opa, eu esqueci de instalar o libunity-dev. Mas agora, há outro problema com glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), mas eu libglib2.0-devinstalei.
Kv1dr 11/11
2
@Javier Rivera: Tentei usar a liberdade com a ajuda da QLibrary, mas é preciso muito esforço para alcançar o mesmo resultado com o dbus api.
foxoman 11/11
4

No momento, não existe uma biblioteca específica para acessar a funcionalidade do iniciador no Qt C ++. Existe uma biblioteca de comunidade, mas ela é bastante orientada, portanto é relativamente inadequada para o Qt. Conforme mencionado na outra resposta, a maneira mais conveniente de integrar-se ao iniciador é usar a API dbus de baixo nível .

O conceito básico de como integrar-se ao iniciador é enviar um sinal ao iniciador com um ID do aplicativo e um conjunto de propriedades. O ID do aplicativo é o nome do arquivo .desktop, normalmente armazenado em /usr/share/applications:

//create the signal
QDBusMessage signal = QDBusMessage::createSignal("/", 
    "com.canonical.Unity.LauncherEntry", "Update");

//set the application ID
signal << "application://firefox.desktop";

//set the properties
QVariantMap properties;
    ...
signal << properties;

//send the signal
QDBusConnection::sessionBus().send(signal);

Contador

Para definir o contador, você precisará definir as propriedades para que a contagem fique visível e forneça o valor inteiro desejado:

qint64 counter_value = 1;
properties["count-visible"] = true; //set the count to visible
properties["count"] = counter_value; //set the counter value

Barra de progresso

Para definir a barra de progresso, você precisará definir as propriedades para que o progresso seja visível e forneça o valor duplo desejado:

double progress_value = 0.5;
properties["progress-visible"] = true; //set the progress bar to visible
properties["progress"] = progress_value; //set the progress value

Lista rápida

A lista rápida pode ser definida usando a biblioteca dbusmenu Qt. Você precisará incluir o arquivo de cabeçalho:

#include <dbusmenuexporter.h>

A lista rápida é criada como um QMenumenu no Qt. Este menu é 'exportado' no dbusmenu usando um DBusMenuExporterobjeto. Ao exportar, você atribui a esse objeto um caminho único e, em seguida, faz referência a esse caminho para informar ao item do iniciador qual menu exibir como uma lista rápida.

Na sua declaração de classe da janela principal, adicione as seguintes variáveis ​​de instância:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Então, na função construtora:

quicklist = new QMenu(this);
//exports the menu over dbus using the object: /com/me/myapp/quicklist
quicklist_exporter = new DBusMenuExporter("/com/me/myapp/quicklist", quicklist);

Para adicionar itens ao menu, use o método [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) do menu para adicionar [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html).

Para definir a lista rápida do ícone do iniciador, defina a propriedade 'lista rápida' do sinal:

properties["quicklist"] = "/com/me/myapp/quicklist";

Configurando o arquivo de projeto

Você precisará configurar o arquivo .pro para adicionar suporte dbus: QT += dbus. Para criar com o suporte da lista rápida, você precisará ter as bibliotecas de desenvolvimento dbusmenu-qt ( libdbusmenu*dev) instaladas. Você pode adicionar o seguinte ao arquivo do projeto para incluir a biblioteca dbusmenu:

#import the dbusmenu-qt library for quicklists
greaterThan(QT_MAJOR_VERSION, 4) {
    INCLUDEPATH += /usr/include/dbusmenu-qt5/
    LIBS += -ldbusmenu-qt5
} else {
    INCLUDEPATH += /usr/include/dbusmenu-qt/
    LIBS += -ldbusmenu-qt
}

Exemplo de aplicação

Para ver um exemplo completo usando toda a funcionalidade do iniciador do Qt, veja este projeto do Github .

lazyteq
fonte