使用 gdk_window_add_filter 过滤事件

问题描述

我有一个应用程序,我需要拦截键盘 LEFT / RIGHT 按键并将它们转换为 SHIFT+TAB / TAB。我了解 Gdk::Window::add_filter()gdk_window_add_filter() 是我前进的方向。

所以我通过调用上面的方法安装了一个过滤器功能,我能够正确地拦截事件。但是我无法将 X 事件转换为等效的 Gdk 事件。

001 GdkFilterReturn FilterInput(GdkXEvent *xevent,002                             GdkEvent *event,003                             gpointer data)
004 {
005   GdkFilterReturn eRet = GDK_FILTER_CONTINUE;
006 
007   {
008     XEvent *pEvent = (XEvent*)xevent;
009 
010     if (2
011         == pEvent->type)
012     {
013       if ((113
014            == pEvent->xkey.keycode)
015           || (114
016               == pEvent->xkey.keycode))
017       {
018         event->key.hardware_keycode = pEvent->xkey.keycode;
019         event->key.keyval = GDK_KEY_Tab;
020         event->key.length = 0;
021         event->key.time = pEvent->xkey.time;
022         event->key.type = GDK_KEY_PRESS;
023 
024         if(113 == pEvent->xkey.keycode)
025         {
026           event->key.state |= GDK_SHIFT_MASK;
027           event->key.keyval = GDK_KEY_ISO_Left_Tab;
028         }
029 
030         eRet = GDK_FILTER_TRANSLATE;
031       }
032     }
033   }
034 
035   return eRet;
036 }

当我执行 LEFT / RIGHT 并带有以下警告时,上述代码总是会导致应用程序崩溃。

Gdk-WARNING **:13:16:43.246:类型 8 的事件不持有 GdkDevice。它很可能是在 Gdk/GTK+ 之外合成的

我进行了大量搜索以找到将 X 事件转换为 Gdk 事件而无需任何线索的示例。有人能告诉我我的代码中缺少什么吗,或者指出一些完成过滤的示例?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)