LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

Ну да, поэтому это *практически* будет работать. За исключением тех случаев когда wm не будет отсылать свое сообщение. Ну или wm вообще не будет. Или к нам НЕ придет сообщение. Скажем в сети потерялось. Игнорить все !send? Опять же идиотизм.

Нет, они этот вопрос обсуждают. Хотя я вот в коде Xt этого не вижу (потому что не знаю его):

I believe most window managers *will* send the synthetic event, but that it will always come after the real event. Xt allows for the event to be missing by calling TranslateCoordinates in case the event doesn't arrive.

Вот в Qt есть XTranslateCoordinates и они, похоже, следуют этой же логике. Комментарий в коде в этом месте:

        if (!isCPos) {
            // we didn't get an updated position of the toplevel.
            // either we haven't moved or there is a bug in the window manager.
            // anyway, let's query the position to be certain.
            int x, y;
            Window child;
            XTranslateCoordinates(X11->display, internalWinId(),
                                  QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(),
                                  0, 0, &x, &y, &child);
            newCPos.rx() = x;
            newCPos.ry() = y;
        }

Если сжатие событий (опциональное оно там, судя по коду - if (d->extra->compress_events) {) выключено, то получаем классическую схему, где XTranslateCoordinates вызывается каждый раз по приходу события от сервера.

Если сжатие включено, то у них появляется возможность «проглотить» промежуточные ConfigureNotify от сервера. Причем серверное ConfigureNotify игнорируется в случае, если в очереди есть хоть одно синтетическое ConfigureNotify, причем даже не последнее. Даже последовательность synthetic->synthetic->real, получается, не вызовет XTranslateCoordinates на последнее событие, так как isCPos будет true.

UPD: Хотя... надо понять, они сканируют события от старых к новым или наоборот. Тогда, может быть, наоборот, видят, что последнее событие - синтетическое, т. е. real-> synthetic->synthetic

Исправление Zubok, :

Ну да, поэтому это *практически* будет работать. За исключением тех случаев когда wm не будет отсылать свое сообщение. Ну или wm вообще не будет. Или к нам НЕ придет сообщение. Скажем в сети потерялось. Игнорить все !send? Опять же идиотизм.

Нет, они этот вопрос обсуждают. Хотя я вот в коде Xt этого не вижу (потому что не знаю его):

I believe most window managers *will* send the synthetic event, but that it will always come after the real event. Xt allows for the event to be missing by calling TranslateCoordinates in case the event doesn't arrive.

Вот в Qt есть XTranslateCoordinates и они, похоже, следуют этой же логике. Комментарий в коде в этом месте:

        if (!isCPos) {
            // we didn't get an updated position of the toplevel.
            // either we haven't moved or there is a bug in the window manager.
            // anyway, let's query the position to be certain.
            int x, y;
            Window child;
            XTranslateCoordinates(X11->display, internalWinId(),
                                  QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(),
                                  0, 0, &x, &y, &child);
            newCPos.rx() = x;
            newCPos.ry() = y;
        }

Если сжатие событий (опциональное оно там, судя по коду - if (d->extra->compress_events) {) выключено, то получаем классическую схему, где XTranslateCoordinates вызывается каждый раз по приходу события от сервера.

Если сжатие включено, то у них появляется возможность «проглотить» промежуточные ConfigureNotify от сервера. Причем серверное ConfigureNotify игнорируется в случае, если в очереди есть хоть одно синтетическое ConfigureNotify, причем даже не последнее. Даже последовательность synthetic->synthetic->real, получается, не вызовет XTranslateCoordinates на последнее событие, так как isCPos будет true.

UPD: Хотя... надо понять, они сканируют события от старых к новым или наоборот. Тогда, может быть, наоборот, видят, что последнее событие - синтетическое.

Исходная версия Zubok, :

Ну да, поэтому это *практически* будет работать. За исключением тех случаев когда wm не будет отсылать свое сообщение. Ну или wm вообще не будет. Или к нам НЕ придет сообщение. Скажем в сети потерялось. Игнорить все !send? Опять же идиотизм.

Нет, они этот вопрос обсуждают. Хотя я вот в коде Xt этого не вижу (потому что не знаю его):

I believe most window managers *will* send the synthetic event, but that it will always come after the real event. Xt allows for the event to be missing by calling TranslateCoordinates in case the event doesn't arrive.

Вот в Qt есть XTranslateCoordinates и они, похоже, следуют этой же логике. Комментарий в коде в этом месте:

        if (!isCPos) {
            // we didn't get an updated position of the toplevel.
            // either we haven't moved or there is a bug in the window manager.
            // anyway, let's query the position to be certain.
            int x, y;
            Window child;
            XTranslateCoordinates(X11->display, internalWinId(),
                                  QApplication::desktop()->screen(d->xinfo.screen())->internalWinId(),
                                  0, 0, &x, &y, &child);
            newCPos.rx() = x;
            newCPos.ry() = y;
        }

Если сжатие событий (опциональное оно там, судя по коду - if (d->extra->compress_events) {) выключено, то получаем классическую схему, где XTranslateCoordinates вызывается каждый раз по приходу события от сервера.

Если сжатие включено, то у них появляется возможность «проглотить» промежуточные ConfigureNotify от сервера. Причем серверное ConfigureNotify игнорируется в случае, если в очереди есть хоть одно синтетическое ConfigureNotify, причем даже не последнее. Даже последовательность synthetic->synthetic->real, получается, не вызовет XTranslateCoordinates на последнее событие, так как isCPos будет true.