Conky: Le clic droit de la souris ne fonctionne pas pour moi sous Linux après a0d4393

Créé le 18 déc. 2018  ·  4Commentaires  ·  Source: brndnmtthws/conky

Salut. Le clic droit de la souris ne fonctionne pas pour moi sous Linux après a0d4393, et a fonctionné avec ce patch . Pourquoi?

bug

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:

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é.

Tous les 4 commentaires

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

Cette page vous a été utile?
0 / 5 - 0 notes