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

Bibliothèques Discussion :

[Xlib] XConfigureWindow capricieux


Sujet :

Bibliothèques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut [Xlib] XConfigureWindow capricieux
    Salut à tous,
    Je suis en train d'écrire un embryon de WM, et afin de debugger un module qui avait un comportement bizarre, j'ai écris deux petits programmes de test afin de bien cerner le problème.
    Je le précise, car dans ces deux programmes de test, certaines vérifications ne sont pas faites, vu que c'est juste pour tester un point particulier.
    Bon.
    Ces deux programmes sont donc destinés à tourner dans un X tout seul, sans WM. Je les lance dans mon .xinitrc avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ~/path/programme_de_test &
    xterm
    Le premier programme que j'ai écrit est celui qui .. marche.
    Il attend un keypress, et fait un XConfigureWindow bourrin sur toutes les fenêtres lancées (pas très utile, mais c'est pour tester le XConfigureWindow).
    Tout se passe bien, ça marche, et voici le code :
    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 <stdio.h>
    #include <X11/Xlib.h>
    #include <X11/keysym.h>
     
    unsigned int numlockmask = 0;
     
    void updatenumlockmask(Display *dpy) {
        unsigned int i, j;
        XModifierKeymap *modmap;
     
        numlockmask = 0;
        modmap = XGetModifierMapping(dpy);
        for(i = 0; i < 8; i++)
            for(j = 0; j < modmap->max_keypermod; j++)
                if(modmap->modifiermap[i * modmap->max_keypermod + j]
                   == XKeysymToKeycode(dpy, XK_Num_Lock))
                    numlockmask = (1 << i);
        XFreeModifiermap(modmap);
    }
     
    int main()
    {
        Display* dpy;
        Window root;
        XWindowChanges wc;
        XEvent ev;
     
        if (!(dpy = XOpenDisplay(0x0))) return 1;
        root = DefaultRootWindow(dpy);
     
        printf("~\n");
     
        XSetWindowAttributes wa;
        wa.event_mask = StructureNotifyMask|SubstructureNotifyMask;
        XChangeWindowAttributes(dpy, root, CWEventMask, &wa);
        XSelectInput(dpy, root, wa.event_mask);
     
        unsigned int i, num;
        Window d1, d2, *wins = NULL;
     
        updatenumlockmask(dpy);
     
        XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("t")), Mod4Mask, root, True, GrabModeAsync, GrabModeAsync);
         XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("t")), Mod4Mask|numlockmask, root, True, GrabModeAsync, GrabModeAsync);
     
        wc.x = 100;
        wc.y = 100;
     
        while(1) {
            XNextEvent(dpy, &ev);
     
            if(ev.type == KeyPress) {
                printf("KeyPressed\n");
     
                if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
                    for(i=0; i<num; i++) {
                        XConfigureWindow(dpy, wins[i], CWX|CWY, &wc);
                        printf("-\n");
                    }
                }
     
            }
        }
        return 0;
    }
    Donc, ici, j'utilise un keypress pour déclencher le XConfigureWindow.
    Sauf qu'à terme, dans mon programme, ce ne sera pas un event issu de la Xlib qui sera censé déclencher le XConfigureWindow. (ce sera un event inotify).
    Donc, toujours pour tester, j'ai mis un déclencheur moche sur la création d'un fichier, sans toucher au reste du code. Au lieu d'attendre un keypress, on attend que le fichier soit créé.
    A mon sens, ça n'intervient pas sur le comportement de la Xlib.
    Et pourtant, du coup, ça ne marche plus. o_o
    Le XConfigureWindow est bien fait (je le vois grâce aux printf("-\n"), mais la fenêtre ne bouge pas !
    Voici le second code :
    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
    #include <stdio.h>
    #include <X11/Xlib.h>
     
    int main()
    {
        Display* dpy;
        Window root;
        XWindowChanges wc;
     
        if (!(dpy = XOpenDisplay(0x0))) return 1;
        root = DefaultRootWindow(dpy);
     
        printf("~\n");
     
        XSetWindowAttributes wa;
        wa.event_mask = StructureNotifyMask|SubstructureNotifyMask;
        XChangeWindowAttributes(dpy, root, CWEventMask, &wa);
        XSelectInput(dpy, root, wa.event_mask);
     
        unsigned int i, num;
        Window d1, d2, *wins = NULL;
     
        wc.x = 100;
        wc.y = 100;
     
        FILE* file=NULL;
        while(1) {
     
            if((file = fopen("/tmp/foo", "r")) != NULL) {
                printf("Event\n");
     
                if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
                    for(i=0; i<num; i++) {
                        XConfigureWindow(dpy, wins[i], CWX|CWY, &wc);
                        printf("-\n");
                    }
                }
                fclose(file);
                remove("/tmp/foo");
            }
        }
        return 0;
    }
    C'est vraiment très bizarre... Et ça m'embête énormément, vu que je suis bloqué depuis quelques jours sur cette merdouille, et que je n'ai vraiment aucune idée de la manière dont debugger ceci... Pour moi, ça tient du comportement magique, là...

    Je requiert donc de l'aide ...
    Merci d'avance,
    Armael

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    J'ai bien testé un déclenchement par signaux, via un handler sur SIGUSR1, mais c'est du pareil au même...
    De même, j'ai ajouté l'envoi d'un ConfigureNotify à la fenêtre après le XConfigureWindow, ça ne marche pas pour autant...

    Franchement, je comprends pas. C'est pourtant censé marcher..

Discussions similaires

  1. VS2005 - Editeur de ressource capricieux
    Par titoine1978 dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 04/09/2006, 22h59
  2. [JSP] Upload de fichier capricieux
    Par enguerran dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 19/06/2006, 09h05
  3. XLIB: extension GLX missing on display "...
    Par vince3320 dans le forum OpenGL
    Réponses: 9
    Dernier message: 29/07/2004, 15h48
  4. Login capricieux
    Par Sylvain James dans le forum XMLRAD
    Réponses: 2
    Dernier message: 30/04/2003, 01h46

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