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 :

[GTK+ 3.12] Problème fenêtre popup


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut [GTK+ 3.12] Problème fenêtre popup
    Bonsoir,

    J'ai écrit le code suivant avec gtk+ 3.12 sous linux :

    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    void cb_show_prop (GtkButton *, GtkWindow *);
     
    int main (int argc, char *argv[])
     
    {
     
    	GtkWindow *window = NULL, *popup = NULL;
    	GtkButton *button = NULL;
    	GtkLabel *label = NULL;
     
    	gtk_init (&argc, &argv);
     
    	window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    	gtk_window_set_title (window, "Popup");
    	gtk_container_set_border_width (GTK_CONTAINER (window), 25);
    	gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
     
    	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
    	button = GTK_BUTTON (gtk_button_new_with_label ("Properties"));
    	gtk_button_set_relief (button, GTK_RELIEF_NORMAL);
    	gtk_widget_set_halign (GTK_WIDGET (button), GTK_ALIGN_CENTER);
    	gtk_widget_set_valign (GTK_WIDGET (button), GTK_ALIGN_CENTER);
     
    	g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (cb_show_prop), (gpointer) popup);
     
    	gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (button));
     
    	popup = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    	gtk_window_set_decorated (popup, FALSE);
     
    	label = GTK_LABEL (gtk_label_new ("This pop-up is safe"));
     
    	gtk_container_add (GTK_CONTAINER (popup), GTK_WIDGET (label));
     
    	gtk_widget_show_all (GTK_WIDGET (window));
     
    	gtk_main ();
     
    	return EXIT_SUCCESS;
     
    }
     
    void cb_show_prop (GtkButton *button, GtkWindow *popup)
     
    {
     
    	gtk_window_present (popup);
     
    	(void) button;
     
    }
    Ça compile sans aucun warning, mais à l'exécution, j'ai bien ma fenêtre principale avec son bouton, mais quand je clique sur le bouton, la fenêtre popup n'apparaît pas et j'obtiens l'erreur suivante :

    (popup:9478): Gtk-CRITICAL **: gtk_window_present_with_time: assertion 'GTK_IS_WINDOW (window)' failed

    Où est-ce que j'ai raté le coche ?.

    Depuis que je fais des essais avec GTK, j'ai pris l'habitude de typer mes pointeurs avec "le bon type" plutôt que systématiquement GtkWidget*. J'ai essayé de recompiler en redéfinissant mes pointeurs en GtkWidget* et j'obtiens le même résultat.

    Merci d'avance de vous intéresser à mon problème.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par diesel83 Voir le message
    Bonsoir,

    J'ai écrit le code suivant avec gtk+ 3.12 sous linux :

    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    void cb_show_prop (GtkButton *, GtkWindow *);
     
    int main (int argc, char *argv[])
     
    {
     
    	GtkWindow *window = NULL, *popup = NULL;
    	GtkButton *button = NULL;
    	GtkLabel *label = NULL;
     
    	gtk_init (&argc, &argv);
     
    	window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    	gtk_window_set_title (window, "Popup");
    	gtk_container_set_border_width (GTK_CONTAINER (window), 25);
    	gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
     
    	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
    	button = GTK_BUTTON (gtk_button_new_with_label ("Properties"));
    	gtk_button_set_relief (button, GTK_RELIEF_NORMAL);
    	gtk_widget_set_halign (GTK_WIDGET (button), GTK_ALIGN_CENTER);
    	gtk_widget_set_valign (GTK_WIDGET (button), GTK_ALIGN_CENTER);
     
    	g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (cb_show_prop), (gpointer) popup);
     
    	gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (button));
     
    	popup = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    	gtk_window_set_decorated (popup, FALSE);
     
    	label = GTK_LABEL (gtk_label_new ("This pop-up is safe"));
     
    	gtk_container_add (GTK_CONTAINER (popup), GTK_WIDGET (label));
     
    	gtk_widget_show_all (GTK_WIDGET (window));
     
    	gtk_main ();
     
    	return EXIT_SUCCESS;
     
    }
     
    void cb_show_prop (GtkButton *button, GtkWindow *popup)
     
    {
     
    	gtk_window_present (popup);
     
    	(void) button;
     
    }
    Ça compile sans aucun warning, mais à l'exécution, j'ai bien ma fenêtre principale avec son bouton, mais quand je clique sur le bouton, la fenêtre popup n'apparaît pas et j'obtiens l'erreur suivante :

    (popup:9478): Gtk-CRITICAL **: gtk_window_present_with_time: assertion 'GTK_IS_WINDOW (window)' failed

    Où est-ce que j'ai raté le coche ?.

    Depuis que je fais des essais avec GTK, j'ai pris l'habitude de typer mes pointeurs avec "le bon type" plutôt que systématiquement GtkWidget*. J'ai essayé de recompiler en redéfinissant mes pointeurs en GtkWidget* et j'obtiens le même résultat.

    Merci d'avance de vous intéresser à mon problème.

    Jean-Marie
    Bonjour.

    Tu utilises la fonction g_signal_connect_swapped();. Pourquoi ? En connais-tu le fonctionnement précis par rapport à la fonction g_signal_connect(); ? Ton problème vient certainement de là.

  3. #3
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    Salut diesel83,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect_swapped (G_OBJECT (button), "clicked", G_CALLBACK (cb_show_prop), (gpointer) popup);
    Au moment de l'excecution de ce code, le pointeur popup vaux NULL; C'est donc un NULL qui serra envoyé à la fonction callback...

    Il faut appeler g_signal_connect après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    popup = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    Pour ce qui est du typage, c'est bien.
    f(x) = y

  4. #4
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Quel con (je fais).

    Bien vu. C'est vrai que j'avais un peu tendance à négliger l'ordre des créations et initialisations d'objets en me disant (en gros) que tout se mettait en place au gtk_widget_show. C'est un peu vrai mais pas complètement.

    Grâce à ça, je crois que je vais pouvoir faire marcher quelques codes que j'avais laissé de côté.

    Je vais aussi réfléchir à l'organisation de mes sources. Jusqu'ici, j'avais tendance à regrouper par objets. Je vais voir si ce ne serait pas mieux en regroupant par action (création de tous les objets, "paramétrage" de tous les objets, attachement des objets les uns dans les autres, puis attachement des fonctions de callback).

    Merci beaucoup.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

  5. #5
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    concernant les types:

    En production, ajoute la directive G_DISABLE_CAST_CHECKS
    gcc -o main main.c -DG_DISABLE_CAST_CHECKS `pkg-config --cflags gtk+-3.0 --libs gtk+-3.0`

    Je vais voir si ce ne serait pas mieux en regroupant par action
    Je confirme, suivre un algorithme c'est bien.
    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
          (début)
    +--------------------+
    |   déclaration   |
    +--------------------+
               |
    +--------------------+
    |    allocation    |
    +--------------------+
               |
    +--------------------+
    |  initialisation   |
    +--------------------+
               |
    +--------------------+
    |  composition  |
    +--------------------+
               |
    +--------------------+
    |      option       |
    +--------------------+
           (fin)

    Je vais aussi réfléchir à l'organisation de mes sources. Jusqu'ici, j'avais tendance à regrouper par objets.
    C'est très bien comme ça. Tu peux même créer une class par résponsabilité.
    f(x) = y

  6. #6
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Bonjour.

    Tu utilises la fonction g_signal_connect_swapped();. Pourquoi ? En connais-tu le fonctionnement précis par rapport à la fonction g_signal_connect(); ? Ton problème vient certainement de là.
    Bonjour Gerald3d,

    Merci beaucoup pour ta réponse. Effectivement, c'était une partie de mon problème.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    De rien .

    En même temps je n'avais pas vu ton initialisation à posteriori du pointeur de la fenêtre de popup. Le problème partait déjà de là.

    À plusieurs on finit par trouver la solution. C'est tout l'intérêt de ce forum.

    Bonne continuation.

  8. #8
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Grâce à vos conseils, j'ai écrit un autre petit programme avec une fenêtre popup qui fonctionne (cette fois). Je vous livre le source et je vous remercie de me dire ce que vous pensez de la manière dont il est organisé.

    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
    #include <stdlib.h> /* définition de EXIT_SUCCESS */
    #include <gtk/gtk.h>
     
    /* Prototypes des fonctions de callback */
     
    static gboolean cb_show_spin (GtkSpinButton *, GdkEvent *, GtkWidget *);
    static void cb_value_spin_changed (GtkSpinButton *, GtkScale *);
    static void cb_value_scale_changed (GtkScale *, GtkSpinButton *);
     
    int main (int argc, char *argv[])
     
    {
     
    /* Initialisation de GTK */
     
    	gtk_init (&argc, &argv);
     
    /* Déclaration des objets */
     
    	GtkWindow *window, *popup;
    	GtkGrid *grid;
    	GtkAdjustment *adj1, *adj2;
    	GtkSpinButton *spin;
    	GtkScale *scale;
    	GtkLabel *label;
     
    /* Initialisation des objets */
     
    	window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    	popup = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
    	grid = GTK_GRID (gtk_grid_new ());
    	adj1 = GTK_ADJUSTMENT (gtk_adjustment_new (0.5, 0.0, 1.02, 0.01, 0.02, 0.02));
    	adj2 = GTK_ADJUSTMENT (gtk_adjustment_new (0.5, 0.0, 1.02, 0.01, 0.02, 0.02));
    	spin = GTK_SPIN_BUTTON (gtk_spin_button_new (adj1, 0.01, 2)); /* après adj1 */
    	scale = GTK_SCALE (gtk_scale_new (GTK_ORIENTATION_VERTICAL, adj2)); /* après adj2 */
    	label = GTK_LABEL (gtk_label_new ("Valeur :"));
     
    /* Paramétrage des objets */
     
    	gtk_window_set_title (window, "Mon exemple 1");
    	gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    	gtk_widget_set_size_request (GTK_WIDGET (window), 600, 600);
     
    	gtk_window_set_decorated (popup, FALSE);
    	gtk_widget_set_size_request (GTK_WIDGET (popup), 1, 100);
     
    	gtk_scale_set_digits (scale, 2);
    	gtk_scale_set_draw_value (scale, FALSE);
     
    	gtk_grid_set_row_spacing (grid, 5);
    	gtk_grid_set_column_homogeneous (grid, FALSE);
    	gtk_grid_set_row_homogeneous (grid, FALSE);
    	gtk_widget_set_halign (GTK_WIDGET (grid), GTK_ALIGN_START);
    	gtk_widget_set_valign (GTK_WIDGET (grid), GTK_ALIGN_START);
     
    /* Attachement des objets les uns dans les autres */
     
    	gtk_grid_attach (grid, GTK_WIDGET (label), 0 , 0, 1, 1);
    	gtk_grid_attach_next_to (grid, GTK_WIDGET (spin), GTK_WIDGET (label), GTK_POS_RIGHT, 1, 1);
     
    	gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid));
     
    	gtk_container_add (GTK_CONTAINER (popup), GTK_WIDGET (scale));
     
    /* Déclaration des fonctions de callback */
     
    	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
    	g_signal_connect (G_OBJECT (spin), "enter-notify-event", G_CALLBACK (cb_show_spin), (gpointer) popup);
     
    	g_signal_connect (G_OBJECT (spin), "value_changed", G_CALLBACK (cb_value_spin_changed), (gpointer) scale);
     
    	g_signal_connect (G_OBJECT (scale), "value_changed", G_CALLBACK (cb_value_scale_changed), (gpointer) spin);
     
    /* Et c'est parti ! */
     
    	gtk_widget_show_all (GTK_WIDGET (window));
     
    	gtk_main ();
     
    	return EXIT_SUCCESS;
     
    }
     
    static gboolean cb_show_spin (GtkSpinButton *spin, GdkEvent *event, GtkWidget *popup)
     
    {
     
    	gtk_widget_show_all (popup);
     
    	(void) spin;
    	(void) event;
     
    	return TRUE;
     
    }
     
    static void cb_value_spin_changed (GtkSpinButton *spin, GtkScale *scale)
     
    {
     
    	gtk_range_set_value (GTK_RANGE (scale), gtk_spin_button_get_value (spin));
     
    }
     
    static void cb_value_scale_changed (GtkScale *scale, GtkSpinButton *spin)
     
    {
     
    	gtk_spin_button_set_value (spin, gtk_range_get_value (GTK_RANGE (scale)));
     
    }
    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

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

Discussions similaires

  1. Problème d'affichage fenêtre popUp
    Par matt2i dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/07/2011, 14h38
  2. Problème alignement image dans fenêtre popup modale
    Par stefsas dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 21/07/2010, 11h56
  3. [Javascript] Problème avec une fenêtre popup.
    Par mika0102 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 18/05/2005, 10h50
  4. Problème Formulaire + popup + page PHP
    Par nesbla dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/02/2005, 00h10
  5. Fenêtre popup modale. Est-ce possible ?
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/02/2005, 17h35

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