Это решение работает просто великолепно, за исключением всплывающего окна.
У нас есть всплывающее окно, которое рисует различные анимированные диаграммы. Он является частным производным от 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 самостоятельно.
Демо-сборка
Чтобы выполнить запрос на упрощенную, но полную и рабочую демонстрацию, мы использовали урезанную версию этой базы кода с открытым исходным кодом (Yoshimi), где весь основной движок и почти весь пользовательский интерфейс были удалены, чтобы его можно было построить с минимальными зависимостями.
- этот демонстрационный код находится в ветке «разделения» в моем репозитории на GitHub
Код: Выделить всё
git clone https://github.com/Ichthyostega/yoshimi.git -b stripdown demo - для сборки вам понадобится компилятор CMake и FLTK-1.4 с включенным Cairo-bridge. В Debian/Ubuntu...
Код: Выделить всё
apt install build-essential cmake libfltk1.4-dev fluid - затем создайте с помощью
Код: Выделить всё
mkdir build cmake -S src -B build cmake --build build -- -j8 - запустите build/yoshimi и поверните ручку регулировки громкости
- При работе под X11 (с FLTK 1.4):
Всплывающее окно расположено как положено, закройте к поворотной ручке - НО рисунок Cairo не виден (нет красной линии)
- в середине окна появляется всплывающее окно
- НО рисунок Cairo работает: есть динамическая красная линия
Вопросы
При подготовке вышеупомянутой демонстрации я заметил, что наш класс DynTooltip использует Fl_Widget::position(x,y), чтобы попытаться разместить всплывающее окно при наведении рядом с соответствующим виджетом. Судя по всему, это не работает под Wayland. Таким образом, нам явно нужно решение для этого, и на самом деле проблема с рисованием Cairo в таком всплывающем окне может быть тесно связана с этим
- как заставить пользовательское рисование с Cairo работать во всплывающем окне, в идеале как для X11, так и для Wayland?
- как решить эту проблему, заключающуюся в том, что нам нужно расположить всплывающие окна при наведении рядом с соответствующим виджетом
Подробнее здесь: https://stackoverflow.com/questions/798 ... -up-window
Мобильная версия