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

SDL Discussion :

Que faire lorsqu'une surface est détruite ?


Sujet :

SDL

  1. #1
    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 : 40
    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 Que faire lorsqu'une surface est détruite ?
    Bonjour,

    Dans le cadre du projet GtkSDL j'ai un problème lorsque l'utilisateur ferme la fenêtre. Cela détruit le widget qui permet de dessiner avec SDL mais comment en informer le développeur ?

    Actuellement j'envoie l'évènement SDL_Quit puis je détruit le widget. Mais rien n'oblige le développeur à ne plus utiliser cette surface. En plus la file d'évènements n'est pas spécifique à une surface : je peux avoir plusieurs surfaces et ne vouloir en supprimer qu'une seule.

    En tant que développeur SDL, qu'est ce qui vous irez comme solution ? Une fonction permettant de savoir si une surface est toujours valide ? Un évènement utilisateur précisant quelle surface n'est plus valide ?

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par gege2061
    Actuellement j'envoie l'évènement SDL_Quit puis je détruit le widget. Mais rien n'oblige le développeur à ne plus utiliser cette surface. En plus la file d'évènements n'est pas spécifique à une surface : je peux avoir plusieurs surfaces et ne vouloir en supprimer qu'une seule.
    Je te conseillerais trois approches :

    - Le développeur, lorsqu'il crée la widget peut demander qu'une fonction soit appelée lorsque la widget se ferme et réglé le reste en interne.
    - Le développeur ne devrait que toucher la surface de la widget dans la fonction de rendu, pourquoi aurait-il le pointeur de la surface en interne (sauf s'il s'amuse à sauvegarder ce pointeur mais bon, quelle idée!) du coup, tant que tu n'appelle pas la fonction de rendu, le développeur ne pourra plus l'utiliser.
    - Utiliser un événement pour dire au développeur que la surface a été virer mais pas un événement interne, envoi tout simplement SDL_QUIT et laisse le développeur fermer. Au pire, une fois que le message a été capté par le développeur tu peux fermer aussi.

    En tant que développeur SDL, qu'est ce qui vous irez comme solution ? Une fonction permettant de savoir si une surface est toujours valide ? Un évènement utilisateur précisant quelle surface n'est plus valide ?
    Les deux en fait sont utiles, je te conseille de proposer les deux solutions. Par contre, attention, si tu acceptes plusieurs fenêtres SDL (je me demande comment tu fais), il faudrait passer par autre chose que SDL_QUIT...

    Jc

  3. #3
    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 : 40
    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
    Citation Envoyé par fearyourself
    - Le développeur, lorsqu'il crée la widget peut demander qu'une fonction soit appelée lorsque la widget se ferme et réglé le reste en interne.
    ça c'est bon, ça se fait tout seul

    Citation Envoyé par fearyourself
    - Le développeur ne devrait que toucher la surface de la widget dans la fonction de rendu, pourquoi aurait-il le pointeur de la surface en interne (sauf s'il s'amuse à sauvegarder ce pointeur mais bon, quelle idée!) du coup, tant que tu n'appelle pas la fonction de rendu, le développeur ne pourra plus l'utiliser.
    Pour dessiner comment tu fais ? Peut être en forçant le développeur à faire du double buffering, il dessine sur une surface qu'il créé puis appel une fonction perso pour copier sa surface sur celle du widget.

    Citation Envoyé par fearyourself
    - Utiliser un événement pour dire au développeur que la surface a été virer mais pas un événement interne,
    Pas interne à quoi ?

    Citation Envoyé par fearyourself
    envoi tout simplement SDL_QUIT et laisse le développeur fermer. Au pire, une fois que le message a été capté par le développeur tu peux fermer aussi.
    Faut qu'avec ton exemple ça plante
    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
          while (!done)
          {
            refresh (p_gtk_sdl);
            while (SDL_PollEvent (&event))
            {
              switch (event.type)
              {
                case SDL_QUIT:
                  done = 1;
                break;
              }
            }
    /*
     * Ici tu utilise la surface alors qu'elle a été détuite !
    */
            Frame (screen);
            fps++;
            now = SDL_GetTicks ();
            if (now - last > 1000)
            {
              fps /= (now - last) / 1000;
              printf ("FPS : %d\n", fps);
              fps = 0;
              last = SDL_GetTicks ();
            }
          }
    Citation Envoyé par fearyourself
    Les deux en fait sont utiles, je te conseille de proposer les deux solutions. Par contre, attention, si tu acceptes plusieurs fenêtres SDL (je me demande comment tu fais)
    Bah je sais pas, il est possible de créer plusieurs surfaces mais on ne peut en afficher qu'une seule ? Je suis pas spécialiste de la SDL et je suis un peu perdu avec les buffers

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Faut qu'avec ton exemple ça plante
    Il faudrait entourer les fonctions de rendu par un "if (!done)", non ?

    Bah je sais pas, il est possible de créer plusieurs surfaces mais on ne peut en afficher qu'une seule ? Je suis pas spécialiste de la SDL et je suis un peu perdu avec les buffers
    SDL ne permet d'utiliser qu'une fenêtre de rendu. Mais ça sera corrigé dans un futur proche, non ?

  5. #5
    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 : 40
    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
    Citation Envoyé par Laurent Gomila
    Il faudrait entourer les fonctions de rendu par un "if (!done)", non ?
    Par exemple, mais le but n'est pas de corriger l'exemple


    Citation Envoyé par Laurent Gomila
    SDL ne permet d'utiliser qu'une fenêtre de rendu. Mais ça sera corrigé dans un futur proche, non ?
    Cool, dans ce cas on verra ça dans la v2.0

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il faudrait entourer les fonctions de rendu par un "if (!done)", non ?
    En effet, dans la SDL de base, SDL_QUIT dit qu'il y a une demande de quitter mais on peut le refuser si on ne le gére pas, c'est pour cela qu'on peut faire un dernier rendu sans crainte.

    Dans le cas présent, il faudrait ajouter ce test, ou faire le rendu avant la gestion des événements.

    Pour dessiner comment tu fais ? Peut être en forçant le développeur à faire du double buffering, il dessine sur une surface qu'il créé puis appel une fonction perso pour copier sa surface sur celle du widget.
    Pourquoi ne pas demander la surface du widget et donc la fonction rend NULL si la widget n'est plus active.

    Pas interne à quoi ?
    Je voulais dire utilisateur.



    SDL ne permet d'utiliser qu'une fenêtre de rendu. Mais ça sera corrigé dans un futur proche, non ?
    Rien de prêvu dans l'horizon mais dans la SDL 2 cela devrait apparaître en effet.

    Jc

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Par exemple, mais le but n'est pas de corriger l'exemple
    Ce que je voulais dire c'est que là l'erreur venait de l'exemple, en situation "normale" on n'est plus censés utiliser les fonctions de rendu après avoir reçu un SDL_Quit, non ?

    Sinon, petit hors-sujet tant qu'on y est : SDL 2.0 est prévu pour bientôt ?

  8. #8
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    non, d'abord SDL 1.3 ^^

    info trouvée ici.

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ce que je voulais dire c'est que là l'erreur venait de l'exemple, en situation "normale" on n'est plus censés utiliser les fonctions de rendu après avoir reçu un SDL_Quit, non ?
    Non, SDL_QUIT est un message comme un autre, rien n'est fait tant que l'utilisateur n'appelle pas SDL_Quit et sors du programme.

    Sinon, petit hors-sujet tant qu'on y est : SDL 2.0 est prévu pour bientôt ?
    C'est pour le moment mis en pause je crois, je ne vois plus circuler beaucoup d'information à propos.

    Jc

  10. #10
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Selon moi, il faudrait faire comme SDL:

    Créer un évènement pour indiquer la destruction du widget. Par contre il faudrait le différencier de SDL_QUIT, par exemple lui donner comme type SDL_WIDGET_QUIT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /** Dans le .h **/
    ...
    #define SDL_WIDGET_QUIT 25
    ...
     
    SDL_Event event;
    event.type = SDL_WIDGET_QUIT;
    SDL_PushEvent(&event);
    C'est possible car sur l'enum les evenement 25, 26 .... , 31 ne sont pas utilisés.

    Apres l'utilisateur appelerait une fonction SDL_Widget_Quit(). On peut aussi faire une fonction SDL_Widget_WasInit() (comme SDL_WasInit()).

    Tout cela bien sûr dans la limite du possible.

    Edit: De plus, si on detruit le widget tout de suite, rien ne nous dit que l'utilisateur a fait un autre SDL_PollEvent avant tout rendu, donc le programme aura de fortes chances de planter. Même si il effectue un test, il y a de *toutes petites* chances que l'utilisateur ferme entre le test et le rendu

    ~coyotte508

  11. #11
    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 : 40
    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
    Citation Envoyé par coyotte507
    Créer un évènement pour indiquer la destruction du widget. Par contre il faudrait le différencier de SDL_QUIT, par exemple lui donner comme type SDL_WIDGET_QUIT:
    C'est marqué dans la doc que ces évènements réservés à une utilisation libre ? Parce que le jour où les développeurs de la SDL se décident à les utiliser, ça va être un beau bug

    Citation Envoyé par coyotte507
    Edit: De plus, si on detruit le widget tout de suite, rien ne nous dit que l'utilisateur a fait un autre SDL_PollEvent avant tout rendu, donc le programme aura de fortes chances de planter. Même si il effectue un test, il y a de *toutes petites* chances que l'utilisateur ferme entre le test et le rendu
    J'ai déjà rencontré ce problème, je suis obligé de lancer deux fois la boucle (en cliquant sur un bouton) pour que l'animation s'affiche (j'ai pas encore trouvé le bug) mais lorsque je fait ça, ça plante

    Je pense que l'on va partir sur un mixe de toutes vos idées :
    • A la destruction du widget, l'événement SDL_QUIT sera envoyé (devrais produire le comportement attendu dans 90% des cas)
    • Mettre la surface en privée et proposer une fonction pour y accéder, qui retournera NULL si le widget a été détruit


    Merci pour vos aide, je reviendrai surement vous voir

  12. #12
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    SDL_Events.h
    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
    /* Event enumerations */
    typedef enum {
           SDL_NOEVENT = 0,			/* Unused (do not remove) */
           SDL_ACTIVEEVENT,			/* Application loses/gains visibility */
           SDL_KEYDOWN,			/* Keys pressed */
           SDL_KEYUP,			/* Keys released */
           SDL_MOUSEMOTION,			/* Mouse moved */
           SDL_MOUSEBUTTONDOWN,		/* Mouse button pressed */
           SDL_MOUSEBUTTONUP,		/* Mouse button released */
           SDL_JOYAXISMOTION,		/* Joystick axis motion */
           SDL_JOYBALLMOTION,		/* Joystick trackball motion */
           SDL_JOYHATMOTION,		/* Joystick hat position change */
           SDL_JOYBUTTONDOWN,		/* Joystick button pressed */
           SDL_JOYBUTTONUP,			/* Joystick button released */
           SDL_QUIT,			/* User-requested quit */
           SDL_SYSWMEVENT,			/* System specific event */
           SDL_EVENT_RESERVEDA,		/* Reserved for future use.. */
           SDL_EVENT_RESERVEDB,		/* Reserved for future use.. */
           SDL_VIDEORESIZE,			/* User resized video mode */
           SDL_VIDEOEXPOSE,			/* Screen needs to be redrawn */
           SDL_EVENT_RESERVED2,		/* Reserved for future use.. */
           SDL_EVENT_RESERVED3,		/* Reserved for future use.. */
           SDL_EVENT_RESERVED4,		/* Reserved for future use.. */
           SDL_EVENT_RESERVED5,		/* Reserved for future use.. */
           SDL_EVENT_RESERVED6,		/* Reserved for future use.. */
           SDL_EVENT_RESERVED7,		/* Reserved for future use.. */
           /* Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */
           SDL_USEREVENT = 24,
           /* This last event is only for bounding internal arrays
    	  It is the number of bits in the event mask datatype -- Uint32
            */
           SDL_NUMEVENTS = 32
    } SDL_EventType;
    Il en ont déjà réservé 8, les autres c'est marqué que c'est pour nous

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

Discussions similaires

  1. Que faire si une méthode est deprecated
    Par yrtera dans le forum Android
    Réponses: 8
    Dernier message: 08/01/2014, 11h52
  2. Que faire lorsque le fichier est vide?
    Par bsangoku dans le forum Débuter
    Réponses: 6
    Dernier message: 18/01/2010, 13h46
  3. Réponses: 26
    Dernier message: 23/12/2009, 17h33
  4. Que faire lorsque la résolution d'écran est mauvaise ?
    Par gifffftane dans le forum Administration système
    Réponses: 2
    Dernier message: 13/06/2007, 22h30
  5. Que faire lorsque les performances d'une base chute ?
    Par Doctor Z dans le forum Oracle
    Réponses: 11
    Dernier message: 16/02/2005, 14h38

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