Пользовательский рисунок FLTK/Wayland/X11 во всплывающем окнеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Пользовательский рисунок FLTK/Wayland/X11 во всплывающем окне

Сообщение Anonymous »

Этот вопрос относится к давнему приложению с открытым исходным кодом, которое имеет пользовательский интерфейс FLTK и использует Cairo для пользовательского рисования в различных местах. В FLTK 1.4 появился гибридный бэкэнд Wayland/X11. Мы нашли решение, позволяющее продолжить использование нашего пользовательского кода рисования Cairo, среди других источников, с помощью вопроса о переполнении стека.
Это решение работает просто великолепно, за исключением всплывающего окна.
У нас есть всплывающее окно, которое рисует различные анимированные диаграммы. Он является частным производным от 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);
Некоторые дополнительные наблюдения:
  • Код: Выделить всё

    top_window()
    возвращает то же окно, что и Fl_Window::current().
  • Код: Выделить всё

    window()
    возвращает nullptr.
  • Окно 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.
Кто-нибудь знает, что здесь происходит? Или есть идеи, как в таких случаях правильно получить поверхность Cairo из FLTK или иным образом заставить рисунок отображаться в нужном месте под X11?
Примечание: в 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
    
  • затем создайте с помощью

    Код: Выделить всё

    mkdir build
    cmake -S src -B build
    cmake --build build -- -j8
    
  • запустите build/yoshimi и поверните ручку регулировки громкости
Наблюдения:
  • При работе под X11 (с FLTK 1.4):

    Всплывающее окно расположено как положено, закройте к поворотной ручке
  • НО рисунок Cairo не виден (нет красной линии)
При работе под Wayland
  • в середине окна появляется всплывающее окно
  • НО рисунок Cairo работает: есть динамическая красная линия

Вопросы
При подготовке вышеупомянутой демонстрации я заметил, что наш класс DynTooltip использует Fl_Widget::position(x,y), чтобы попытаться разместить всплывающее окно при наведении рядом с соответствующим виджетом. Судя по всему, это не работает под Wayland. Таким образом, нам явно нужно решение для этого, и на самом деле проблема с рисованием Cairo в таком всплывающем окне может быть тесно связана с этим
  • как заставить пользовательское рисование с Cairo работать во всплывающем окне, в идеале как для X11, так и для Wayland?
  • как решить эту проблему, заключающуюся в том, что нам нужно расположить всплывающие окна при наведении рядом с соответствующим виджетом
Второй вопрос может показаться не по теме, но он может быть связан, учитывая пояснения относительно окон-меню в FLTK/Wayland

Подробнее здесь: https://stackoverflow.com/questions/798 ... -up-window
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»