Пользовательский рисунок 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.

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

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

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

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

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

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