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 :
Le premier programme que j'ai écrit est celui qui .. marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ~/path/programme_de_test & xterm
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 :
Donc, ici, j'utilise un keypress pour déclencher le XConfigureWindow.
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; }
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 :
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à...
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; }
Je requiert donc de l'aide ...
Merci d'avance,
Armael
Partager