无法在基于 gtkmm 的 gnome 面板小程序上显示图像

发布于 2024-10-07 23:20:41 字数 3207 浏览 3 评论 0原文

我在尝试使用 gtkmm 创建 gnome 面板小程序时遇到了麻烦。我处理了其中的大部分,但现在我有点受阻了。

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

所以我创建了一个类“Info”,继承自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)

我从 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。

先感谢您 !

I ran into troubles trying to create a gnome-panel applet with gtkmm. I dealt with most of them, but I'm now kind of blocked.

Quick summary : I tried libpanelappletmm, but every program (even the examples supplied in the source code) segfaults when I try to add the applet in my panel.
So I now use the C library (libpanel-applet). First I looked for a way to wrap the PanelApplet Gobject in a gtkmm C++-object, for example a Gtk::EventBox (PanelApplet inherits from GtkEventBox). I tried to cast it, but Glibmm kept throwing a warning ("Failed to wrap object 'PanelApplet'").

So I created a class "Info", inheriting from Gtk::HBox. In my main.cpp file I declare an instance of it, get the underlying GTK object (gobj method), and use the GTK+ functions to add it into the PanelApplet.

Here's my 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)

It works fine if I add labels or buttons in my Info object.

But then I tried to add an icon.
My first try was adding a Gtk::Image as a property of 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();
}

When I try to add the applet, I get this error and the program aborts :

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

I commented "Gtk::Image icon" from Info.hpp, and I modified my constructor like this :

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

I'm not getting the Glibmm error anymore, but the image isn't displayed. I tried with another file, with an icon from the stock, and even with a Gdk::Pixbuf.

Thank you in advance !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情魔剑神 2024-10-14 23:20:41

好吧,奇怪的是,如果我创建一个指向 Gtk::Image 的指针,它就会起作用。
如果有人有解释,那就太好了!

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

Well, strangely enough, it works if I create a pointer to Gtk::Image.
If anyone has an explanation, it would be great !

Edit : apparently, I had to call Gtk::Main::init_gtkmm_internals. My wrapping troubles went away. I can wrap PanelApplet too, but if I use the resulting Gtk::EventBox* it doesn't display anything.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文