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 :

Comment fonctionne les evenements EXPOSE et l'input buffer d'un serveur X avec XLIB


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Comment fonctionne les evenements EXPOSE et l'input buffer d'un serveur X avec XLIB
    Bonjour,

    Je vous envoie cet email car je suis dans l'impasse en utilisant xlib sous LINUX.

    Le probleme c'est que lorsque je fait bouger (et creer aussi) une grande quantite de fenetre (plusieurs fois) alors il y a des evenements expose qui ne me parviennent pas venant du serveur X.
    Les fenetres en questions sont tous de meme niveau (ayant le meme parent) et ne se chauvauchent pas, aucune ne cache ou touche une autre. En fait l'objectif c'est de faire bouger une partie d'une matrice de fenetres puis inserer de nouvelles fenetres à l'interieur de l'espace vide.

    Mon gestionnaire d'evenement des expose ne capte pas tout les evenements. Lorsque je teste le buffer des evenements JUSTE apres chaque XMoveWindow() eh bien l'expose en question y est present ! Mais lorsque PLUSIEURS XMoveWindow() sur plusieurs fenetres, le gestionnaire ne trouve plus l'expose ! (bien sur apres avoir enleve le petit test).
    Le gestionnaire d'evenement se trouve a la fin de toutes les actions de creation puis de deplacement de fenetres.

    Par ailleurs je me demande pourquoi certaine fenetre sont effacees et certaines restent intacte (le backing store n'est pas active).
    Pour celles detruites, le gestionnaire ne recoit pas certains evenements expose.

    Pourriez vous m'eclairez et me donner des explications et/ou solutions ?
    Est ce que le buffer des evenements possede un fonctionnement particulier
    qu'il faut maitriser ?

    Je cherche aussi un endroit ou l'on peut discuter en Francais exclusivement de XLIB/Xwindow.

    Merci d'avance.

    --------------------------------
    J'utilise slackware 10.1
    kernel 2.6.12
    X.org x11-6.8.1
    G.D.M

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut

    Citation Envoyé par intmail Voir le message
    Mon gestionnaire d'evenement des expose ne capte pas tout les evenements. Lorsque je teste le buffer des evenements JUSTE apres chaque XMoveWindow() eh bien l'expose en question y est present ! Mais lorsque PLUSIEURS XMoveWindow() sur plusieurs fenetres, le gestionnaire ne trouve plus l'expose ! (bien sur apres avoir enleve le petit test).
    Le gestionnaire d'evenement se trouve a la fin de toutes les actions de creation puis de deplacement de fenetres.
    A tout hasard, a chaque creation de fenetre tu as associe un XSelectInput avec ExposureMask?

    Petite remarque:
    Citation Envoyé par intmail Voir le message
    Le probleme c'est que lorsque je fait bouger (et creer aussi) une grande quantite de fenetre (plusieurs fois) alors il y a des evenements expose qui ne me parviennent pas venant du serveur X.
    Les fenetres en questions sont tous de meme niveau (ayant le meme parent) et ne se chauvauchent pas, aucune ne cache ou touche une autre. En fait l'objectif c'est de faire bouger une partie d'une matrice de fenetres puis inserer de nouvelles fenetres à l'interieur de l'espace vide.
    Bon en gros tu fais un gestionnaire de fenetres et tu veux donc gerer leur position / dimension c'est ca? Ce ne serait pas plus simple de redimensionner tes fenetres puis reagir a l'evenement configure? Expose n'est pas tellement garanti comme tu le fais remarquer:
    Citation Envoyé par intmail Voir le message
    Par ailleurs je me demande pourquoi certaine fenetre sont effacees et certaines restent intacte (le backing store n'est pas active).
    Pour celles detruites, le gestionnaire ne recoit pas certains evenements expose.
    J'espere t'avoir aide un peu mais c'est difficile sans voir le code de creation de fenetre et ton gestionnaire d'evenement (au minimum) pour voir un peu mieux ce qu'il se passe.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par intmail Voir le message
    Bonjour,

    Je vous envoie cet email car je suis dans l'impasse en utilisant xlib sous LINUX.

    Le probleme c'est que lorsque je fait bouger (et creer aussi) une grande quantite de fenetre (plusieurs fois) alors il y a des evenements expose qui ne me parviennent pas venant du serveur X.
    Les fenetres en questions sont tous de meme niveau (ayant le meme parent) et ne se chauvauchent pas, aucune ne cache ou touche une autre. En fait l'objectif c'est de faire bouger une partie d'une matrice de fenetres puis inserer de nouvelles fenetres à l'interieur de l'espace vide.

    Mon gestionnaire d'evenement des expose ne capte pas tout les evenements. Lorsque je teste le buffer des evenements JUSTE apres chaque XMoveWindow() eh bien l'expose en question y est present ! Mais lorsque PLUSIEURS XMoveWindow() sur plusieurs fenetres, le gestionnaire ne trouve plus l'expose ! (bien sur apres avoir enleve le petit test).
    Le gestionnaire d'evenement se trouve a la fin de toutes les actions de creation puis de deplacement de fenetres.

    Par ailleurs je me demande pourquoi certaine fenetre sont effacees et certaines restent intacte (le backing store n'est pas active).
    Pour celles detruites, le gestionnaire ne recoit pas certains evenements expose.

    Pourriez vous m'eclairez et me donner des explications et/ou solutions ?
    Est ce que le buffer des evenements possede un fonctionnement particulier
    qu'il faut maitriser ?

    Je cherche aussi un endroit ou l'on peut discuter en Francais exclusivement de XLIB/Xwindow.

    Merci d'avance.

    --------------------------------
    J'utilise slackware 10.1
    kernel 2.6.12
    X.org x11-6.8.1
    G.D.M
    Une question stupide : pourquoi ne pas utiliser XtMainLoop ??

    Le serveur X gère une queue d'événements. TOUS les événements y figurent.

    Les fonction du style XPeekEvent, XCheckIfEvent, etc etc peuvent servir, de même que XNextEvent si tu te fais ta propre mainloop.

    Cependant, comme les dialogues se font par protocole, il peut y avoir des temps de latence. Si vraiment tu veux être sûr que tous les événements sont traités, il faut synchroniser. En général un bloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    XSynchronize ( dpy, True ); /* quand c'est reçu, dis au serveur de démarrer la snchro */
    XSync ( dpy, False); /* dis au serveur de vider ses queues (tu peux ajouter XFlush, mais pas nécessaire puisqu'on est en synchro) */
    Puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XSynchronize ( dpy, False ): /* on se remet en mode "bufferisé" */
    NOTE : pour l'endroit, c'est ici la plupart du temps, car j'ai déjà argumenté pour la création d'un sous-forum, mais à cause de Qt, GTK, et autres toolkits, X bien que présent partout, ne semble pas être utilisé en tant que tel...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    a tonton fred:

    >A tout hasard, a chaque creation de fenetre tu as associe un XSelectInput >avec ExposureMask?


    C'est deja fait.


    >Bon en gros tu fais un gestionnaire de fenetres et tu veux donc gerer leur >position / dimension c'est ca?

    C'est pour creer une grille. Cela ressemble a un tableur Excel.


    >Ce ne serait pas plus simple de redimensionner tes fenetres puis reagir a >l'evenement configure? Expose n'est pas tellement garanti comme tu le fais >remarquer:


    Il s'agit de deplacer (et non de redimensionner) d'abord des lignes de fenetres puis de creer des fenetres sur la place ainsi liberee. On refait plusieurs fois ces actions. Une fois apres on lance le gestionnaire pour detecter l'evenement expose. C'est la que le probleme apparait l'evenement est absent alors que le contenu de certaines fenetres est detruit.
    Je suspecte le serveur x de ne pas pouvoir supporter des traitements massifs.



    a souviron34:

    >Une question stupide : pourquoi ne pas utiliser XtMainLoop ??

    Je parle ici de xlib et non de xintrinsic Toolkit

    >Cependant, comme les dialogues se font par protocole, il peut y avoir des >temps de latence. Si vraiment tu veux être sûr que tous les événements >sont traités, il faut synchroniser. En général un bloc :

    J'ai deja insere une fonction sleep(1) apres chaque fonction Xlib. Mais je vais quand meme modifier la synchronisation pour voir si ca marche.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par intmail Voir le message
    C'est pour creer une grille. Cela ressemble a un tableur Excel.
    [...]
    Il s'agit de deplacer (et non de redimensionner) d'abord des lignes de fenetres puis de creer des fenetres sur la place ainsi liberee. On refait plusieurs fois ces actions. Une fois apres on lance le gestionnaire pour detecter l'evenement expose. C'est la que le probleme apparait l'evenement est absent alors que le contenu de certaines fenetres est detruit.
    Je suspecte le serveur x de ne pas pouvoir supporter des traitements massifs.
    Donc si je comprends bien, tu crees les fenetres avec des le depart la bonne taille puis tu les deplaces? D'abord toutes les creations puis tous les placements ou une par une?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par intmail Voir le message
    Il s'agit de deplacer (et non de redimensionner) d'abord des lignes de fenetres puis de creer des fenetres sur la place ainsi liberee. On refait plusieurs fois ces actions. Une fois apres on lance le gestionnaire pour detecter l'evenement expose.C'est la que le probleme apparait l'evenement est absent alors que le contenu de certaines fenetres est detruit.
    Je suspecte le serveur x de ne pas pouvoir supporter des traitements massifs.
    Je suspecte plutôt que le temps mis entre ta boucle de création et le début de ton lancement du gestionnaire est trop long et que tu rates toi-même les événements. Ca se saurait, en 25 ans, si il y avait un bug de ce style.




    Citation Envoyé par intmail Voir le message
    a souviron34:

    >Une question stupide : pourquoi ne pas utiliser XtMainLoop ??

    Je parle ici de xlib et non de xintrinsic Toolkit
    Et ? Est-ce dans le cadre d'un exercice ou d'un cours ??

    Sinon aucune raison de ne pas faire appel à la Toolkit , qui est standard, et livré simultanément, et fait partie du même package.


    Citation Envoyé par intmail Voir le message
    >Cependant, comme les dialogues se font par protocole, il peut y avoir des >temps de latence. Si vraiment tu veux être sûr que tous les événements >sont traités, il faut synchroniser. En général un bloc :

    J'ai deja insere une fonction sleep(1) apres chaque fonction Xlib. Mais je vais quand meme modifier la synchronisation pour voir si ca marche.
    [/QUOTE]

    Je crois que tu rates complètement la philosophie de X.

    sleep fait endormir ton processus, et ne touche en rien le serveur X.

    Donne un exemple de ton code, et on verra ce qu'on peut faire...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J'ai resolu le probleme. L'erreur c'est que je n'ai pas utilise la
    bonne fonction pour extraire et acceder au buffer d'entree des evenements.

    D'abord je cree des fenetres:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     window=XCreateWindow(DefaultDisplay, parent_window, x, y, width, height,
                            border_width, CopyFromParent,
                            InputOutput, CopyFromParent, valuemask, &attributes); 
     XSelectInput(DefaultDisplay, window, ExposureMask); 
     XMapRaised(DefaultDisplay, window);
     XFlush(DefaultDisplay);
    Maintenant l'erreur bete car j'attend ici l'arrivee du premier evenement
    expose de cette nouvelle fenetre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(1)
       {
        if( XCheckMaskEvent(DefaultDisplay, (long) ExposureMask, &xevent)== True)
          if( xevent.type==Expose && xevent.xany.window== window ) break;
       }
    A chaque fois que XCheckMaskEvent() rencontre un evenement expose alors elle l'efface. Voila l'erreur et la raison pour laquelle certains evenements ont disparus. TOUS les evenements
    avant celui que j'attend vont disparaitre par contre ceux qui sont apres restent intacte.

    La bonne fonction c'est XWindowEvent(). Elle est plus selective (et tourne en boucle)
    car permet de cibler uniquement un evenement expose correspondant a une fenetre precise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XWindowEvent(DefaultDisplay, window , (long) ExposureMask, &xevent);

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par intmail Voir le message
    La bonne fonction c'est XWindowEvent(). Elle est plus selective (et tourne en boucle)
    car permet de cibler uniquement un evenement expose correspondant a une fenetre precise:
    Boff..

    Puisque tu as les ids de fenêtres, pourquoi pas simplement soit XCheckIfEvent, XPeekEvent, ou encore plus simplement XNextEvent ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. Comment différencier les événements sur wxButton ?
    Par Eldered dans le forum wxWidgets
    Réponses: 7
    Dernier message: 24/04/2008, 17h54
  2. Réponses: 9
    Dernier message: 23/05/2006, 15h33
  3. [VB6] Comment fonctionne les Tableaux ?
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 27/04/2006, 14h59
  4. [FLASH 8] Comment fonctionne les clips
    Par steeves5 dans le forum Flash
    Réponses: 3
    Dernier message: 27/01/2006, 10h23
  5. Comment fonctionnent les index des options d'un select ?
    Par pekka77 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/10/2005, 18h05

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