Невозможно отобразить изображения в апплете gnome-панели на основе gtkmm - PullRequest
1 голос
/ 15 декабря 2010

Я столкнулся с проблемами, пытаясь создать апплет для gnome-панели с помощью gtkmm.Я имел дело с большинством из них, но теперь я в некотором роде заблокирован.

Краткое резюме: я пробовал libpanelappletmm, но каждая программа (даже примеры, приведенные в исходном коде) зависала при попытке добавить апплетв моей панели.Поэтому я сейчас использую библиотеку C (libpanel-applet).Сначала я искал способ обернуть объект PanelApplet в объект gtkmm C ++ - например, Gtk :: EventBox (PanelApplet наследуется от GtkEventBox).Я пытался привести его, но Glibmm продолжал выдавать предупреждение («Не удалось обернуть объект« PanelApplet »).

Поэтому я создал класс« Информация », унаследованный от Gtk :: HBox.В моем файле main.cpp я объявляю его экземпляр, получаю базовый объект GTK (метод gobj) и использую функции GTK + для добавления его в PanelApplet.

Вот мой main.cpp.

#include <iostream>
#include <gtkmm.h>
#include <panel-applet.h>

#include "Info.hpp"

static void manage_timeboxes(BonoboUIComponent *uic, void *applet, const char* data) {
    std::cout << "manage" << std::endl;
}

static gboolean getApplet(PanelApplet *applet, const gchar *iid, gpointer data) {
    /*
       if(iid != "OAFIID:TimeboxingApplet")
       return false;
    */

    Glib::init();

    Gtk::Widget* content = new Info();
    gtk_container_add(GTK_CONTAINER(applet), content->gobj());

    static const char menu_xml[] =
        "<popup name=\"button3\">\n"
        "   <menuitem name=\"Manage\" "
        "             verb=\"manage_timeboxes\" "
        "           _label=\"_Gérer l'emploi du temps\"\n"
        "          pixtype=\"stock\" "
        "          pixname=\"gtk-properties\"/>\n"
        "</popup>\n";

    static const BonoboUIVerb linked_verbs[] = {
        BONOBO_UI_VERB ("manage_timeboxes", manage_timeboxes),
        BONOBO_UI_VERB_END
    };

    panel_applet_setup_menu(applet, menu_xml, linked_verbs, data);

    gtk_widget_show_all(GTK_WIDGET(applet));

    return true;
}

PANEL_APPLET_BONOBO_FACTORY (
        "OAFIID:TimeboxingApplet_Factory",
        PANEL_TYPE_APPLET,
        "Timeboxing",
        "0.0",
        getApplet,
        NULL)

Это прекрасно работает, если я добавляю метки или кнопки в свой объект Info.

Но затем я попытался добавить значок.Моей первой попыткой было добавление Gtk :: Image в качестве свойства Info.

Info.hpp

#ifndef TIMEBOXING_INFO_H
#define TIMEBOXING_INFO_H

#include <gtkmm/box.h>
#include <gtkmm/image.h>
#include <gtkmm/label.h>

class Info : public Gtk::HBox {
    public:
        Info();
        virtual ~Info(){};

    protected:
        Gtk::Image icon;
        Gtk::Label info;
};

#endif

Info.cpp

#include "Info.hpp"

#include <gtkmm/image.h>
#include <gtkmm/label.h>

Info::Info() : icon("/home/bastien/programmation/timeboxing-applet/icons/clock-24.png"), info("<b>En cours</b>") {
    info.set_use_markup();

    pack_start(icon);
    pack_start(info);

    show_all_children();
}

Когда я пытаюсьдобавив апплет, я получаю эту ошибку, и программа прерывает работу:

glibmm:ERROR:objectbase.cc:78:void Glib::ObjectBase::initialize(GObject*): assertion failed: (gobject_ == castitem)

Я прокомментировал «Gtk :: Image icon» из Info.hpp и изменил свой конструктор так:

Info::Info() : info("<b>En cours</b>") {
    info.set_use_markup();

    Gtk::Image icon("/home/bastien/programmation/timeboxing-applet/icons/clock-24.png");

    pack_start(icon);
    pack_start(info);


    show_all_children();
}

Я больше не получаю ошибку Glibmm, но изображение не отображается.Я пробовал с другим файлом, с иконкой со склада и даже с Gdk :: Pixbuf. * ​​1026 *

Заранее спасибо!

1 Ответ

1 голос
/ 16 декабря 2010

Ну, как ни странно, это работает, если я создаю указатель на Gtk::Image. Если у кого-нибудь есть объяснение, было бы здорово!

Редактировать: по-видимому, мне пришлось вызвать Gtk :: Main :: init_gtkmm_internals. Мои проблемы с обертыванием ушли. Я могу также обернуть PanelApplet, но если я использую полученный Gtk::EventBox*, он ничего не отобразит.

...