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

Linux Discussion :

[XLib] Affichages "instantané" de fenêtres et sous-fenêtres


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [XLib] Affichages "instantané" de fenêtres et sous-fenêtres
    Bonjour,

    J'essaie de faire des fenêtres légèrement "avancés" avec XLib (et Cairo, mais je doute que ça importe pour mon problème).

    J'ai donc une fenêtre qui contient plusieurs sous-fenêtres pour afficher différentes choses, comme des boutons. Ça marche très bien. Mais quelque chose me dérange. Lorsque la fenêtre est entièrement recharger pour n'importe quel raison, il y'a un magnifique clignotement et parfois on peut plus ou moins voir l'affichage des différent boutons. Ca s'explique très simplement, l'évènement Expose est d'abord appelé pour la fenêtre principale puis pour chaque sous fenêtre, hors l'affichage se fait directement (X ne calcule pas le rendu final puis, mais affiche les fenêtres les unes sur les autres au fur et à mesure des évènements).

    Y a t il un moyen de corriger ça ?
    J'ai pensé n'utiliser qu'une fenêtre, et au lieu d'utiliser de sous fenêtres pour les widgets je les dessine en même temps que la fenêtre principale. Sauf que dans ce cas, pour les évenement du type MouseIn, MouseOut, Click etc etc, je dois moi m'amuser à calculer sur quel widget cela se fait.

    Merci !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour.

    On peut voir ton code ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Hum, vu la longueur, mauvaise idée.

    Mais voici un court example qui permet de reproduire ça de façon très exagéré avec des sleep(). Les XFlush sont la pour forcer l'affichage au cas ou.

    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
     
    #include <iostream>
    #include <cstdlib>
    #include <stdio.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
     
    GC      gc; 
    Display *display; 
    int     screen; 
    Window  win, subwin, root; 
    unsigned long white_pixel, black_pixel;  
     
    using namespace std;
     
    main() { 
      if ((display = XOpenDisplay ("")) == NULL) { 
        fprintf (stderr, "Can't open Display\n"); 
        exit (1); 
      } 
      gc = DefaultGC (display, screen); 
      screen = DefaultScreen (display); 
      root = RootWindow (display, screen); 
      white_pixel = WhitePixel (display, screen); 
      black_pixel = BlackPixel (display, screen); 
      win = XCreateSimpleWindow (display, root,  
    			     0, 0, 300, 300, 5, black_pixel, white_pixel); 
      XSelectInput (display, win, ExposureMask | ButtonPressMask); 
      XStoreName (display, win, "subwin"); 
      subwin = XCreateSimpleWindow (display, win,  
    			    50, 30, 100, 30, 2, black_pixel, white_pixel); 
      XSelectInput (display, subwin, ExposureMask | ButtonPressMask);  
     
      XMapWindow (display, win); 
      XMapWindow (display, subwin); 
     
      for (;;) { 
        XEvent ev; 
        XNextEvent (display, &ev); 
        switch (ev.type) { 
        case Expose : 
          if (ev.xexpose.window == win) {
    	cout << "drawing win" << endl;
            XDrawString (display, win, gc, 10, 10, "Bienvenue sous win !", 20);
    	XFlush(display);
    	sleep(2);
          }
          if (ev.xexpose.window == subwin) {    
    	cout << "drawing subwin" << endl;
            XDrawString (display, subwin, gc, 10, 10, "sous subwin", 11);
    	XFlush(display);
    	sleep(2);
          }
          break; 
        case ButtonPress  : 
          if (ev.xbutton.window == win)
            XDrawString (display, win, gc, ev.xbutton.x, ev.xbutton.y, "ici", 3);    
          if (ev.xbutton.window == subwin)
            XDrawString (display, subwin, gc, ev.xbutton.x, ev.xbutton.y, "la", 2);   
          break; 
        default : 
          break;            
        } 
      } 
    }
    Ligne de commande pour compiler :
    g++ -lX11 -L/usr/lib/X11/ fichier.cpp -o fichier

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