Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/10/2011, à 22:18

Alex dit Sean

Signal 'realize' GTK

Bonjour,

Je me permet de laisser un petit message ici parce que je suis en train de réaliser un lecteur musical en GTK mais qui utilise aussi un affichage avec OpenGL (les deux combinées). Pour ça, rien de plus simple, j'utilise la librairie GtkGLExt qui permet d'utiliser les fonction OpenGL sur n'importe quel widget GTK, et plus particulièrement sur une GtkDrawingArea.

Voilà pour le décor.
Maintenant, venons en au problème. Pour utiliser GtkGLExt j'ai suivi ce petit tutoriel.
Comme vous pourrez le voir en lisant la deuxième partie, il faut relier le signal 'realize' du widget sur lequel on dessine à la fonction d'initialisation. C'est la que j'ai un problème. Normalement, le signal 'realize' n'est émis qu'une fois, à la création du widget. Normalement, si on détache le widget de son parent et qu'on le cache, puis qu'on le ré-affiche, le signal n'est pas ré-émis, seul le signal 'show' est émis. Mais moi, non, il ré-émet le signal realize à chaque fois, ce qui fait que mes données relatives à OpenGL (position de la caméra...) sont remisent à zéro, et ça m'énerve. sad

Mon raisonnement en gras n'est pas faux? Est-ce qu'il y a des subtilités dans les signaux que je n'aurais pas saisie?
Je sais que je n'ai pas mis un seul bout de code, je ne pense pas que ce soit nécessaire, en revanche si vous voulez voir le code, allez ici.


Pour ceux qui veulent, une petite explication du code.
En fait, ma fenêtre principale me permet d'afficher 4 "choses" différentes, une fenêtre de préférence, une fenêtre qui liste les morceaux, une fenêtre "A Propos" et la fenêtre qui fait du OpenGL.
A chaque fois que je demande à changer ce qui est afficher, je détache le widget attaché au conteneur principal et ne rattache que celui que je veux afficher. Normalement, les widgets que j'attache sont déja créés (donc le signal 'realize' a déja été émis), et je ne fais donc que les réafficher.

Si vous voulez plus d'info (sans avoir à vous farcir tout mon code), n'hésitez pas à demander.
Merci d'avance à ceux qui répondrons.

Alexis


- Einstein à dit :
Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !
Une personne qui n'a jamais commis d'erreurs n'a jamais tenté d'innover.

Hors ligne

#2 Le 06/10/2011, à 09:16

jeromeg

Re : Signal 'realize' GTK

Salut,

Je ne suis pas sûr, mais il me semble que c'est parce que tu détaches/attaches le widget de/à son parent à chaque qu'un nouveau signal 'realized' est émis à chaque fois, gtk doit reprendre "l'initialisation graphique" dans ce cas à mon avis. As-tu essayé d'utiliser uniquement gtk_widget_hide et gtk_widget_show sans détacher/attacher ?

Jérôme

Hors ligne

#3 Le 06/10/2011, à 19:19

Alex dit Sean

Re : Signal 'realize' GTK

C'est bien ce que je craignais...
Le problème c'est que je ne peux pas me contenter d'un Gtk_widget_show/hide parce que la GtkBox n'accepte qu'un seul fils pas emplacement. Donc après, quand je veux afficher une autre fenêtre (du genre celle des préférences), il m'ajoute une case à mon GtkBox, et la fenêtre d'avant ne disparait pas...
En revanche, je viens de lire un truc dans le doc GTK. La fonction gtk_container_remove détruit la référence qu'il a sur le widget fils. Or, si le compteur de références tombe à zéro, le widget est détruit, j'ai peur que c'est ce qui arrive. Donc si à l'initialisation de l'appli je fait un g_object_ref sur ce widget, le problème devrait être résolu. J'essaye ça ce soir. Je te tiens au courant.

Merci quand même pour la réponse.
Alexis


[EDIT]
Mauvaise nouvelle ça marche toujours pas.
En revanche, j'ai fais quelques tests. Le widget n'est pas détruit mais il est unrealized. En effet le signal 'unrealize' est émis a chaque fois que je le détache de son parent. Ça parait normal que lorsque je le rattache le signal 'realize' soit émis. Mais du coup, est-ce qu'il y aurait un signal correspondant à la création, l'inverse du signal 'destroy'...

Dernière modification par Alex dit Sean (Le 06/10/2011, à 22:30)


- Einstein à dit :
Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !
Une personne qui n'a jamais commis d'erreurs n'a jamais tenté d'innover.

Hors ligne

#4 Le 08/10/2011, à 13:58

jeromeg

Re : Signal 'realize' GTK

Alex dit Sean a écrit :

C'est bien ce que je craignais...
Le problème c'est que je ne peux pas me contenter d'un Gtk_widget_show/hide parce que la GtkBox n'accepte qu'un seul fils pas emplacement. Donc après, quand je veux afficher une autre fenêtre (du genre celle des préférences), il m'ajoute une case à mon GtkBox, et la fenêtre d'avant ne disparait pas...

Je ne comprends pas ton problème, pourquoi est-ce que tu ne fais pas quelque chose comme ça (code fait vite fait à l'arrache) :

#include <gtk/gtk.h>

gint box;
GtkWidget *box1;
GtkWidget *box2;

void button_clicked (GtkButton *button, GtkDialog *dialog)
{
  if (box == 1)
    {
      gtk_widget_hide (box1);
      gtk_widget_show (box2);

      box = 2;
    }
  else
    {
      gtk_widget_hide (box2);
      gtk_widget_show (box1);

      box = 1;
    }
}

int
main (int argc, char **argv)
{
  GtkWidget *dialog;
  GtkWidget *label1;
  GtkWidget *label2;
  GtkWidget *button;

  gtk_init (&argc, &argv);

  dialog = gtk_dialog_new ();

  box1 = gtk_vbox_new (FALSE, 0);
  label1 = gtk_label_new ("Showing box 1");
  gtk_container_add (GTK_CONTAINER (box1), label1);
  gtk_widget_show (label1);
  gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), box1);
  gtk_widget_show (box1);
  box = 1;

  box2 = gtk_vbox_new (FALSE, 0);
  label2 = gtk_label_new ("Showing box 2");
  gtk_widget_show (label2);
  gtk_container_add (GTK_CONTAINER (box2), label2);
  gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), box2);

  button = gtk_button_new_with_label ("Toggle boxes");
  gtk_container_add (GTK_CONTAINER (gtk_dialog_get_action_area (GTK_DIALOG (dialog))), button);
  gtk_widget_show (button);

  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (button_clicked), dialog);

  gtk_widget_show (dialog);

  gtk_main();

  return 0;
}

Hors ligne

#5 Le 08/10/2011, à 20:45

Alex dit Sean

Re : Signal 'realize' GTK

Et bien le problème dans ta technique, c'est que malgré le fait que le widget soit caché (hide), il existe et est présent dans son conteneur. Du coup à l'ajout de la box2 dans le même conteneur, il me rajoute une nouvelle case ce qui fait qu'en swappant hide/show, ça remplace pas les fenêtres, les deux boxs, sont l'une à coté de l'autre et c'est pas le résultat que je veux.


- Einstein à dit :
Les machines un jour pourront résoudre tous les problèmes, mais jamais aucune d'entre elles ne pourra en poser un !
Une personne qui n'a jamais commis d'erreurs n'a jamais tenté d'innover.

Hors ligne