API Unity Launcher per C ++


10

Sto cercando di sviluppare alcuni programmi in QT con QT SDK. Ieri stavo leggendo dell'API Unity Launcher sul sito Web ufficiale di Ubuntu. Ma c'è un esempio solo per Vala e Python. È possibile utilizzare l'API Unity Launcher (liste rapide, contatori e barre di avanzamento) con linguaggio C ++ e, se possibile, pubblicare un esempio.


Cos'è quella lingua Qt ?. Stai parlando di QScript o stai solo chiedendo un esempio in C o C ++?
Javier Rivera,

Sto parlando di questo: qt.nokia.com/products Per quanto ho capito, Qt è solo un framework per C ++.
kv1dr,

Non solo, è una libreria completa che può essere utilizzata con molte lingue, incluso Python. Capisco che stai chiedendo un esempio C ++, se usi Qt o qualsiasi altra libreria non ha importanza. Puoi modificare la domanda per chiarirla ?. (A proposito: Unity 2D è realizzato con Qt),
Javier Rivera,

Ok allora ... intendo un esempio per C ++ :)
kv1dr,

Risposte:


6

Sto anche imparando Qt e ho cercato di trovare un modo per usare Unity API in Qt, ho potuto usare solo Dbus API, ma senza fortuna con Quicklist poiché ha bisogno di un DbusMenu e non so come implementarlo (ancora imparando :) ).

Questo è l'esempio che ho creato per me stesso e spero sia utile per gli altri. Forse gli sviluppatori Unity possono aiutare a correggere / correggere / aggiungere un nuovo codice (lista rapida) :)

/*
    Unity Launcher Dbus API exmable for Qt
    foxoman [gplus.to/foxoman][foxoman.u@gmail.com]

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

scarica qui l'esempio http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r


Non ho alcuna esperienza in C ++, ma perché non importate semplicemente libunity (#include <unity / unity / unity.h>) e utilizzate l'API?
Javier Rivera,

Grazie foxoman. Funziona come un incanto :) Avvertenza per tutti: non dimenticare il primo passo (come ho fatto io), altrimenti non funzionerà. :) (Primo passo: aggiungi questa riga al tuo file di progetto Qt .pro QT += dbus)
kv1dr,

@JavierRivera: ho provato a importare la libunità, ma non trova unity.h. Esistono moltissime librerie che posso importare (in base alla funzione di completamento automatico), ma non esiste una libreria chiamata unità.
kv1dr,

1
spiacenti, ho dimenticato di installare libunity-dev. Ma ora c'è un altro problema con glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), ma ho libglib2.0-devinstallato.
kv1dr,

2
@Javier Rivera: ho provato a usare la libunità con l'aiuto di QLibrary ma ci sono voluti molti sforzi per raggiungere lo stesso risultato con dbus api.
foxoman,

4

Al momento non esiste una libreria specifica per l'accesso alla funzionalità di avvio da Qt C ++. C'è una libreria di libunità, ma questa è fortemente orientata verso gli glib, quindi è relativamente inadatta a Qt. Come menzionato nell'altra risposta, il modo più conveniente per integrarsi con il programma di avvio è utilizzare l' API dbus di basso livello .

Il concetto di base su come integrarsi con il programma di avvio è l'invio di un segnale al programma di avvio con un ID applicazione e un set di proprietà. L'ID applicazione è il nome del file .desktop, normalmente archiviato in /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);

contatore

Per impostare il contatore, dovrai impostare le proprietà in modo che il conteggio sia visibile e assegnargli il valore intero desiderato:

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

Barra di avanzamento

Per impostare la barra di avanzamento, dovrai impostare le proprietà in modo tale che l'avanzamento sia visibile e dargli il doppio valore desiderato:

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

Quicklist

La lista rapida può essere impostata usando la libreria Qt di dbusmenu. Dovrai includere il file di intestazione:

#include <dbusmenuexporter.h>

L'elenco rapido viene creato come QMenumenu in Qt. Questo menu viene 'esportato' su dbusmenu usando un DBusMenuExporteroggetto. Durante l'esportazione, si assegna a questo oggetto un percorso univoco e quindi si fa riferimento a quel percorso per indicare all'elemento di avvio quale menu visualizzare come elenco rapido.

Nella dichiarazione della classe della finestra principale, aggiungi le seguenti variabili di istanza:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Quindi, nella funzione di costruzione:

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

Per aggiungere elementi al menu, utilizzare il metodo [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) del menu per aggiungere [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) oggetti.

Per impostare la lista rapida dell'icona di avvio, imposta la proprietà 'lista rapida' del segnale:

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

Configurazione del file di progetto

Sarà necessario configurare il file .pro per aggiungere il supporto dbus: QT += dbus. Per compilare con il supporto dell'elenco rapido, è necessario disporre delle librerie di sviluppo ( libdbusmenu*dev) dbusmenu-qt installate. È quindi possibile aggiungere quanto segue al file di progetto per includere la libreria 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
}

Esempio di applicazione

Per vedere un esempio completo usando tutte le funzionalità di avvio di Qt, guarda questo progetto Github .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.