Malheureusement, avoir le truc XShape dans main_loop()
provoque un crash dans certains cas. Je n'ai pas pu trouver l'incantation magique correcte pour rendre Xlib heureux dans ce cas.
Si vous souhaitez que la fonctionnalité XShape fonctionne de manière fiable sous tous les gestionnaires de fenêtres, elle doit être appelée après que l'application a reçu MapNotify
. De plus, certains WM (Openbox) ont une fenêtre parent invisible même lorsque _NET_WM_WINDOW_TYPE
est défini sur _NET_WM_WINDOW_TYPE_DESKTOP
, et doivent donc appliquer le même code au parent. Par example:
while (XPending(display) > 0) {
XEvent ev;
XNextEvent(display, &ev);
switch (ev.type) {
/* ... */
case MapNotify: {
Window root = DefaultRootWindow(display);
Window win = w->w;
while (win != None) {
Region region;
if ((region = XCreateRegion())) {
XShapeCombineRegion(display, w->w, ShapeInput, 0, 0, region, ShapeSet);
XDestroyRegion(region);
}
Window parent;
find_parent(win, &parent);
win = (parent == root ? None : parent);
}
XFlush(display);
break;
}
}
}
Sincèrement, quelqu'un qui a passé beaucoup trop de temps à déboguer cela dans un projet séparé.
@ wacossusca34 bon à savoir, merci pour votre contribution.
@brndnmtthws est- ce que la
Commentaire le plus utile
Si vous souhaitez que la fonctionnalité XShape fonctionne de manière fiable sous tous les gestionnaires de fenêtres, elle doit être appelée après que l'application a reçu
MapNotify
. De plus, certains WM (Openbox) ont une fenêtre parent invisible même lorsque_NET_WM_WINDOW_TYPE
est défini sur_NET_WM_WINDOW_TYPE_DESKTOP
, et doivent donc appliquer le même code au parent. Par example:Sincèrement, quelqu'un qui a passé beaucoup trop de temps à déboguer cela dans un projet séparé.