Unity Launcher API สำหรับ C ++


10

ฉันพยายามพัฒนาบางโปรแกรมใน QT ด้วย QT SDK เมื่อวานฉันอ่านเกี่ยวกับUnity Launcher APIบนเว็บไซต์อย่างเป็นทางการของ Ubuntu แต่มีตัวอย่างสำหรับ Vala และ python เท่านั้น เป็นไปได้ที่จะใช้ Unity Launcher API (รายการด่วนตัวนับและแถบความคืบหน้า) ด้วยภาษา C ++ และถ้าเป็นไปได้โปรดโพสต์ตัวอย่าง


ภาษา Qt นั้นคืออะไร? คุณกำลังพูดถึง QScript หรือคุณแค่ขอตัวอย่าง C หรือ C ++?
Javier Rivera

ฉันกำลังพูดถึงเรื่องนี้: qt.nokia.com/productsเท่าที่ฉันเข้าใจ Qt เป็นเพียงกรอบสำหรับ C ++
kv1dr

ไม่เพียง แต่เป็นห้องสมุดเต็มรูปแบบที่สามารถใช้กับภาษาต่างๆมากมายรวมถึง Python ฉันเข้าใจว่าคุณกำลังขอตัวอย่าง C ++ ถ้าคุณใช้ Qt หรือห้องสมุดอื่น ๆ ไม่สำคัญ คุณสามารถแก้ไขคำถามเพื่อให้ชัดเจนหรือไม่ (BTW: Unity 2D ทำด้วย Qt)
Javier Rivera

ตกลงแล้ว ... ฉันหมายถึงตัวอย่างสำหรับ C ++ :)
kv1dr

คำตอบ:


6

ฉันยังเรียนรู้ Qt และพยายามหาวิธีใช้ Unity API ใน Qt ฉันสามารถใช้ Dbus API ได้ แต่ไม่มีโชคกับ Quicklist เนื่องจากมันต้องการ DbusMenu และฉันไม่รู้วิธีการนำไปใช้ (ยังคงเรียนรู้ :) )

นี่คือตัวอย่างที่ฉันสร้างขึ้นเพื่อตัวฉันเองและฉันหวังว่ามันจะเป็นประโยชน์สำหรับผู้อื่น บางที Unity devs สามารถช่วยแก้ไข / แก้ไข / เพิ่มรหัสใหม่ (รายการด่วน) ได้ :)

/*
    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


ฉันไม่มีประสบการณ์ใน C ++ แต่ทำไมคุณไม่นำเข้า libunity (#include <unity / unity / unity.h>) และใช้ API
Javier Rivera

ขอบคุณ Foxoman มันใช้งานได้ดีเหมือนมีเสน่ห์ :) คำเตือนสำหรับทุกคน: อย่าลืมขั้นตอนแรก (เหมือนที่ฉันทำ) มิฉะนั้นจะไม่ทำงาน :) (ขั้นตอนแรก: เพิ่มบรรทัดนี้ไปยังไฟล์โครงการ Qt ของคุณ. 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 ตามที่ระบุไว้ในคำตอบอื่น ๆ วิธีที่สะดวกที่สุดในการทำงานร่วมกับปล่อยคือการใช้ในระดับต่ำ dbus API

แนวคิดพื้นฐานของวิธีรวมเข้ากับตัวเรียกใช้งานคือคุณส่งสัญญาณไปยังตัวเรียกใช้พร้อมกับ ID แอปพลิเคชันและชุดของคุณสมบัติ ID แอปพลิเคชันคือชื่อไฟล์ของไฟล์. 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

รายการด่วนสามารถตั้งค่าได้โดยใช้ไลบรารี dbusmenu Qt คุณจะต้องรวมไฟล์ส่วนหัว:

#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 จะเพิ่มการสนับสนุน QT += dbusdbus: เพื่อสร้างด้วยการสนับสนุนรายการด่วนคุณจะต้องมีการlibdbusmenu*devติดตั้งไลบรารีพัฒนา dbusmenu-qt ( ) จากนั้นคุณสามารถเพิ่มสิ่งต่อไปนี้ลงในไฟล์โครงการเพื่อรวมไลบรารี 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นี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.