- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的很难让 AT-SPI 在 Vala 应用程序中工作。
我让它能够注意到已通过 Atspi.register_keystroke_listener 按下了一个键,但我终其一生都无法让它向回调函数传递任何有用的信息。无论按下什么键,每次按键时它都会返回完全相同的数据,而且 stroke.event_string 似乎从来没有任何内容。
以下是显示问题的精简演示应用程序。
public class Demo.Application : Gtk.Application {
private static Application? _app = null;
private Atspi.DeviceListenerCB listener_cb;
private Atspi.DeviceListener listener;
public Application () {
Object (
application_id: "com.bytepixie.snippetpixie",
flags: ApplicationFlags.HANDLES_COMMAND_LINE
);
}
protected override void activate () {
message ("Activated");
Atspi.init();
listener_cb = (Atspi.DeviceListenerCB) on_key_released_event;
listener = new Atspi.DeviceListener ((owned) listener_cb);
try {
Atspi.register_keystroke_listener (listener, null, 0, Atspi.EventType.KEY_RELEASED_EVENT, Atspi.KeyListenerSyncType.ALL_WINDOWS | Atspi.KeyListenerSyncType.CANCONSUME);
} catch (Error e) {
message ("Could not keystroke listener: %s", e.message);
Atspi.exit ();
quit ();
}
}
private bool on_key_released_event (Atspi.DeviceEvent stroke) {
message ("id: %u, hw_code: %d, modifiers: %d, timestamp: %u, event_string: %s, is_text: %s",
stroke.id,
stroke.hw_code,
stroke.modifiers,
stroke.timestamp,
stroke.event_string,
stroke.is_text.to_string ()
);
return false;
}
public override int command_line (ApplicationCommandLine command_line) {
hold ();
activate ();
return 0;
}
public static new Application get_default () {
if (_app == null) {
_app = new Application ();
}
return _app;
}
public static int main (string[] args) {
var app = get_default ();
return app.run (args);
}
}
编译并运行后,按下“qwerty”键,我得到以下信息。
ian@ians-apollo:~/Documents/atspi-test$ valac demo.vala --pkg gtk+-3.0 --pkg atspi-2
ian@ians-apollo:~/Documents/atspi-test$ ./demo
** Message: 18:35:59.373: demo.vala:15: Activated
(demo:18257): GLib-GObject-CRITICAL **: 18:35:59.456: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
** Message: 18:36:00.716: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
q** Message: 18:36:01.046: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
w** Message: 18:36:01.477: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
e** Message: 18:36:01.837: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
r** Message: 18:36:02.187: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
t** Message: 18:36:02.583: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
y** Message: 18:36:10.587: demo.vala:32: id: 22029, hw_code: 4, modifiers: 0, timestamp: 0, event_string: (null), is_text: true
你可以在控制台中看到每行开头的“qwerty”,因为我没有消耗击键,但每次输出的数据没有差异。
我错过了什么?是否存在某种需要在每次事件后清除的缓存?
最佳答案
弄清楚这个问题花了一段时间,该演示非常有帮助。本质上,回调的 C 函数签名是错误的方法。
阅读 AtspiDeviceListenerCB 的 C 文档函数签名应该是:
gboolean
(*AtspiDeviceListenerCB) (const AtspiDeviceEvent *stroke,
void *user_data);
user_data
在 stroke
之后。
在示例 Vala 程序中,on_key_released_event
是 Demo.Application
的一个方法。 Vala 会将实例引用作为生成的 C 中方法的第一个参数。将 --ccode
开关与 valac
一起使用会在生成的 C 中显示以下内容:
static gboolean demo_application_on_key_released_event (DemoApplication* self,
AtspiDeviceEvent* stroke);
解决方案是告诉 Vala 编译器将实例引用放在不同的位置。在示例程序中,这意味着更改:
private bool on_key_released_event (Atspi.DeviceEvent stroke) {
到
[CCode (instance_pos = -1)]
private bool on_key_released_event (Atspi.DeviceEvent stroke) {
CCode
属性 detail instance_pos
可以是另一个值,但是 -1
将实例参数作为函数签名中的最后一个参数。我们本可以使用 2
代替。有关更改生成的 C 函数参数位置的更多信息,请参阅 Vala Writing Bindings Manually document .
另一种解决方案是根本不使用实例数据,而是使用 DeviceListener.simple
。
如果认为 Vala 编译器有足够的可用信息来计算出用作回调的对象的方法应该在生成的 C 中的不同位置具有实例参数,那就太好了。我没有采取是时候调查这种可能性了。
关于vala - 为什么每次击键事件后 Atspi.DeviceEvent 数据都相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231873/
我真的很难让 AT-SPI 在 Vala 应用程序中工作。 我让它能够注意到已通过 Atspi.register_keystroke_listener 按下了一个键,但我终其一生都无法让它向回调函数传
我目前正在尝试学习 Vala,但它从一开始就让我感到困惑。我基本上复制了找到的第一个基本示例 here . 我正在尝试使用此命令构建它: valac --pkg gtk+-3.0 .vala 但我不
我是一名优秀的程序员,十分优秀!