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