从 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
环境变量。
在移植 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
环境变量。