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).
Avec des choses simples, ça marche bien. J'ai réussi à ajouter des labels et des boutons.
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)
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'erreurInfo.hpp
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.cpp
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; }; #endifSi 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
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(); }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:
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(); }ixbuf. Je peux voir l'accés à mon fichier avec strace.
Voilà voilà, si quelqu'un a une idée
Merci d'avance !
Partager