Unity Launcher API для C ++

10

Я пытаюсь разработать какую-нибудь программу в QT с QT SDK. Вчера я читал об Unity Launcher API на официальном сайте Ubuntu. Но есть пример только для Vala и Python. Можно использовать Unity Launcher API (быстрые списки, счетчики и индикаторы выполнения) с языком C ++ и, если это возможно, пожалуйста, опубликуйте пример.

kv1dr
источник
Что это за язык Qt? Вы говорите о QScript или просто просите пример на C или C ++?
Хавьер Ривера
Я говорю об этом: qt.nokia.com/products Насколько я понимаю, Qt - это просто фреймворк для C ++.
kv1dr
Не просто, это полная библиотека, которую можно использовать с множеством языков, включая Python. Я понимаю, что вы запрашиваете пример C ++, если вы используете Qt или любую другую библиотеку, это не имеет значения. Можете ли вы отредактировать вопрос, чтобы было понятно? (Кстати: Unity 2D сделан с Qt),
Хавьер Ривера,
Хорошо, тогда ... Я имею в виду пример для C ++ :)
kv1dr

Ответы:

6

Я также изучаю Qt и пытался найти способ использовать Unity API в Qt, я мог использовать только Dbus API, но безуспешно с Quicklist, так как ему нужен DbusMenu, и я не знаю, как это реализовать (все еще учусь :) ).

Это пример, который я создал для себя, и я надеюсь, что это полезно для других. Может быть, разработчики Unity помогут исправить / исправить / добавить новый код (быстрый список) к нему :)

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

скачать пример здесь http://ubuntuone.com/1SLDPcN9OhrU6LD1wgDs3r

foxoman
источник
У меня нет никакого опыта в C ++, но почему бы вам просто не импортировать libunity (#include <unity / unity / unity.h>) и использовать API?
Хавьер Ривера
Спасибо, Фоксоман. Это работает как шарм :) Предупреждение для всех: не забывайте первый шаг (как я сделал), иначе это не будет работать. :) (Первый шаг: добавьте эту строку в ваш файл проекта Qt .pro QT += dbus)
kv1dr
@JavierRivera: я пытался импортировать libunity, но он не находит unity.h. Есть тонна библиотек, которые я могу импортировать (согласно функции автозаполнения), но нет библиотеки с именем unity.
kv1dr
1
Ой, я забыл установить libunity-dev. Но теперь есть еще одна проблема с glib.h ( /usr/include/unity/unity/unity.h:7: error: glib.h: No such file or directory), но я libglib2.0-devустановил.
kv1dr
2
@Javier Rivera: Я пытался использовать libunity с помощью QLibrary, но потребовалось много усилий, чтобы достичь того же результата с помощью dbus api.
foxoman
4

В настоящее время нет специальной библиотеки для доступа к функциональности модуля запуска из Qt C ++. Есть библиотека libunity, но она сильно ориентирована на glib, поэтому относительно не подходит для Qt. Как упоминалось в другом ответе, наиболее удобный способ интеграции с модулем запуска - использовать низкоуровневый API-интерфейс dbus .

Основная концепция интеграции с модулем запуска заключается в отправке на модуль запуска сигнала с идентификатором приложения и набором свойств. Идентификатор приложения - это имя файла .desktop, обычно хранящегося в /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);

счетчик

Чтобы установить счетчик, вам нужно установить свойства так, чтобы счетчик был видимым, и дать ему желаемое целочисленное значение:

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

Индикатор

Чтобы установить индикатор выполнения, вам нужно установить свойства так, чтобы прогресс был видимым, и дать ему желаемое двойное значение:

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

Quicklist

Быстрый список можно настроить с помощью библиотеки Qbus dbusmenu. Вам нужно будет включить заголовочный файл:

#include <dbusmenuexporter.h>

Быстрый список создается как QMenuменю в Qt. Это меню «экспортируется» через dbusmenu с помощью DBusMenuExporterобъекта. При экспорте вы даете этому объекту уникальный путь, а затем ссылаетесь на этот путь, чтобы указать элементу запуска, какое меню отображать в качестве быстрого списка.

В объявлении класса главного окна добавьте следующие переменные экземпляра:

QMenu *quicklist;
DBusMenuExporter *quicklist_exporter;

Затем в функции конструктора:

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

Чтобы добавить элементы в меню, используйте метод [addAction] (http: //qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#addAction) меню, чтобы добавить [QAction] (http: / /qt-project.org/doc/qt-5.0/qtwidgets/qaction.html) объекты.

Чтобы установить быстрый список значка запуска, установите свойство «быстрый список» для сигнала:

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

Настройка файла проекта

Вам нужно будет настроить файл .pro для добавления Dbus поддержки: QT += dbus. Для сборки с поддержкой быстрого списка вам нужно установить библиотеки разработки dbusmenu-qt ( libdbusmenu*dev). Затем вы можете добавить следующее в файл проекта, чтобы включить библиотеку 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
}

Пример приложения

Чтобы увидеть полный пример использования всех функций запуска из Qt, посмотрите на этот проект Github .

lazyteq
источник