История изменений
Исправление 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...