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

时间:2015-10-26 14:37:49

标签: clutter plgi

移植this examplePLGI时,我偶然发现了一个我无法解决的问题:键盘事件没有被释放,而按钮是的。我在文档中发现应该在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样本也没有“回答”键盘事件......

另外,从

更改typelib导入
:- plgi_use_namespace('ClutterGdk').

:- plgi_use_namespace('ClutterX11').

没有效果......

1 个答案:

答案 0 :(得分:0)

无需在Clutter阶段设置事件掩码:它由GDK后端自动设置,它包含GDK_KEY_RELEASE_MASK标志,如您所见:https://git.gnome.org/browse/clutter/tree/clutter/gdk/clutter-stage-gdk.h#n66 < / p>

#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窗口时应用哪个: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环境变量。