无法在基于gtkmm的gnome-panel applet上显示图像

时间:2010-12-15 18:16:37

标签: gnome gtkmm

我试图用gtkmm创建一个gnome-panel applet时遇到了麻烦。我处理了大部分问题,但现在我已经被阻止了。

快速摘要:我尝试了libpanelappletmm,但是当我尝试在面板中添加applet时,每个程序(甚至是源代码中提供的示例)都会出现段错误。 所以我现在使用C库(libpanel-applet)。首先,我寻找一种方法将PanelApplet Gobject包装在gtkmm C ++ - 对象中,例如Gtk :: EventBox(PanelApplet继承自GtkEventBox)。我试图抛出它,但Glibmm不断发出警告(“无法包装对象'PanelApplet'”。)

所以我创建了一个继承自Gtk :: HBox的类“Info”。在我的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();
}

当我尝试添加applet时,我收到此错误并且程序中止:

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

我评论了Info.hpp中的“Gtk :: Image icon”,我修改了我的构造函数:

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。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,奇怪的是,如果我创建一个指向Gtk::Image的指针,它就可以了。 如果有人有解释,那就太棒了!

编辑:显然,我不得不调用Gtk :: Main :: init_gtkmm_internals。我的包装烦恼消失了。我也可以包装PanelApplet,但是如果我使用结果Gtk::EventBox*它就不会显示任何内容。