Я столкнулся с проблемами, пытаясь создать апплет для gnome-панели с помощью gtkmm.Я имел дело с большинством из них, но теперь я в некотором роде заблокирован.
Краткое резюме: я пробовал libpanelappletmm, но каждая программа (даже примеры, приведенные в исходном коде) зависала при попытке добавить апплетв моей панели.Поэтому я сейчас использую библиотеку C (libpanel-applet).Сначала я искал способ обернуть объект PanelApplet в объект gtkmm C ++ - например, Gtk :: EventBox (PanelApplet наследуется от GtkEventBox).Я пытался привести его, но Glibmm продолжал выдавать предупреждение («Не удалось обернуть объект« PanelApplet »).
Поэтому я создал класс« Информация », унаследованный от 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)
Я прокомментировал «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. * 1026 *
Заранее спасибо!