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 を使用して、別のファイルを試しました。
前もって感謝します !