Benutzerdefinierte FLTK/Wayland/X11-Zeichnung in einem Popup-FensterC++

Programme in C++. Entwicklerforum
Anonymous
 Benutzerdefinierte FLTK/Wayland/X11-Zeichnung in einem Popup-Fenster

Post by Anonymous »

Diese Frage bezieht sich auf eine seit langem bestehende Open-Source-Anwendung, die über eine FLTK-Benutzeroberfläche verfügt und Cairo an verschiedenen Stellen für benutzerdefiniertes Zeichnen verwendet. Mit FLTK 1.4 gibt es jetzt ein hybrides Wayland/X11-Backend. Wir haben eine Lösung für die weitere Verwendung unseres benutzerdefinierten Zeichencodes für Kairo gefunden, unter anderem durch eine Frage zum Stapelüberlauf.
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
In der Implementierung:

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);
Einige weitere Beobachtungen:
  • Code: Select all

    top_window()
    gibt das gleiche Fenster zurück wie Fl_Window::current().
  • Code: Select all

    window()
    gibt nullptr zurück.
  • 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.
Hat jemand eine Ahnung, was hier vor sich geht? Oder haben Sie eine Idee, wie wir in diesen Fällen die Kairo-Oberfläche ordnungsgemäß aus FLTK abrufen oder die Zeichnung auf andere Weise unter X11 an der richtigen Stelle anzeigen könnten?
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“
Beobachtungen:
  • Bei Ausführung unter der Drehknopf
  • ABER Kairo-Zeichnung nicht sichtbar (keine rote Linie)
Beim Betrieb unter Wayland
  • 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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post