Was ist der richtige Weg, um Cairo Updates in Gtk2hs zu rendern?

10

Ich schreibe ein Haskell-Programm mit Click-and-Drag-Funktionalität, also wird bei jedem Mausbewegungsereignis ein Update in das Fenster gemalt. Im Moment benutze ich

%Vor%

Allerdings flackert das sehr viel. Mein Verständnis ist, dass ich eine separate zeichnende (eine "Oberfläche"?) Verursachen muss, zu ihr rendern, und dann sie in einer einzelnen Operation auf das Bildschirmfenster blit. Allerdings bin ich verwirrt über den richtigen Weg, dies zu tun.

Ich habe drawWindowBeginPaintRegion gefunden, was davon handelt, Flimmern zu eliminieren. Allerdings wird es in Gtk3 gemäß den Haddock-Dokumenten entfernt. Ich bin also nicht sicher, ob ich das verwenden sollte, da es veraltet zu sein scheint.

Ich habe auch renderWithSimilarSurface in Kairo gefunden, was etwas Ähnliches zu tun scheint.

Ich bin mir auch nicht sicher, wie diese Funktionen sich auf renderWithDrawable beziehen: Muss ich sie innerhalb dieser Funktion verwenden, oder was?

Was ist der richtige Weg, dies zu tun?

Bearbeiten

Das scheint in Kairo bekannt zu sein. Ich versuche herauszufinden, wie ich in Haskell damit umgehen soll.

Paul Johnson 12.11.2015, 07:42
quelle

1 Antwort

4

Der richtige Weg, dies zu tun, besteht darin, sicherzustellen, dass all Ihre Zeichnung aus Expose-Ereignissen stammt und auf dem Zeichenfenster des Ereignisses operiert. Sie können eine Region als "schmutzig" markieren und ein synthetisches Exposure-Ereignis mit drawWindowInvalidateRect , drawWindowInvalidateRegion oder widgetQueueDraw auslösen.

Es folgt ein schnelles Beispiel für das Einrichten der Zeichnungspipeline. Es stammt aus einem benutzerdefinierten Viewport -Typ, der das Google-Maps-Stil-Panning mit weichen Bewegungen bei Drag-and-Release-Operationen ausführt, die ich vor einiger Zeit für ein Side-Projekt erstellt habe. Um dies zu unterstützen, muss es bei Mausbewegungsereignissen neu gezeichnet werden, sodass es einen ähnlichen Anwendungsfall wie das beschriebene Problem behandelt. Ich habe irrelevante Sachen mit ... gelöscht, um die wichtigen Bits hervorzuheben. Ich habe gerade das komplette Projekt auf github hochgeladen, sodass Sie das Repo durchsuchen können, um alle Details zu zu sehen Viewport . (Es ist Jahre her, also gibt es wahrscheinlich ein gutes Stück Bitrot - erwarte nicht, dass das Projekt nur mit modernen GHCs / Paketen erstellt und ausgeführt wird.)

%Vor%

Diese Vorlage sollte die von gtk eingebaute doppelte Pufferung nutzen und mit den Paketen gtk und gtk3 arbeiten.

    
Daniel Wagner 14.11.2015, 21:54
quelle

Tags und Links