Unity Launcher API dla C ++

10

Próbuję opracować jakiś program w QT z QT SDK. Wczoraj czytałem o API Unity Launcher na oficjalnej stronie Ubuntu. Ale jest tylko przykład dla Vala i Pythona. Można używać interfejsu API Unity Launcher (szybkie listy, liczniki i paski postępu) z językiem C ++, a jeśli to możliwe, proszę podać przykład.

kv1dr
źródło
Co to za język Qt ?. Czy mówisz o QScript, czy tylko pytasz o przykład C lub C ++?
Javier Rivera,
Mówię o tym: qt.nokia.com/products O ile rozumiem, Qt to tylko framework dla C ++.
kv1dr 10.10.11
Jest to nie tylko pełna biblioteka, której można używać z mnóstwem języków, w tym z Pythonem. Rozumiem, że prosisz o przykład C ++, jeśli używasz Qt lub innej biblioteki, nie ma to znaczenia. Czy możesz edytować pytanie, aby było jasne? (BTW: Unity 2D jest zrobione z Qt),
Javier Rivera
Ok, więc ... Mam na myśli przykład dla C ++ :)
kv1dr 10.10.11

Odpowiedzi:

6

Uczę się również Qt i próbowałem znaleźć sposób na użycie Unity API w Qt, mogłem używać tylko Dbus API, ale nie mam szczęścia z Quicklist, ponieważ potrzebuje DbusMenu i nie wiem, jak to zaimplementować (wciąż się uczę :) ).

To przykład, który stworzyłem dla siebie i mam nadzieję, że będzie użyteczny dla innych. Może deweloperzy Unity mogą pomóc w poprawieniu / naprawieniu / dodaniu do niego nowego kodu (szybkiej listy) :)

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

pobierz przykład tutaj http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

lisoman
źródło
Nie mam doświadczenia w C ++, ale dlaczego po prostu zaimportujesz lib libity (#include <unity / unity / unity.h>) i korzystasz z API?
Javier Rivera
Dziękuję foxoman. Działa to jak urok :) Ostrzeżenie dla wszystkich: Nie zapomnij o pierwszym kroku (tak jak ja), w przeciwnym razie to nie zadziała. :) (Pierwszy krok: dodaj tę linię do pliku projektu Qt .pro QT += dbus)
kv1dr
@JavierRivera: Próbowałem zaimportować libunity, ale nie można znaleźć unity.h. Istnieje mnóstwo bibliotek, które mogę zaimportować (zgodnie z funkcją autouzupełniania), ale nie ma biblioteki o nazwie jedność.
kv1dr 11.10.11
1
Ups, zapomniałem zainstalować libunity-dev. Ale teraz jest inny problem z glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), ale mam libglib2.0-devzainstalowany.
kv1dr 11.10.11
2
@Javier Rivera: Próbowałem użyć libunity z pomocą QLibrary, ale osiągnięcie tego samego rezultatu przy pomocy interfejsu API dbus wymagało wiele wysiłku.
foxoman
4

Obecnie nie ma określonej biblioteki umożliwiającej dostęp do funkcji uruchamiania z Qt C ++. Istnieje biblioteka lib libibility, ale jest zorientowana na glib, więc nie jest odpowiednia dla Qt. Jak wspomniano w drugiej odpowiedzi, najwygodniejszym sposobem integracji z programem uruchamiającym jest użycie niskopoziomowego interfejsu API dbus .

Podstawowa koncepcja integracji z programem uruchamiającym polega na wysłaniu sygnału do programu uruchamiającego z identyfikatorem aplikacji i zestawem właściwości. Identyfikator aplikacji to nazwa pliku .desktop, zwykle przechowywanego w /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);

Licznik

Aby ustawić licznik, musisz ustawić właściwości tak, aby liczba była widoczna i nadać jej pożądaną wartość całkowitą:

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

Pasek postępu

Aby ustawić pasek postępu, musisz ustawić właściwości tak, aby postęp był widoczny i nadać mu pożądaną podwójną wartość:

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

Szybka lista

Skróconą listę można ustawić za pomocą biblioteki dbusmenu Qt. Musisz dołączyć plik nagłówka:

#include <dbusmenuexporter.h>

Szybka lista jest tworzona jako QMenumenu w Qt. To menu jest „eksportowane” przez dbusmenu za pomocą DBusMenuExporterobiektu. Podczas eksportowania nadajesz temu obiektowi unikalną ścieżkę, a następnie odwołujesz się do tej ścieżki, aby powiedzieć elementowi uruchamiającemu, które menu wyświetlić jako szybką listę.

W deklaracji klasy okna głównego dodaj następujące zmienne instancji:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Następnie w funkcji konstruktora:

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

Aby dodać elementy do menu, użyj metody [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) menu, aby dodać [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) obiekty.

Aby ustawić szybką listę ikony programu uruchamiającego, ustaw właściwość sygnału „szybka lista”:

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

Konfigurowanie pliku projektu

Trzeba skonfigurować plik .pro dodać dbus wsparcia: QT += dbus. Aby budować z obsługą szybkiej listy, musisz mieć libdbusmenu*devzainstalowane biblioteki programistyczne dbusmenu-qt ( ). Następnie możesz dodać do pliku projektu następujące elementy, aby uwzględnić bibliotekę 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
}

Przykład zastosowania

Aby zobaczyć pełny przykład z wykorzystaniem wszystkich funkcji uruchamiania z Qt, spójrz na ten projekt Github .

lazyteq
źródło