IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

[gtkmm] PanelApplet, icônes


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut [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. 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 !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Avril 2009
    Messages : 16
    Par défaut
    Bon, assez étrangement, ça marche quand je déclare le Gtk::Image en pointeur.

    Je met le sujet en résolu, mais si quelqu'un a des explications, je suis preneur.


    Edit : apparemment, il me fallait appeler Gtk::Main::init_gtkmm_internals. Après ça je peux même wrapper PanelApplet, mis à part que si j'ajoute des widgets au Gtk::EventBox* qui en résulte ils ne s'affichent pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GTKmm] Comment obtenir l'icône?
    Par Jean_Benoit dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 27/09/2006, 12h25
  2. Changer l'icône d'une fenêtre à partir d'un .res
    Par henderson dans le forum C++Builder
    Réponses: 8
    Dernier message: 11/03/2003, 10h48
  3. Fichier ressource contenant une icône
    Par k_boy dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 26/09/2002, 20h59
  4. Extraire les icônes d'une DLL
    Par Globus dans le forum MFC
    Réponses: 6
    Dernier message: 13/09/2002, 13h44
  5. icône d'une fenêtre fille
    Par bastien dans le forum C++Builder
    Réponses: 6
    Dernier message: 27/05/2002, 13h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo