【发布时间】:2016-12-04 12:15:40
【问题描述】:
GLib's main loop 支持为周期性间隔调度回调函数,使用g_timemout_source_new 和相关函数。回调将在预定的时间间隔后重复调用,直到返回false。
我现在想用动态间隔修改这个过程。回调不仅仅是true 或false,还应该能够返回一个时间值,该时间值应该一直持续到下一次调用。
在 C 中执行此操作非常简单:可以创建一个新的 GSource 类型,它与 dispatch function 中的超时源不同,然后将返回值 when setting the next expiration 考虑在内。
不幸的是,我正在为 GNOME Shell 编写一个扩展程序,所以我坚持使用 JavaScript。将上述策略移植到 JavaScript 的主要关键点似乎相当于the g_source_new function、new GLib.Source。首先,它需要初始化结构类型的长度,这将由 C 中的sizeof 运算符计算。我不知道如何在 JavaScript 中获取这个值。此外,尝试创建此构造函数的第二个参数a 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?
【问题讨论】:
-
我也对其他解决方案持开放态度,包括对现有源类型或the inclusion of binary components的改编。
标签: javascript glib gnome-shell-extensions gjs