LINUX.ORG.RU

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

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

интересно.. не встречал таких, ибо на руках исходники оконных менеджеров, а там схема одна.. (некоторые форки)

А они, наверное, имеют теневой pixmap, куда прорисовывают сначала, а когда получают expose, то как заплатку из теневого pixmap вставляют в окно. Например, awesome:

drawin_refresh_pixmap_partial(drawin_t *drawin,
                              int16_t x, int16_t y,
                              uint16_t w, uint16_t h)
{
    if (!drawin->drawable || !drawin->drawable->pixmap || !drawin->drawable->refreshed)
        return;

    /* Make cairo do all pending drawing */
    cairo_surface_flush(drawin->drawable->surface);
    xcb_copy_area(globalconf.connection, drawin->drawable->pixmap,
                  drawin->window, globalconf.gc, x, y, x, y,
                  w, h);
}

Про сжатие вот, например раздел 7.9.3: http://lesstif.sourceforge.net/doc/super-ux/g1ae03e/part1/chap7.html#pg9

Оно необязательно. Для простых окон, как это замечено, можно просто все перерисовать. В очереди стоят события Expose, в которых об изменении каждого кусочка сообщается. Если простое кошко, небольшое окошко, то эффективнее все перерисовать.

Вот еще Qt (на нужной строчке стоит в самом верху):

https://qt.gitorious.org/qt/thiago-intels-qtbase/source/3acd4b546ded7523f65d6...

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

интересно.. не встречал таких, ибо на руках исходники оконных менеджеров, а там схема одна.. (некоторые форки)

А они, наверное, имеют теневой pixmap, куда прорисовывают сначала, а когда получают expose, то как заплатку из теневого pixmap вставляют в окно. Например, awesome:

drawin_refresh_pixmap_partial(drawin_t *drawin,
                              int16_t x, int16_t y,
                              uint16_t w, uint16_t h)
{
    if (!drawin->drawable || !drawin->drawable->pixmap || !drawin->drawable->refreshed)
        return;

    /* Make cairo do all pending drawing */
    cairo_surface_flush(drawin->drawable->surface);
    xcb_copy_area(globalconf.connection, drawin->drawable->pixmap,
                  drawin->window, globalconf.gc, x, y, x, y,
                  w, h);
}

Про сжатие вот, например раздел 7.9.3: http://lesstif.sourceforge.net/doc/super-ux/g1ae03e/part1/chap7.html#pg9

Оно необязательно. Для простых окон, как это замечено, можно просто все перерисовать. В очереди стоят события Expose, в которых об изменении каждого кусочка сообщается. Если простое кошко, небольшое окошко, то эффективнее все перерисовать.

Вот еще Qt (на нужной строчке стоит):

https://qt.gitorious.org/qt/thiago-intels-qtbase/source/3acd4b546ded7523f65d6...

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

интересно.. не встречал таких, ибо на руках исходники оконных менеджеров, а там схема одна.. (некоторые форки)

А они, наверное, имеют теневой pixmap, куда прорисовывают сначала, а когда получают expose, то как заплатку из теневого pixmap вставляют в окно. Например, awesome:

drawin_refresh_pixmap_partial(drawin_t *drawin,
                              int16_t x, int16_t y,
                              uint16_t w, uint16_t h)
{
    if (!drawin->drawable || !drawin->drawable->pixmap || !drawin->drawable->refreshed)
        return;

    /* Make cairo do all pending drawing */
    cairo_surface_flush(drawin->drawable->surface);
    xcb_copy_area(globalconf.connection, drawin->drawable->pixmap,
                  drawin->window, globalconf.gc, x, y, x, y,
                  w, h);
}

Про сжатие вот, например раздел 7.9.3: http://lesstif.sourceforge.net/doc/super-ux/g1ae03e/part1/chap7.html#pg9

Оно необязательно. Для простых окон, как это замечено, можно просто все перерисовать. В очереди стоят события Expose, в которых об изменении каждого кусочка сообщается. Если простое кошко, небольшое окошко, то эффективнее все перерисовать.

Вот еще Qt (искать void QXcbWindow::handleExposeEvent(const xcb_expose_event_t *event):

https://qt.gitorious.org/qt/thiago-intels-qtbase/source/3acd4b546ded7523f65d6...