API Unity Launcher pour C ++

10

J'essaie de développer un programme en QT avec QT SDK. Hier, je lisais sur l'API Unity Launcher sur le site officiel ubuntu. Mais il n'y a d'exemple que pour Vala et python. Est-il possible d'utiliser l'API Unity Launcher (listes rapides, compteurs et barres de progression) avec le langage C ++ et si c'est possible, veuillez poster un exemple.

kv1dr
la source
Quelle est cette langue Qt?. Parlez-vous de QScript ou demandez-vous simplement un exemple C ou C ++?
Javier Rivera
J'en parle: qt.nokia.com/products Autant que je sache, Qt n'est qu'un cadre pour C ++.
kv1dr
Non seulement, c'est une bibliothèque complète qui peut être utilisée avec de nombreuses langues, y compris Python. Je comprends que vous demandez un exemple C ++, si vous utilisez Qt ou toute autre bibliothèque n'a pas d'importance. Pouvez-vous modifier la question pour la rendre claire?. (BTW: Unity 2D est fait avec Qt),
Javier Rivera
Ok alors ... je veux dire un exemple pour C ++ :)
kv1dr

Réponses:

6

J'apprends également Qt et j'ai essayé de trouver un moyen d'utiliser l'API Unity dans Qt, je ne pouvais utiliser que l'API Dbus, mais pas de chance avec Quicklist car il a besoin d'un DbusMenu et je ne sais pas comment l'implémenter (toujours en train d'apprendre :) ).

C'est l'exemple que j'ai créé pour moi-même et j'espère qu'il sera utile aux autres. Peut-être que les développeurs Unity peuvent aider à corriger / corriger / ajouter un nouveau code (liste rapide) :)

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

téléchargez l'exemple ici http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

Foxoman
la source
Je n'ai aucune expérience en C ++, mais pourquoi ne pas simplement importer la libunity (#include <unité / unité / unité.h>) et utiliser l'API?
Javier Rivera
Merci Foxoman. Cela fonctionne comme un charme :) Avertissement pour tout le monde: N'oubliez pas la première étape (comme je l'ai fait), sinon cela ne fonctionnera pas. :) (Première étape: ajoutez cette ligne à votre fichier de projet Qt .pro QT += dbus)
kv1dr
@JavierRivera: J'ai essayé d'importer la libunity, mais il ne trouve pas unit.h. Il y a une tonne de bibliothèques que je peux importer (selon la fonction de saisie semi-automatique), mais il n'y a pas de bibliothèque nommée unité.
kv1dr
1
oups, j'ai oublié d'installer libunity-dev. Mais maintenant, il y a un autre problème avec glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), mais j'ai libglib2.0-devinstallé.
kv1dr
2
@Javier Rivera: J'ai essayé d'utiliser libunity avec l'aide de QLibrary mais il faut beaucoup d'efforts pour arriver au même résultat avec dbus api.
foxoman
4

Il n'existe pas actuellement de bibliothèque spécifique pour accéder aux fonctionnalités du lanceur à partir de Qt C ++. Il existe une bibliothèque de libunity mais elle est fortement orientée glib et est donc relativement peu adaptée à Qt. Comme mentionné dans l'autre réponse, la façon la plus pratique de s'intégrer au lanceur est d'utiliser l' API dbus de bas niveau .

Le concept de base de l'intégration avec le lanceur est d'envoyer un signal au lanceur avec un ID d'application et un ensemble de propriétés. L'ID d'application est le nom de fichier du fichier .desktop, normalement stocké dans /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);

Compteur

Pour définir le compteur, vous devrez définir les propriétés de sorte que le nombre soit visible et lui donner la valeur entière souhaitée:

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

Barre de progression

Pour définir la barre de progression, vous devrez définir les propriétés de manière à ce que la progression soit visible et lui donner la valeur double souhaitée:

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

Liste rapide

La liste rapide peut être définie à l'aide de la bibliothèque dbusmenu Qt. Vous devrez inclure le fichier d'en-tête:

#include <dbusmenuexporter.h>

La liste rapide est créée sous forme de QMenumenu dans Qt. Ce menu est «exporté» via dbusmenu à l'aide d'un DBusMenuExporterobjet. Lors de l'exportation, vous donnez à cet objet un chemin unique, puis référencez ce chemin pour indiquer à l'élément du lanceur le menu à afficher sous forme de liste rapide.

Dans votre déclaration de classe de fenêtre principale, ajoutez les variables d'instance suivantes:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Ensuite, dans la fonction constructeur:

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);

Pour ajouter des éléments au menu, utilisez la méthode [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) du menu pour ajouter [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) objets.

Pour définir la liste rapide de l'icône du lanceur, définissez la propriété «liste rapide» du signal:

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

Configuration du fichier de projet

Vous devrez configurer le fichier .pro pour ajouter le support dbus: QT += dbus. Pour construire avec la prise en charge de la liste rapide, vous devrez installer les bibliothèques de développement dbusmenu-qt ( libdbusmenu*dev). Vous pouvez ensuite ajouter ce qui suit au fichier de projet pour inclure la bibliothèque 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
}

Exemple d'application

Pour voir un exemple complet utilisant toutes les fonctionnalités du lanceur de Qt, regardez ce projet Github .

lazyteq
la source