Почему X11 отправляет два события в случае _NET_ACTIVE_WINDOW изменения значения? - PullRequest
0 голосов
/ 27 октября 2019

Итак, я написал простую тестовую программу для отслеживания значения свойства _NET_ACTIVE_WINDOW до того, как реализовал ее в своей основной программе. Хотя я заметил странное поведение, всякий раз, когда я переключаю то, какое окно в настоящее время находится в фокусе, я получаю 2 события, которые уведомляют о изменении значения _NET_ACTIVE_WINDOW вместо 1.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/Xlib.h>

int main(void){
    Display *dpy = XOpenDisplay(NULL);
    Window root = XDefaultRootWindow(dpy);

    XSelectInput(dpy, root, PropertyChangeMask);

    XEvent ev;
    while(True){
        XNextEvent(dpy, &ev);
        if(strcmp("_NET_ACTIVE_WINDOW", XGetAtomName(dpy, ev.xproperty.atom)) == 0){
            Atom type;
            int format;
            unsigned long items, bytesLeft;
            Window *value;
            XGetWindowProperty(dpy, root, ev.xproperty.atom, 0, 1, False,
                AnyPropertyType, &type, &format, &items, &bytesLeft, (unsigned char**)&value);

            printf("active window id: %u\n", *value);
        }
    }

    XCloseDisplay(dpy);
}

Вот каков результат работы этой программы,Очевидно, что строки, начинающиеся с #, являются комментариями, которые я добавил, чтобы уточнить, что происходит

[zee@zeeDT test]> ./test
#started program in terminal here
#switch from terminal to text editor
active window id: 171966465
active window id: 171966465
#switch from text editor to terminal
active window id: 130023431
active window id: 130023431

Редактировать: после дополнительного тестирования я обнаружил, что числа также не всегда совпадают, например, если я переключаюсь из своего текстового редактораиногда к терминалу вывод будет выглядеть, как указано выше, но иногда он также будет выглядеть так. Почему идентификатор будет 0?

active window id: 0
active window id: 130023431
...