2010-12-15 4 views
1

gtkmmでgnome-panelアプレットを作成する際に問題が発生しました。私はそれらの大部分を扱っていましたが、私は現在、一種のブロックされています。gtkmmベースのgnome-panelアプレットに画像を表示できません

私はlibpanelappletmmを試しましたが、パネルにアプレットを追加しようとすると、すべてのプログラム(ソースコードで提供されているサンプルも)がsegfaultsします。 Cライブラリ(libpanel-applet)を使用します。最初に、gtkmm C++オブジェクトにPanelApplet Gobjectをラップする方法を探しました。たとえば、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オブジェクトにラベルやボタンを追加しても問題ありません。

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

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を使って、別のファイルを試してみました。

ありがとうございます!

答えて

1

私がGtk::Imageへのポインタを作成すると、奇妙なことに、それはうまくいきます。 誰かが説明をしているなら、それは素晴らしいでしょう!

編集:明らかに、私はGtk :: Main :: init_gtkmm_internalsを呼び出す必要がありました。私のラッピングの問題はなくなった。私もPanelAppletをラップすることができますが、結果としてGtk::EventBox*を使用しても何も表示されません。

関連する問題