从 Stage 获取 GdkWindow 以启用事件处理

get GdkWindow from Stage to enable event handling

在移植 this example to PLGI 时,我遇到了一个我无法解决的问题:键盘事件未释放,而按钮事件是。我在文档中发现应该在 GdkWindow 上设置事件掩码,所以我试图添加 GDK_KEY_RELEASE_MASK 调用

gdk_window_set_events(GdkWindow, ['GDK_BUTTON_PRESS_MASK','GDK_KEY_RELEASE_MASK']),

但是我无法获取 GdkWindow。

通话中

clutter_gdk_get_stage_window(Stage, GdkWindow),

我明白了

Clutter-CRITICAL **:Clutter 后端不是 GDK 后端

有什么方法可以解决这个问题?当然,我不知道解决了这个问题后,键盘事件是否会被传递,而按钮事件却被释放。

该行为不应与 PLGI 完全相关,因为 C 示例也不 'answer' 键盘事件...

此外,更改类型库导入

:- plgi_use_namespace('ClutterGdk').

:- plgi_use_namespace('ClutterX11').

没有影响...

不需要在 Clutter 阶段设置事件掩码:它由 GDK 后端自动设置,并且它包含 GDK_KEY_RELEASE_MASK 标志,正如您从这里看到的:https://git.gnome.org/browse/clutter/tree/clutter/gdk/clutter-stage-gdk.h#n66

#define CLUTTER_STAGE_GDK_EVENT_MASK \
  (GDK_STRUCTURE_MASK |          \
   GDK_FOCUS_CHANGE_MASK |       \
   GDK_EXPOSURE_MASK |           \
   GDK_PROPERTY_CHANGE_MASK |    \
   GDK_ENTER_NOTIFY_MASK |       \
   GDK_LEAVE_NOTIFY_MASK |       \
   GDK_KEY_PRESS_MASK |          \
   GDK_KEY_RELEASE_MASK |        \
   GDK_BUTTON_PRESS_MASK |       \
   GDK_BUTTON_RELEASE_MASK |     \
   GDK_POINTER_MOTION_MASK |     \
   GDK_TOUCH_MASK |              \
   GDK_SCROLL_MASK)

在阶段创建支持 GDK 时应用window:https://git.gnome.org/browse/clutter/tree/clutter/gdk/clutter-stage-gdk.c#n342

gdk_window_ensure_native (stage_gdk->window);
gdk_window_set_events (stage_gdk->window, CLUTTER_STAGE_GDK_EVENT_MASK);

如果您没有获得按键释放事件,您应该查看堆栈的其余部分。

至于不同的后端:GDK 后端是自 Clutter 1.22 以来的默认后端;在该版本之前,默认后端是 X11 后端——它也选择 KeyRelease 事件。为了使用特定的后端,您必须使用 CLUTTER_BACKEND 环境变量。