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 :

callback et paramètres


Sujet :

GTK+ avec C & C++

  1. #1
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut callback et paramètres
    bonjour,

    je sais que j'ai une erreur bête dans le bout de code qui suit mais la je ne la vois pas :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    gboolean MAJ(gpointer d)
     {
     	Tcb *P=(Tcb *) d;
     	gchar min[5];
     
     	(P->nb_min)++;
     	g_sprintf(min,"%2d min",P->nb_min);
     	gtk_status_icon_set_tooltip(P->icon,min);
     
     	if ( P->nb_min >= 45 && P->pause==FALSE )
     	{
     		P->pause=TRUE;
     		P->nb_min=0;
     		printf("STOP !\n");
     	}
     	else
     	{
     		if (P->pause!=TRUE && P->nb_min==15)
     		{
     			P->pause=FALSE;
     			P->nb_min=0;
     			printf("Au BOULOT !\n");
     		}
     		else
     		{
     			printf("Tout est normal : %d min\n",P->nb_min);
     		}
     	}
     
     	return TRUE;
     }
     
    int main (int argc, char ** argv)
    {
      Tcb P;
      int id_thread;
      gchar min[5];
     
      P.nb_min=0;
      P.pause=FALSE;
     
      gtk_init (&argc, &argv);
     
      // Creation de l'icone et d'une info-bulle.
      P.icon = gtk_status_icon_new_from_file (ICONE);
      g_sprintf(min,"%2d min",P.nb_min);
      gtk_status_icon_set_tooltip (GTK_STATUS_ICON (P.icon),min);
     
    // On attache un callback sur le widget GtkStatusIcon.
      g_signal_connect (G_OBJECT(P.icon),"popup-menu",G_CALLBACK(popup_menu_function),NULL);
     
      id_thread=g_timeout_add(1000,(GSourceFunc)MAJ,&P);
     
      gtk_main ();/*g_timer_destroy (timer);*/
     
      return 0;
    }
    le problème est que lors de l'appel à la fonction MAJ j'obtient :

    (test:9028): Gtk-CRITICAL **: gtk_status_icon_set_tooltip: assertion `GTK_IS_STATUS_ICON (status_icon)' failed
    Tout est normal : 0 min

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Tout est dans le message : est ce que tu est certain de passer le bon type de widget (P->icon) à la fonction gtk_status_icon_set_tooltip ?

  3. #3
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    oui, l'utilisation de cette fonction dans le main ne pose pas de problème.

    Je pense que le problème est ailleurs : ce que je trouve bizarre est que dans MAJ(), P->nb_min est bon avant les if (testé par des printf) mais il m'affiche 0 dans le else.

    edit : les valeurs des champs de ma structure ne semble pas initialisés ! P->pause et P->nb_min ne me renvoi pas ce qu'il faudrait donc P->icon aussi je pense. Mais je ne vois pas ou je l'utilise mal

  4. #4
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Si MAJ est un callback, lors de son enregistrement tu lui passe le bon paramètre ?

    Sinon, tu l'appelles bien avec l'adresse de ton instance de structure ?

  5. #5
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    le lancement du callback se fait avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id_thread=g_timeout_add(1000,(GSourceFunc)MAJ,&(P));
    P étant du type de ma structure (Tcb) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
    	int nb_min;
    	gboolean pause;
    	GtkStatusIcon *icon;
    }Tcb;
    et MAJ n'a que la structure en paramètre est :

    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
     gboolean MAJ(gpointer d)
     {
     	Tcb *P=(Tcb *) d;
     	gchar min[6];
     
    	(P->nb_min)++;
     	sprintf(min,"%2.0d min",P->nb_min);
     	//gtk_status_icon_set_tooltip(P->icon,min);
     
     	if (P->pause==FALSE)
     		printf("FALSE ");
     	else
     		printf("TRUE ");
     
     	if ( (P->pause)==FALSE && (P->nb_min)>= 45 )
     	{
     		P->pause=TRUE;
     		P->nb_min=0;
     		printf("STOP !\n");
     	}
     	else
     	{
     		if ( (P->pause)==TRUE && (P->nb_min)>=15 )
     		{
     			P->pause=FALSE;
     			P->nb_min=0;
     			printf("AU BOULOT !\n");
     		}
     		else
     		{
     			printf("Tout est normal : %d min\n",P->nb_min);
     		}
     	}
     
     	return TRUE;
     }

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Quelle idée d'inventer un prototype de fonction de rappel quand on nous le donne : popup-menu

  7. #7
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    j'ai rien inventé, MAJ est le callback qui va avec g_timeout_add.

    http://library.gnome.org/devel/glib/...#g-timeout-add
    http://library.gnome.org/devel/glib/...ml#GSourceFunc

    edit : je ne sais pas pourquoiça marche maintenant, je crois qu'il y avait un problème avec des délimiteurs de commentaire et qu'une partie du code n'était pas prise en compte.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Hmmm, tes 2 g_sprintf me paraissent tres hasardeux, tu corrompts joyeusement la mémoire de ton programme ce qui peut expliquer tes plantages mystérieux.

  9. #9
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    comment ça ? (j'ai remis des sprintf())

    edit : j'ai un problème avec :

    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
    void config(GtkStatusIcon *w, gpointer data)
    {
    	Tcb *P=(Tcb *) data;
    	(void) w;
     
    	printf("%d - %d\n",P->tps_de_travail,P->tps_de_pause);
    }
    void quitter(GtkStatusIcon *w, gpointer data)
    {
    	Tcb *P=(Tcb *) data;
    	(void) w;
     
    	g_source_remove(P->id_thread);
    	gtk_main_quit();
    }
     
    void popup(GtkStatusIcon *status_icon, guint button, guint act_time, gpointer data)
    {
    	GtkWidget *menu, *item[2];
    	Tcb *P=(Tcb *) data;
     
    	menu=gtk_menu_new();
     
    	item[0]=gtk_menu_item_new_with_mnemonic("_Configuration");
    	gtk_menu_shell_append(GTK_MENU_SHELL(menu),item[0]);
    	g_signal_connect_swapped(item[0], "activate",G_CALLBACK(config),P);
     
    	item[1]=gtk_menu_item_new_with_mnemonic("_Quitter");
    	gtk_menu_shell_append(GTK_MENU_SHELL(menu),item[1]);
    	g_signal_connect_swapped(item[1], "activate",G_CALLBACK(quitter),P);
     
    	gtk_widget_show_all(menu);
     
    	gtk_menu_popup(GTK_MENU(menu),NULL,NULL,gtk_status_icon_position_menu, status_icon,button,act_time);
    }
    la fonction popup a l'air de marcher, P contient ce qu'il doit mais quand je veux le récupérer dans config ou quitter ça ne marche pas, P ne pointe pas sur la même structure que dans popup.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     	gchar min[5];
     	g_sprintf(min,"%2d min",P->nb_min);
    Tu écris combien de caractères (au minimum) dans une zone mémoire qui peut stocker combien de caractères ? sprintf/g_sprintf c'est du pareil au même, pas la peine de changer l'un en l'autre Je te conseille fortement d'utiliser g_strdup_printf suivi d'un g_free quand tu n'as plus besoin de la chaîne.

  11. #11
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    c'est bon, tout marche (en effet il me manquait un '\0') et le problème venait en fait d'un g_signal_connect_swapped.

    Merci

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Si tu as gardé un sprintf/g_sprintf, y a moyen de voir le code que tu utilises ? (ainsi que la déclaration des variables qui vont avec)

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

Discussions similaires

  1. Fonctions CallBack et paramètre
    Par myred dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 22/04/2012, 17h15
  2. Appel d'un callback avec paramètres
    Par Anduriel dans le forum MATLAB
    Réponses: 2
    Dernier message: 23/08/2011, 15h59
  3. Callback et paramètre
    Par grunk dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/11/2010, 18h15
  4. appel à un callback avec paramètres
    Par kawther dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 13/03/2009, 00h04
  5. Réponses: 4
    Dernier message: 14/09/2006, 12h25

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