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 :

activation désactivation menu


Sujet :

GTK+ avec C & C++

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 250
    Par défaut activation désactivation menu
    Bonjour,

    J'ai crée un menu comprenant nouveau, ouvrir, fermer chacun répondant à un callback. J'ai également crée une barre d'outil répondant aux mêmes callbacks.

    Au démarrage de mon menu, le menuitem "fermer" est grisé (via gtk_widget_set_sensitive(menuitem,FALSE)).

    les fonctions de callbacks nouveau et ouvrir activent le menu via gtk_widget_set_sensitive(menuitem,TRUE), cela fonctionne.

    Dans mon callback fermeture, j'utilise gtk_widget_set_sensitive(menuitem,FALSE) pour désactiver fermer. Cela fonctionne quand ma routine fermer est appelée via la barre d'outil mais ne fonctionne pas quand fermeture est appelé via le menu.

    Je pense que le prob vient du fait que ma fonction fermer appelée via le menu
    ne s'exécute pas si le menu est sélectionné un peu sur le principe que si je m'appelle moi même au télephone ça sonne occupé, ma routine fermer ne retourne aucun paramètre ( routine void routine_fermer() ) et ne prend aucun paramètres. Est-ce que cela vient de là ? j'ai déjà eu un prob similaire.

    J'appelle donc la routine_fermeture via la barre d'icône ou via le menu.

    code source ci-dessous :


    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    #include <gtk/gtk.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
     
    void routine_sortie();
    void routine_ouverture();
    void routine_enregistrer();
    void routine_creation();
    void routine_fermeture();
    void creation_barre_outil();
     
    GtkWidget 	*fenetre;
    GtkWidget 	*text_view;
    GtkWidget 	*scrollbar;
    GtkWidget 	*box;
    GtkWidget 	*barre_outil;
    GtkTextBuffer *buffer;
    int	  		doc_cree=FALSE;	
    int			icone_fermeture=FALSE;
    int			doc_modifie=FALSE;
    char	  	*filename=NULL;
    GtkWidget 	*barre_menu;
    GtkWidget	*menu;
    GtkWidget	*menuitem_sousmenu_fichier,*menuitem_nouveau,*menuitem_ouvrir,*menuitem_quitter,*menuitem_fermer;
     
     
    int main (int argc, char **argv)
    {
     
     
    	gtk_init (&argc, &argv);
     
    	fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title (GTK_WINDOW (fenetre), "Test");
    	gtk_window_set_default_size(GTK_WINDOW(fenetre), 640, 480); 
    	g_signal_connect (G_OBJECT(fenetre), "delete-event",G_CALLBACK (routine_sortie), NULL);
    	box=gtk_vbox_new(FALSE,5); 
       	gtk_container_add(GTK_CONTAINER(fenetre),box);
     
    	barre_menu=gtk_menu_bar_new();
    	menu=gtk_menu_new();
    	menuitem_sousmenu_fichier=gtk_menu_item_new_with_label("Fichier");
    	gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem_sousmenu_fichier),menu);
    	gtk_menu_shell_append(GTK_MENU_SHELL(barre_menu),menuitem_sousmenu_fichier);
     
    	menuitem_nouveau=gtk_menu_item_new_with_label("Nouveau");
    	g_signal_connect(G_OBJECT(menuitem_nouveau),"activate",G_CALLBACK(routine_creation),fenetre);
    	gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem_nouveau);
     
    	menuitem_ouvrir=gtk_menu_item_new_with_label("Ouvrir");
    	g_signal_connect(G_OBJECT(menuitem_ouvrir),"activate",G_CALLBACK(routine_ouverture),fenetre);
    	gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem_ouvrir);
     
    	menuitem_fermer=gtk_menu_item_new_with_label("Fermer");
    	g_signal_connect(G_OBJECT(menuitem_quitter),"activate",G_CALLBACK(routine_fermeture),fenetre);
    	gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem_fermer);
    	gtk_widget_set_sensitive(menuitem_fermer,FALSE);
     
    	menuitem_quitter=gtk_menu_item_new_with_label("Quitter");
    	g_signal_connect(G_OBJECT(menuitem_quitter),"activate",G_CALLBACK(routine_sortie),fenetre);
    	gtk_menu_shell_append(GTK_MENU_SHELL(menu),menuitem_quitter);
     
     
    	gtk_box_pack_start(GTK_BOX(box),barre_menu,FALSE,FALSE,0);
     
    	creation_barre_outil();
     
    	gtk_widget_show_all(fenetre);
      	gtk_main ();
      	return 0;
    }
     
    void routine_creation()
    {	
     
    	if (doc_cree==FALSE)
    	{
    		scrollbar = gtk_scrolled_window_new(NULL, NULL);
    		gtk_box_pack_start(GTK_BOX(box), scrollbar, TRUE, TRUE, 0);
    		text_view=gtk_text_view_new();
    		gtk_container_add(GTK_CONTAINER(scrollbar),text_view);
    		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);	  
    		gtk_widget_show_all(fenetre);
    		doc_cree=TRUE;	
    		gtk_toolbar_insert_stock(GTK_TOOLBAR(barre_outil),GTK_STOCK_SAVE,NULL,NULL,routine_enregistrer,NULL,2);
    		gtk_toolbar_insert_stock(GTK_TOOLBAR(barre_outil),GTK_STOCK_CLOSE,NULL,NULL,routine_fermeture,NULL,3);
    		buffer=gtk_text_view_get_buffer(text_view);
    		gtk_text_buffer_set_modified(buffer,FALSE);
    		gtk_widget_set_sensitive(menuitem_fermer,TRUE);
    	}
    }
     
    void routine_ouverture()
    {
    GtkWidget 	*selection_fichier;
    FILE		*fichier;
    int			taille_fichier;
    char		*lecture;
     
    	if (doc_cree==FALSE)
    	{
    		routine_creation();
    	}
     
    	selection_fichier=gtk_file_chooser_dialog_new("Ouvrir ...",GTK_WINDOW(fenetre),GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
    NULL);
    	gtk_window_set_modal(GTK_WINDOW(selection_fichier), TRUE);
    	if (gtk_dialog_run(GTK_DIALOG(selection_fichier))==GTK_RESPONSE_ACCEPT)
    	{
    		filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(selection_fichier));
    	}
    	gtk_widget_destroy(selection_fichier);
    	fichier=fopen(filename,"r");
    	if (fichier!=NULL)
    	{
    		buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
    		fseek(fichier,0,SEEK_END);
    		taille_fichier=ftell(fichier);
    		fseek(fichier,0,SEEK_SET);
    		lecture=malloc(taille_fichier);
    		fread(lecture,taille_fichier,1,fichier);
    		gtk_text_buffer_set_text(buffer,lecture,taille_fichier);
    		free(lecture);
    		fclose(fichier);
    		gtk_text_buffer_set_modified(buffer,FALSE);
    	}
    }
     
    void routine_enregistrer()
    {
    char	filename2[128];
    gint	valeur;
    int		etat;
    FILE	*fichier;
    GtkTextIter start_iter,end_iter;
    gchar	*buffer2=0;
    GtkWidget 	*selection_fichier;
     
    	doc_modifie=gtk_text_buffer_get_modified(buffer);
    	if (doc_modifie==TRUE)
    	{	
    		if (filename==NULL)
    		{
    			selection_fichier=gtk_file_chooser_dialog_new("Enregistrer sous ...",GTK_WINDOW(fenetre),GTK_FILE_CHOOSER_ACTION_SAVE,GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
    GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
    NULL);
    			gtk_window_set_modal(GTK_WINDOW(selection_fichier), TRUE);
    			gtk_window_set_title (GTK_WINDOW (selection_fichier), "Enregistrer sous");
    			if(gtk_dialog_run(GTK_DIALOG(selection_fichier))==GTK_RESPONSE_ACCEPT)
    			{
    				filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(selection_fichier));
    //				printf("Nom du fichier à sauvegarder : %s\n",filename);
    				strcpy(filename2,filename);
    				strcat(filename2,"~");
    				valeur=gtk_text_buffer_get_char_count(buffer);
    				rename(filename,filename2);
    				fichier=fopen(filename,"w");
    				gtk_text_buffer_get_start_iter(buffer,&start_iter);
    				gtk_text_buffer_get_end_iter(buffer,&end_iter);
    				buffer2=gtk_text_buffer_get_text(buffer,&start_iter,&end_iter,FALSE);		
    				etat=fwrite(buffer2,valeur,1,fichier);
    				fclose(fichier);
    				g_free(buffer2);
    				gtk_text_buffer_set_modified(buffer,FALSE);				
    			}
    			gtk_widget_destroy(selection_fichier);
    		}
    		else
    		{
    			strcpy(filename2,filename);
    			strcat(filename2,"~");
    			valeur=gtk_text_buffer_get_char_count(buffer);
    			rename(filename,filename2);
    			fichier=fopen(filename,"w");
    			gtk_text_buffer_get_start_iter(buffer,&start_iter);
    			gtk_text_buffer_get_end_iter(buffer,&end_iter);
    			buffer2=gtk_text_buffer_get_text(buffer,&start_iter,&end_iter,FALSE);		
    			etat=fwrite(buffer2,valeur,1,fichier);
    			fclose(fichier);
    			g_free(buffer2);
    			gtk_text_buffer_set_modified(buffer,FALSE);
    //			printf("Enregistrement effectue ...\n");
    		}
    	}
     
    }
     
    void routine_fermeture()
    {
    GtkWidget 		*demande_enreg;
    GtkResponseType reponse_enreg;
     
    	doc_modifie=gtk_text_buffer_get_modified(buffer);
    	if (doc_modifie==TRUE)
    	{	
    		demande_enreg=gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
                                       GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
                                       "Document modifié\nVoulez-vous l'enregistrer ?");
    		gtk_window_set_title (GTK_WINDOW (demande_enreg), "Enregistrement");
    		gtk_window_set_modal(GTK_WINDOW(demande_enreg), TRUE);
    		reponse_enreg=gtk_dialog_run(GTK_DIALOG (demande_enreg));
    		gtk_widget_destroy(demande_enreg);
    		if (reponse_enreg==GTK_RESPONSE_YES) routine_enregistrer();
     
    	}
    	gtk_object_destroy(GTK_OBJECT(scrollbar));
    	gtk_object_destroy(GTK_OBJECT(barre_outil));
    	doc_cree=FALSE;
    	creation_barre_outil();
    	gtk_widget_show(barre_outil);
    	gtk_widget_set_sensitive(menuitem_fermer,FALSE);
    }
     
    void routine_sortie()
    {
    GtkWidget 		*demande_enreg,*demande_fermeture;
    GtkResponseType reponse_enreg,reponse_fermeture;
     
    	demande_fermeture=gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
                                       GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
                                       "Etes-vous sur de vouloir quitter ?");
    	gtk_window_set_title (GTK_WINDOW (demande_fermeture), "Confirmation");
    	gtk_window_set_modal(GTK_WINDOW(demande_fermeture), TRUE);
    	reponse_fermeture=gtk_dialog_run(GTK_DIALOG (demande_fermeture));
    	gtk_widget_destroy(demande_fermeture);
    	if (reponse_fermeture==GTK_RESPONSE_YES)
    	{	
    		doc_modifie=gtk_text_buffer_get_modified(buffer);
    		if (doc_modifie==TRUE)
    		{
    			demande_enreg=gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
                                       GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
                                       "Enregistrer le document avant de quitter ?");
    			gtk_window_set_title (GTK_WINDOW (demande_enreg), "Confirmation");
    			gtk_window_set_modal(GTK_WINDOW(demande_enreg), TRUE);
    			reponse_enreg=gtk_dialog_run(GTK_DIALOG (demande_enreg));
    			gtk_widget_destroy(demande_enreg);
    			if (reponse_enreg==GTK_RESPONSE_YES) routine_enregistrer();
    		}
    		gtk_main_quit();
    	}
    }
     
    void creation_barre_outil()
    {
    	barre_outil=gtk_toolbar_new();
    	gtk_box_pack_start(GTK_BOX(box),barre_outil,FALSE,FALSE,0);
    	gtk_toolbar_insert_stock(GTK_TOOLBAR(barre_outil),GTK_STOCK_NEW,NULL,NULL,routine_creation,NULL,-1);	
    	gtk_toolbar_insert_stock(GTK_TOOLBAR(barre_outil),GTK_STOCK_OPEN,NULL,NULL,routine_ouverture,NULL,-1);
    	gtk_toolbar_insert_stock(GTK_TOOLBAR(barre_outil),GTK_STOCK_QUIT,NULL,NULL,routine_sortie,NULL,-1);
    	gtk_toolbar_set_style(GTK_TOOLBAR(barre_outil),GTK_TOOLBAR_ICONS);
    	gtk_toolbar_set_icon_size(GTK_TOOLBAR(barre_outil),GTK_ICON_SIZE_MENU);
    }
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Sans code ce n'est pas évident à te répondre.

    Je pense tout de même que le prototype de la Callback appelée par une entrée de menu ne doit pas être le même que pour une icône d'une barre d'outils.

    regarde de ce côté là pour commencer...

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Pour les GtkMenuItem le signal "activate" est associé au prototype de CallBack suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void                user_function                      (GtkMenuItem *menuitem,
                                                            gpointer     user_data)      : Run First / Action
    Pour les GtkToolBar le prototype est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void                (*GCallback)                        (void);
    On voit bien qu'il y a des différences. Il est impératif de respecter les différents prototypes sous peine d'avoir des comportements aléatoires.

    N.B. : la fonction gtk_toolbar_insert_stock(); est obsolète. utilises plutôt gtk_toolbar_insert();. Tu pourras alors insérer des GtkToolButton associés au signal "clicked".

    Le prototype du signal est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void                user_function                      (GtkToolButton *toolbutton,
                                                            gpointer       user_data)       : Run First / Action
    En résumé il te faudras créer deux fonctions différentes pour avoir la même action. Tu peux par exemple écrire un callback du type des GtkMenuItem dans lequel tu effectues toutes les actions nécessaires et écrire un callback spécifique pour les GtkToolButton dans lequel tu ne fais qu'appeler le callback des GtkMenuItem.
    Ainsi tu respectes les prototypes et ton application est stable.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 14/01/2013, 09h57
  2. activer/désactiver la compression GZIP des pages
    Par iubito dans le forum Développement Web en Java
    Réponses: 7
    Dernier message: 20/08/2008, 21h35
  3. Activer/désactiver bouton dans menu perso
    Par electrosat03 dans le forum VBA Access
    Réponses: 12
    Dernier message: 21/09/2007, 17h22
  4. [pywin32] Activer/Désactiver compte Active Directory
    Par Dimontviloff dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 01/12/2004, 17h30
  5. Bouton d'activation/désactivation de tooltips
    Par bigboomshakala dans le forum MFC
    Réponses: 2
    Dernier message: 26/04/2004, 08h54

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