API de Unity Launcher para C ++

10

Estoy tratando de desarrollar algún programa en QT con QT SDK. Ayer estaba leyendo sobre Unity Launcher API en el sitio web oficial de ubuntu. Pero solo hay ejemplos para Vala y Python. Es posible usar la API de Unity Launcher (listas rápidas, contadores y barras de progreso) con lenguaje C ++ y, si es posible, publique un ejemplo.

kv1dr
fuente
¿Cuál es ese lenguaje Qt? ¿Estás hablando de QScript o solo estás pidiendo un ejemplo de C o C ++?
Javier Rivera
Estoy hablando de esto: qt.nokia.com/products Por lo que entiendo, Qt es solo un marco para C ++.
kv1dr
No solo, es una biblioteca completa que se puede usar con muchos lenguajes, incluido Python. Entiendo que está pidiendo un ejemplo de C ++, si usa Qt o cualquier otra biblioteca no importa. ¿Puedes editar la pregunta para que quede clara? (Por cierto: Unity 2D está hecho con Qt),
Javier Rivera
Ok, entonces ... quiero decir un ejemplo para C ++ :)
kv1dr

Respuestas:

6

También estoy aprendiendo Qt y traté de encontrar una manera de usar Unity API en Qt, solo pude usar Dbus API, pero no tuve suerte con Quicklist ya que necesita un DbusMenu y no sé cómo implementar eso (todavía estoy aprendiendo :) )

Este es el ejemplo que creé para mí mismo y espero que sea útil para otros. Tal vez los desarrolladores de Unity puedan ayudar a corregir / corregir / agregar un nuevo código (lista rápida) :)

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

descargue el ejemplo aquí http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

zorro
fuente
No tengo ninguna experiencia en C ++, pero ¿por qué no solo importas libunity (#include <unity / unity / unity.h>) y usas la API?
Javier Rivera
Gracias foxoman. Esto funciona a las mil maravillas :) Advertencia para todos: no olviden el primer paso (como lo hice), de lo contrario esto no funcionará. :) (Primer paso: agregue esta línea a su archivo de proyecto Qt .pro QT += dbus)
kv1dr
@JavierRivera: Traté de importar la libertad, pero no encuentra la unidad.h. Hay un montón de bibliotecas que puedo importar (de acuerdo con la función de autocompletar), pero no hay una biblioteca llamada unit.
kv1dr
1
whoops, olvidé instalar libunity-dev. Pero ahora, hay otro problema con glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), pero lo he libglib2.0-devinstalado.
kv1dr
2
@Javier Rivera: Traté de usar la libertad con la ayuda de QLibrary, pero me tomó mucho esfuerzo alcanzar el mismo resultado con dbus api.
foxoman
4

Actualmente no hay una biblioteca específica para acceder a la funcionalidad del iniciador desde Qt C ++. Hay una biblioteca de libunidad, pero está orientada en gran medida, por lo que es relativamente inadecuada para Qt. Como se menciona en la otra respuesta, la forma más conveniente de integrarse con el iniciador es utilizar la API dbus de bajo nivel .

El concepto básico de cómo integrarse con el iniciador es enviar una señal al iniciador con un ID de aplicación y un conjunto de propiedades. El ID de la aplicación es el nombre del archivo .desktop, normalmente almacenado en /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);

Mostrador

Para establecer el contador, deberá establecer las propiedades de modo que el recuento sea visible y darle el valor entero deseado:

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

Barra de progreso

Para establecer la barra de progreso, deberá establecer las propiedades de modo que el progreso sea visible y darle el doble valor deseado:

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

La lista rápida se puede configurar utilizando la biblioteca dbusmenu Qt. Deberá incluir el archivo de encabezado:

#include <dbusmenuexporter.h>

La lista rápida se crea como un QMenumenú en Qt. Este menú se 'exporta' a través de dbusmenu usando un DBusMenuExporterobjeto. Al exportar, le da a este objeto una ruta única y luego hace referencia a esa ruta para indicarle al elemento del iniciador qué menú mostrar como lista rápida.

En su declaración de clase de ventana principal, agregue las siguientes variables de instancia:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Luego, en la función constructora:

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 agregar elementos al menú, utilice el método [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) del menú para agregar [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) objetos.

Para configurar la lista rápida del icono del iniciador, configure la propiedad 'lista rápida' de la señal:

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

Configurar el archivo del proyecto

Usted tendrá que configurar el archivo .pro para añadir soporte dbus: QT += dbus. Para construir con soporte de lista rápida, necesitará tener instaladas las bibliotecas de desarrollo dbusmenu-qt ( libdbusmenu*dev). Luego puede agregar lo siguiente al archivo del proyecto para incluir la 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
}

Aplicación de ejemplo

Para ver un ejemplo completo con todas las funciones del iniciador de Qt, mira este proyecto de Github .

lazyteq
fuente