[gtkmm] PanelApplet, icônes
Bonjour !
Bon, je préviens d'avance, mon problème est assez spécifique. Enfin, mes problèmes plus précisemment, mais jusqu'à maintenant j'ai toujours réussi à contourner. :P Si vous avez des informations quant à mes problèmes "intermédiaires", je suis preneur ! J'ai trouvé très peu d'informations sur le web.
Pour info, ma libgtkmm est à la version 2.20.3
Mon but est de créer un applet pour le gnome-panel, via gtkmm.
J'ai d'abord essayé la libpanelappletmm. Problème : dès que j'ajoutais l'applet, il segfaultait. J'ai même essayé en compilant les exemples fournis dans la source, même résultat.
Je me suis donc porté sur la bibliothèque C (libpanel-applet).
Au début, j'ai essayé de wrapper (ouh le joli franglais) l'objet PanelApplet via Glib::wrap, pour obtenir un Gtk::EventBox (PanelApplet dérive de GtkEventBox). J'ai essayé en castant un peu dans tous les sens, je levais toujours un Glibmm-Warning comme quoi il ne réussissait pas à le wrapper.
Donc j'ai renversé le problème. Désormais, je crée un objet dérivé d'une classe de Gtk, et je l'ajoute à PanelApplet (grâce à la fonction C) en extirpant l'objet C de mon objet via sa méthode gobj().
Voici mon main. Info est la classe dérivée (de Gtk::HBox).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #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) {
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) |
Avec des choses simples, ça marche bien. J'ai réussi à ajouter des labels et des boutons.
Les choses se gâtent maintenant que je veux ajouter une icône.
Tout d'abord, si j'essaye d'ajouter la Gtk::Image comme propriété de ma classe Info et ensuite que je l'initialise dans le constructeur, ça casse.
L'erreur
Code:
glibmm:ERROR:objectbase.cc:78:void Glib::ObjectBase::initialize(GObject*): assertion failed: (gobject_ == castitem)
Info.hpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #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
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| #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();
} |
Si par contre je commente "Gtk::Image icon;" dans le header et que je fais comme constructeur comme suit :
Code:
1 2 3 4 5 6 7 8 9 10 11
| 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();
} |
Cette fois, pas d'erreur, mais l'image ne s'affiche pas. J'ai essayé avec un autre lien, ainsi qu'avec le stock, et même via un Gdk::Pixbuf. Je peux voir l'accés à mon fichier avec strace.
Voilà voilà, si quelqu'un a une idée ;)
Merci d'avance !