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

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

Сообщение Anonymous »

Этот вопрос относится к давнему приложению с открытым исходным кодом, которое имеет пользовательский интерфейс FLTK и использует Cairo для пользовательского рисования в различных местах. В FTLK 1.4 появился гибридный бэкэнд Wayland/X11. Мы нашли решение, как продолжать использовать наш собственный код рисования Cairo, среди других источников, также с помощью SO-вопроса.
Это решение работает просто великолепно. Но не во всплывающем окне.
  • у нас есть всплывающее окно, в котором рисуются различные анимированные диаграммы. Он является производным (частным) от 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 он не имеет смещения
Под offset я имею в виду то, что возвращает win->x() и win->y().
В X11 это возвращает некоторые большие значения, такие как x ≡ 1283 и y ≡ 504 — эти значения кажутся произвольными.
Это не помогает перевести рисунок Каира, ни с +x,+y или -x,-y.
Более того, матрица Cairo, которую мы можем получить с помощью cairo_get_matrix(), не показывает никаких странных значений. В Wayland в матрице Cairo смещение начала координат равно (.5, .5), а в X11 оно равно (0,0), масштаб в обоих случаях равен 1,0.
Кто-нибудь знает, что здесь происходит? Или есть идеи, как в таких случаях правильно получить поверхность Каира из FLTK или, может быть, сделать что-нибудь, чтобы рисунок отображался и находился в нужном месте в X11?
Примечание: с FLTK

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

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

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

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

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

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