• [^] # Re: Resizing

    Posté par . En réponse à la dépêche Freeglut 2.8.0 : vas-y pépé !. Évalué à 3. Dernière modification le 23 janvier 2012 à 00:48.

    Pour une fenêtre non redimensionnable, je laisserais faire le WM. Après tout, c'est à lui de gérer les fenêtres, pas au programme de poser ce genre de limitations. Le programme devrait se cantonner à gérer les redimensionements (le callback défini par glutReshapeFunc). Cela permet de bien se comporter dans tous les cas (WM qui autorise le redimensionnement ou pas).

    Si vraiment tu tiens à le faire toi-même, je vois deux solutions:

    — Utiliser le «gamemode». Donc plutôt du plein écran, avec les éventuels problèmes de retour en résolution d'origine. En fenêtrage, c'est du quitte ou double, et il ne faut pas compter sur un rafraichissement propre du reste de l'écran.

    — Ou bien, au moment du callback sur la fonction de reshape, utiliser glutReshapeWindow pour forcer le redimensionnement immédiat de la fenêtre aux valeurs de ton choix.
    Je pense que c'est une meilleure solution, même si à mon avis ce n'est pas très propre.
    J'ai fait un test pour vérifier, et ça a l'air de marcher (testé avec Freeglut 2.6 , et ça doit même aller avec les versions antérieures).

    #include <stdio.h>
    #include <GL/glut.h>
    int time_period = 25;
    unsigned int width=0, height=0;
    void timer(int id_timer)
    {
     glutPostRedisplay();
     glutTimerFunc(time_period, timer, id_timer);
    }
    void reshape (int w, int h)
    {
     glutReshapeWindow(width,height); //empêche le redimensionnement
     glViewport (0, 0, w, h);
     glMatrixMode (GL_PROJECTION);
     glLoadIdentity ();
     glFrustum(-1,1,0,1, -1,1); /* left, right, bottom, top, near, far */
    }
    void display()
    {
     glClearColor (.5, .5, .5, 1);
     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glMatrixMode (GL_MODELVIEW);
     glLoadIdentity ();
     glutWireTeapot (0.5);
     glTranslatef (-1,0,0);
     glutSwapBuffers ();
    }
    void keyboard (unsigned char c, int mousex, int mousey)
    {
     mousex=mousex; mousey=mousey; //pour les warnings de gcc -W
     if (c==27) exit(0);
    }
    int main (int argc, char **argv)
    {
     width = argc>1?atoi(argv[1]):640;
     height = argc>2?atoi(argv[2]):480;
     width = width < 1024 && width > 0? width:640;
     height = height < 768 && height > 0? height:480;
     glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
     //pas de glutInitWindowPosition pour un WM qui fait le tiling lui même
     glutInitWindowSize (width, height);
     glutInit (&argc, argv);
     glutCreateWindow ("test anti-redimensionnement");
     glutTimerFunc(time_period, timer, 1 /* id timer */);
     glutDisplayFunc (display);
     glutReshapeFunc (reshape);
     glutKeyboardFunc (keyboard);
     glutMainLoop ();
     return 0;
    }
    
    

    Discussions en français sur la création de jeux videos : IRC libera / #gamedev-fr