我目前正在尝试使用程序'matchbox-keyboard'(http://matchbox-project.org/)调试我遇到的问题,我希望能提供一些帮助。 matchbox-keyboard是一个屏幕键盘,我目前在触摸屏信息亭使用,允许用户输入一些基本输入进行搜索等。它可能有点旧,但它仍然是我的应用程序的理想选择,因为它是一个“按需”键盘(即它只在需要时出现),轻量级,并且与我在设备上使用的matchbox-window-manager配合得很好。但是,自助服务终端必须访问的其中一个站点需要用户临时登录,并且由于某种原因,只要用户单击密码字段,屏幕键盘就会消失。
用户必须访问的网站无法更改,因此我决定尝试修补matchbox-keyboard以更改此行为。为此,我将问题追溯到代码中定义的自定义Atom,如下所示
typedef enum {
MBKeyboardRemoteNone = 0,
MBKeyboardRemoteShow,
MBKeyboardRemoteHide,
MBKeyboardRemoteToggle,
} MBKeyboardRemoteOperation;
=============
void
mb_kbd_remote_init (MBKeyboardUI *ui)
{
Atom_MB_IM_INVOKER_COMMAND = XInternAtom(mb_kbd_ui_x_display(ui),
"_MB_IM_INVOKER_COMMAND", False);
}
然后在Xevents中检查此Atom,然后使用xevent(xevent->xclient.data.l[0]
)中的数据来确定将键盘放入的状态。我无法弄清楚的是如何X显示知道Xevent何时应该是'_MB_IM_INVOKER_COMMAND'类型,以及它实际如何设置数据值。具体来说,当我输入密码字段时,如何/为什么将xevent->xclient.data.l[0]
的值设置为2(MBKeyboardRemoteHide
)。
我已经尝试搜索代码以获取此处提到的关键对象的引用,以及从这里的指南中阅读Xlib事件:http://tronche.com/gui/x/xlib/events/,并在google上搜索答案,但老实说这只是一个咬过我的头,我无法控制这个问题。在这一点上,它已经从我的自助服务终端项目的必要性中消失了,并且对我来说变得更加好奇(这些东西会让我疯狂,直到我弄清楚),所以如果有人能帮助我得到一些答案,我会非常感激。
==========更新==========
进一步测试/信息:
问题似乎不是特定于浏览器的实现,因为我在gecko浏览器(Firefox)上尝试了我想要的网站,以及只有文本和密码字段的基本测试HTML页面,以及webkit浏览器(Midori),并且在两个浏览器中,两个页面上的行为都是相同的。这是测试HTML页面供参考:
<head>
</head>
<body>
<form>
Name: <input type="text" name="firstname"><br>
PW: <input type="password" name="lastname">
</form>
</body>
</html>
在我看来,密码字段由于某种原因故意拒绝焦点,因此直接单击该字段会导致调用gtk-im方法焦点。我怀疑它可能是GTK实现的一部分,可能与密码字段通常是“隐藏”的行为有关。也许这样做是为了防止按需剪贴板存储密码或其他东西吗?
通过单击密码字段和文本字段检查事件列表/调试输出时,每种字段类型的已接收事件列表非常相似。许多事件都是相同的类型,但它们之间存在一些差异,我仍在尝试解码。我知道事件编号在这种情况下几乎没有意义,但为了说明,这里是非密码字段的不同事件列表:
matchbox-keyboard-remote.c:47,mb_kbd_remote_process_xevents() got a message of type _MB_IM_INVOKER_COMMAND, val 1
matchbox-keyboard-ui.c:560,mb_kbd_ui_redraw() mark
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 37748776
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651629
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
和密码字段:
matchbox-keyboard-remote.c:47,mb_kbd_remote_process_xevents() got a message of type _MB_IM_INVOKER_COMMAND, val 2
matchbox-keyboard-ui.c:1230,mb_kbd_ui_event_loop() Hide timed out, calling mb_kbd_ui_hide
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 69206018
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35665943
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 39845918
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651628
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35651629
matchbox-keyboard-remote.c:38,mb_kbd_remote_process_xevents() got a message, type 35682433
不幸的是,这是我目前最好的信息,因为我的C技能非常生疏。
答案 0 :(得分:4)
matchbox-keyboard安装GTK输入法(参见gtk-im目录)。这负责将消息发送到键盘。
当输入方法被告知焦点被删除时,它当前发送此MBKeyboardRemoteHide
命令(参见gtk-im / im-context.c)。
就XEvent
处理而言,这只是一个ClientMessage
,它允许客户使用他们自己的&#34;协议#34进行自我交流。
我无法解释为什么当您点击密码字段时,您无法调用focus_in vfunc。这可能是浏览器实施或GtkIMContext
问题的一部分。