GLib's main loop unterstützt die Planung von Callback-Funktionen für periodische Intervalle unter Verwendung von g_timemout_source_new und zugehörigen Funktionen. Der Rückruf wird nach dem geplanten Intervall wiederholt aufgerufen, bis false
zurückgegeben wird.Erstellen einer dynamischen Umterminierungs-GSource in JavaScript
Ich möchte diesen Prozess jetzt mit einem dynamischen Intervall ändern. Anstatt nur true
oder false
sollte der Rückruf in der Lage sein, einen Zeitwert zurückzugeben, der bis zu seinem nächsten Aufruf übergeben werden sollte.
In C ist das ganz einfach: Es kann ein neuer GSource Type erstellt werden, der sich nur von der Timeout-Quelle in dispatch function unterscheidet, die dann den Rückgabewert when setting the next expiration berücksichtigt.
Leider programmiere ich eine Erweiterung für die GNOME-Shell, also bin ich auf JavaScript fest. Der wichtigste kritische Punkt für die Portierung der oben genannten Strategie auf JavaScript scheint das Äquivalent zu the g_source_new function
, new GLib.Source
zu sein. Zuerst muss die Länge des Strukturtyps initialisiert werden, der vom Operator sizeof
in C berechnet wird. Ich weiß nicht, wie man diesen Wert in JavaScript erhält. Darüber hinaus ist es ein Fehler, die Erstellung von a GSourceFuncs Struct, das zweite Argument für diesen Konstruktor zu versuchen, das die Dispatch-Funktion enthalten muss.
gjs> new imports.gi.GLib.SourceFuncs()
Error: Unable to construct struct type SourceFuncs since it has no default constructor and cannot be allocated directly
Wie kann ich eine neue GSource in JavaScript erstellen?
Ich bin auch offen für andere Lösungen, an denen die Anpassung eines bestehenden Quelltypen oder [die Aufnahme von binären Komponenten] (http : //stackoverflow.com/questions/40919457/including-binary-components-in-a-gnome-shell-extension). – XZS