web-dev-qa-db-fra.com

API Unity Launcher pour C ++

J'essaie de développer un programme QT avec QT SDK. Hier, je lisais à propos de nity Launcher API sur le site Web officiel d'ubuntu. Mais il n'y a qu'un exemple pour Vala et python. Il est possible d'utiliser l'API Unity Launcher (listes rapides, compteurs et barres de progression) avec le langage C++ et, si possible, postez un exemple.

10
kv1dr

J'apprenais aussi 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 nécessite un DbusMenu et je ne sais pas comment l'implémenter (j'apprends toujours :) ).

C'est l'exemple que j'ai créé pour moi-même et j'espère que c'est utile pour les autres. Peut-être que les développeurs de 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

6
foxoman

Il n'existe actuellement aucune bibliothèque spécifique pour accéder aux fonctionnalités de lanceur à partir de Qt C++. Il y a une librairie de libunity mais elle est fortement orientée glib, elle est donc relativement inadaptée à Qt. Comme mentionné dans l’autre réponse, le moyen le plus pratique de s’intégrer au programme de lancement est d’utiliser la API de niveau bas dbus .

Le concept de base de l'intégration avec le programme de lancement consiste à envoyer un signal au programme de lancement avec un ID d'application et un ensemble de propriétés. L'ID d'application est le nom 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 devez définir les propriétés de sorte que le compte soit visible et lui attribuer 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 devez définir les propriétés de sorte que la progression soit visible et lui attribuer 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 menu QMenu dans Qt. Ce menu est "exporté" via dbusmenu à l'aide d'un objet DBusMenuExporter. Lors de l'exportation, vous attribuez à cet objet un chemin unique, puis référencez ce chemin pour indiquer à l'élément de lancement quel menu afficher comme 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).

Pour définir la liste rapide de l'icône du lanceur, définissez la propriété 'quicklist' 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 pouvoir créer un support avec la liste rapide, vous devez avoir installé les bibliothèques de développement dbusmenu-qt (libdbusmenu*dev). Vous pouvez ensuite ajouter les éléments suivants 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 ceci projet Github .

4
lazyteq