移植this example到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样本也没有“回答”键盘事件......
另外,从
更改typelib导入:- plgi_use_namespace('ClutterGdk').
到
:- plgi_use_namespace('ClutterX11').
没有效果......
答案 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
环境变量。