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. 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
glibmm:ERROR:objectbase.cc:78:void Glib::ObjectBase::initialize(GObject*): assertion failed: (gobject_ == castitem)
Info.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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:ixbuf. Je peux voir l'accés à mon fichier avec strace.


Voilà voilà, si quelqu'un a une idée
Merci d'avance !