1

gtkmm で gnome-panel アプレットを作成しようとすると、問題が発生しました。私はそれらのほとんどに対処しましたが、今はブロックされています。

簡単な要約 : libpanelappletmm を試しましたが、パネルにアプレットを追加しようとすると、すべてのプログラム (ソース コードで提供されている例も含む) で segfault が発生します。そこで、C ライブラリ (libpanel-applet) を使用するようになりました。最初に、Gtk::EventBox (PanelApplet は GtkEventBox を継承しています) などの gtkmm C++ オブジェクトで PanelApplet Gobject をラップする方法を探しました。キャストしようとしましたが、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 オブジェクトにラベルやボタンを追加すると、問題なく動作します。

しかし、私はアイコンを追加しようとしました。私の最初の試みは、Info のプロパティとして Gtk::Image を追加することでした。

情報.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 を使用して、別のファイルを試しました。

前もって感謝します !

4

1 に答える 1

1

奇妙なことに、へのポインタを作成すると機能しますGtk::Image。誰かに説明があれば、それは素晴らしいことです!

編集: どうやら、Gtk::Main::init_gtkmm_internals を呼び出す必要がありました。ラッピングの悩みが解消されました。PanelApplet もラップできますが、結果を使用するGtk::EventBox*と何も表示されません。

于 2010-12-16T19:17:47.093 に答える