LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1672|回复: 8

gtk发送键盘事件没有响应

[复制链接]
发表于 2009-10-13 14:37:58 | 显示全部楼层 |阅读模式
情况是这样的:
设备有个面板,有上下左右,通过串口通信。程序有treeview,面板按上下时,程序要模拟键盘的上下,发送GdkKeyEvent给treeview,以此控制selection上下移动。

很奇怪的是,不接键盘就没有响应,接上键盘之后,只要随便按一个键盘按键,然后再用面板控制就可以了。

ps:键盘是usb的。
发表于 2009-10-13 15:30:46 | 显示全部楼层
  1.       devices = XListInputDevices(display_x11->xdisplay, &num_devices);
  2.   
  3.       for(loop=0; loop<num_devices; loop++)
  4.         {
  5.           GdkDevicePrivate *gdkdev = gdk_input_device_new(display,
  6.                                                           &devices[loop],
  7.                                                           include_core);
  8.           if (gdkdev)
  9.             display_x11->input_devices = g_list_append(display_x11->input_devices, gdkdev);
  10.         }
  11.       XFreeDeviceList(devices);
复制代码
从上面gtk的source code可以看出,这个时候因为Xserver没有键盘设备,所以gdkdevice也没有键盘,这个时候你发送GdkKeyEvent则成了无本之木。
而接了usb键盘之后,则有了这个gdkdevice设备,那么有了湖了,则水可以流过去了。
回复 支持 反对

使用道具 举报

发表于 2009-10-13 17:32:12 | 显示全部楼层
问题的原因是Xserver已经开始支持hotplugging,所以启动时会自动把鼠标和键盘设备全部删除,然后通过hotplug再加进来。
所以可以通过以下方式去除xserver的hotplug input支持。
To disable input hotplugging, add Option "AutoAddDevices" "False" to ServerFlags in /etc/X11/xorg.conf:

   Section "ServerFlags"
     Option "AutoAddDevices" "False"
     Option "AllowEmptyInput" "False"
   EndSection

This will skip devices detected by hal and will use your keyboard/mouse configuration from xorg.conf. Remember to install xf86-input-keyboard and xf86-input-mouse, as by default they are not installed.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-14 11:17:26 | 显示全部楼层
谢谢斑竹!
可能前面表述不太正确。光接上键盘也不行,一定要先按个任意键才行。
不过现在解决了。因为xorg是自行编译的,我让同事重新拷贝了一下编译出来的东东。这个问题就解决了。估计之前漏文件了!
回复 支持 反对

使用道具 举报

发表于 2009-12-2 18:47:39 | 显示全部楼层

请问一下 GTK 怎么模拟发送键盘事件呢?

g_signal_emit_by_name

发送一个 key_press_event?

可是GdkEventKey 怎么传过去呢?
回复 支持 反对

使用道具 举报

发表于 2009-12-2 19:06:35 | 显示全部楼层
查了下 是否只能用X11的一个库扩展呢? 貌似叫Xtest? 能否不用这个库呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-3 12:57:19 | 显示全部楼层
Post by yunhappy;2051778
g_signal_emit_by_name

发送一个 key_press_event?

可是GdkEventKey 怎么传过去呢?


g_signal_emit_by_name可以传参数
GdkEventKey *eventkey=gdk_new_event_xxx();
类似这样的,开发机和上网机分开的,凭记忆写的。
回复 支持 反对

使用道具 举报

发表于 2009-12-3 18:48:47 | 显示全部楼层
Post by jetking;2051979
g_signal_emit_by_name可以传参数
GdkEventKey *eventkey=gdk_new_event_xxx();
类似这样的,开发机和上网机分开的,凭记忆写的。


多谢!

试了下 确实可以~~ 哈哈 我们这开发机和上网机也是分开的~~~
回复 支持 反对

使用道具 举报

发表于 2009-12-3 18:55:01 | 显示全部楼层
gdk_test_simulate_key 也可以模拟键盘事件~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表