Diese Lösung funktioniert wie ein Zauber, außer in einem Popup-Fenster.
Wir haben ein Popup-Fenster, das verschiedene animierte Diagramme malt. Es ist privat von Fl_Menu_Window abgeleitet. Das benutzerdefinierte Zeichnen erfolgt in der überschriebenen Funktion draw(). Allerdings gibt innerhalb dieser Funktion das geerbte window() einen Nullptr zurück.
Wir können ein Fenster mit Fl_Window::current() abrufen, aber dann funktioniert das Zeichnen nur unter Wayland und nicht unter X11.
Wie bereits erwähnt, funktioniert das Zeichnen unter Wayland wie erwartet. Unter X11 kommt es jedoch manchmal zu einer verstümmelten Zeichnung an anderer Stelle im selben Fenster. In den meisten Fällen erzeugen die Zeichenanweisungen für Kairo überhaupt keinen sichtbaren Effekt.
Zusammenfassung im Code:
Code: Select all
class DynTooltip : private Fl_Menu_Window
Code: Select all
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);
- gibt das gleiche Fenster zurück wie Fl_Window::current().
Code: Select all
top_window() - gibt nullptr zurück.
Code: Select all
window() - Das Fenster win hat unter X11 einen seltsamen Offset. Unter Wayland gibt es keinen Offset. Mit Offset meine ich die von win->x() und win->y() zurückgegebenen Werte.
- Unter X11 geben diese große Werte wie x ≡ 1283 und y ≡ 504 zurück. Diese Werte erscheinen willkürlich.
- Das Übersetzen der Cairo-Zeichnung hilft nicht, weder mit +x,+y noch mit -x,-y.
- Die mit cairo_get_matrix() abgerufene Cairo-Matrix zeigt keine ungewöhnlichen Werte.
- Unter Wayland hat die Cairo-Matrix ein Ursprungsoffset von (0,5, 0,5). Unter X11 ist es (0,0). Die Skala beträgt in beiden Fällen 1,0.
Anmerkung: Mit FLTK 1.3 oder früher funktionierte der Zeichnungscode. In diesen Legacy-Fällen haben wir die Cairo-Oberfläche direkt vom XServer abgerufen. Wir könnten das zwar weiterhin tun, wenn wir unter Engine und fast die gesamte Benutzeroberfläche wurden entfernt, sodass sie mit minimalen Abhängigkeiten erstellt werden kann.
- Dieser Democode befindet sich im Zweig „stripdown“ in meinem Github-Repo
Code: Select all
git clone https://github.com/Ichthyostega/yoshimi.git -b stripdown demo - Zum Erstellen benötigen Sie den Compiler, CMake und FLTK-1.4 mit aktivierter Cairo-Bridge. Auf Debian / Ubuntu ...
Code: Select all
apt install build-essential cmake libfltk1.4-dev fluid - dann erstellen mit
Code: Select all
mkdir build cmake -S src -B build cmake --build build -- -j8 - Starten Sie build/yoshimi und drehen Sie den Drehknopf „Lautstärke“
- Bei Ausführung unter der Drehknopf
- ABER Kairo-Zeichnung nicht sichtbar (keine rote Linie)
- Popup erscheint in der Mitte des Fensters
- ABER Kairo-Zeichnung funktioniert: Es gibt eine dynamische rote Linie
Fragen
Während der Vorbereitung der oben genannten Demo ist mir aufgefallen, dass unsere Klasse DynTooltip Fl_Widget::position(x,y) verwendet, um zu versuchen, das Hover-Popup in der Nähe des zugehörigen Widgets zu platzieren. Scheinbar funktioniert das unter Wayland nicht. Wir brauchen also eindeutig eine Lösung dafür, und tatsächlich könnte das Problem mit dem Zeichnen von Cairo in einem solchen Pop-up-Fenster eng damit zusammenhängen.
Wie kann ich benutzerdefiniertes Zeichnen mit Cairo in einem Pop-up-Fenster zum Laufen bringen, idealerweise sowohl für />Vielleicht halten Sie die zweite Frage für nicht zum Thema gehörend, aber sie könnte zusammenhängen, angesichts der Erklärungen zu Menüfenstern in FLTK/Wayland
Mobile version