GLib のメイン ループは、 g_timemout_source_newおよび関連する関数を使用して、定期的な間隔でコールバック関数のスケジューリングをサポートします。コールバックは、スケジュールされた間隔の後、返されるまで繰り返し呼び出されますfalse
。
このプロセスを動的な間隔で変更したいと思います。true
またはの代わりにfalse
、コールバックは、次の呼び出しまで経過する時間値を返すことができる必要があります。
C でこれを行うのは非常に簡単です。新しい GSource タイプを作成できます。これは、ディスパッチ関数のタイムアウト ソースとのみ異なり、次の有効期限を設定するときに戻り値を考慮に入れます。
残念ながら、私は GNOME シェルの拡張機能をプログラミングしているので、JavaScript に固執しています。上記の戦略を JavaScript に移植する際の主な重要なポイントはg_source_new function
、new GLib.Source
. まず、初期化する構造体型の長さが必要ですsizeof
。これは、C の演算子によって計算されます。JavaScript でこの値を取得する方法がわかりません。さらに、ディスパッチ関数を保持するために必要な、このコンストラクターの 2 番目の引数である GSourceFuncs Structを作成しようとするとエラーになります。
gjs> new imports.gi.GLib.SourceFuncs()
Error: Unable to construct struct type SourceFuncs since it has no default constructor and cannot be allocated directly
JavaScript で新しい GSource を作成するにはどうすればよいですか?