Это решение работает просто великолепно, за исключением всплывающего окна.
У нас есть всплывающее окно, которое рисует различные анимированные диаграммы. Он является частным производным от Fl_Menu_Window. Пользовательское рисование происходит в переопределенной функции draw(). Однако внутри этой функции унаследованный метод window() возвращает nullptr.
Мы можем получить окно с помощью Fl_Window::current(), но тогда рисование работает только под Wayland, а не под X11.
Как уже упоминалось, под Wayland рисование работает так, как ожидалось. Однако в X11 иногда в других местах того же окна отображаются искаженные изображения. В большинстве случаев инструкции по рисованию Cairo вообще не дают видимого эффекта.
Сводка в коде:
Код: Выделить всё
class DynTooltip : private Fl_Menu_Window
Код: Выделить всё
void DynTooltip::draw()
{
Fl_Window* top = top_window(); // just for debugging
Fl_Window* win = Fl_Window::current();
cairo_t *cr = Fl::cairo_make_current(win);
cairo_save(cr);
// drawing code...
cairo_restore(cr);
Fl::cairo_flush(cr);
- возвращает то же окно, что и Fl_Window::current().
Код: Выделить всё
top_window() - возвращает nullptr.
Код: Выделить всё
window() - Окно win имеет странное смещение в X11. В Wayland у него нет смещения. Под смещением я подразумеваю значения, возвращаемые функциями win->x() и win->y().
- В X11 они возвращают большие значения, такие как x ≡ 1283 и y ≡ 504. Эти значения кажутся произвольными.
- Перевод рисунка Cairo не помогает ни с +x,+y, ни с -x,-y.
- Матрица Cairo, полученная с помощью cairo_get_matrix(), не показывает никаких необычных значений.
- В Wayland Матрица Каира имеет смещение начала координат (0,5, 0,5). В X11 это (0,0). В обоих случаях масштаб равен 1,0.
Примечание: в FLTK 1.3 или более ранних версиях код рисования работал. В этих устаревших случаях мы получали поверхность Каира непосредственно с XServer. Хотя мы могли бы продолжать делать это и при работе под XWayland, это похоже на обходной путь, а не на правильное решение, учитывая, что FLTK теперь самостоятельно управляет и предоставляет поверхность Cairo.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -up-window
Мобильная версия