当前位置: 首页 > 面试题库 >

为什么XGrabKey会生成额外的聚焦和聚焦事件?

宗乐池
2023-03-14
问题内容

有谁知道xlib函数可以在不失去原始焦点的情况下捕获按键事件?如何摆脱它?

(或“使用XGrabKey()而不生成Grab样式的聚焦”?)

(或“如何在系统级别摆脱NotifyGrab和NotifyUngrab焦点事件?)

XGrabKey将失去对按键的关注,而将精力恢复于释放的键。

而且我想捕获按键而不泄漏到原始窗口(就像XGrabKey可以做到的一样)。

参考文献:

  1. … XGrabKey将窃取焦点… https://bugs.launchpad.net/gtkhotkey/+bug/390552/comments/8

  2. …该程序接收控制以响应按键组合执行某些操作。同时,该程序暂时处于焦点状态… 在XGrabKey(board)期间,发现哪个窗口处于焦点状态

  3. … XGrabKeyboard函数会主动获取键盘控制权并生成FocusIn和FocusOut事件… http://www.x.org/archive/X11R6.8.0/doc/XGrabKeyboard.3.html#toc3

  4. …我看不到一种方法来提供metacity当前的桌面更改行为(同时更改和显示弹出对话框)而不会在窗口上引起Grab类型的焦点… https://mail.gnome .org / archives / wm-spec-list / 2007-May / msg00000.html

  5. …全屏模式不应通过NotifyGrab在FocusOut事件上退出… https://bugzilla.mozilla.org/show_bug.cgi?id=578265

  6. 抓住键盘不允许改变焦点… 抓住键盘不允许改变焦点

  7. Grabs生成的焦点事件(XGrabKeyboard的主动抓取和XGrabKey的被动抓取) http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Focus_Events_Generated_by_Grabs

  8. XGrabKey源代码:http ://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c 也许我们可以修改它以摆脱焦点事件?

  9. 有“ DoFocusEvents(keybd,oldWin,grab-> window,NotifyGrab);” 在ActivateKeyboardGrab()中:http : //cgit.freedesktop.org/xorg/xserver/tree/dix/events.c

我正在为按键组合(和鼠标移动)绘图软件编写一键操作:https :
//code.google.com/p/diyism-myboard/

我已经在Windows中通过RegisterHotKey()和UnRegisterHotKey()意识到了这一点:https : //code.google.com/p/diyism-
myboard/downloads/detail?
name
=
MyBoard.pas

我想使用XGrabKey()和XUngrabKey()将其迁移到Linux:https : //code.google.com/p/diyism-
myboard/downloads/detail? name
=
myboard.py

我创建了10美元的赏金来解决此问题。我们需要更多支持者来提供悬赏。
https://www.bountysource.com/issues/1072081-right-button-menu-flashes-while-
jkli-keys-move-the-mouse-
pointer


问题答案:

最后,正如您所知,Linux意味着自由,我修改了xserver摆脱了抓斗式对焦:

sudo apt-get build-dep xorg-server
apt-get source xorg-server
cd xorg-server-*
#modify or patch dix/events.c: comment off "DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);" in ActivateKeyboardGrab(), comment off "DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);" in DeactivateKeyboardGrab()
sudo apt-get install devscripts
debuild -us -uc    #"-us -uc" to avoid the signature step
cd ..
sudo dpkg --install xserver-xorg-core_*.deb
#clear dependencies:
sudo apt-mark auto $(apt-cache showsrc xorg-server | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g')
sudo apt-get autoremove

而且我还需要在gtk上下文菜单中摆脱XGrabKeyboard:

sudo apt-get build-dep gtk+2.0
apt-get source gtk+2.0
cd gtk+2.0-*
#modify or patch it: add "return TRUE;" in first line of popup_grab_on_window() of gtk/gtkmenu.c
dpkg-source --commit
debuild -us -uc  #"-us -uc" to avoid the signature step, maybe need: sudo apt-get install devscripts
cd ..
sudo dpkg --install libgtk2.0-0_*.deb
#clear dependencies:
sudo apt-mark auto $(apt-cache showsrc gtk+2.0 | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g')
sudo apt-get autoremove

现在,myboard.py正常运行。

如果您使用的是ubuntu raring-updates版本,则可以尝试:

https://code.google.com/p/diyism-myboard/downloads/detail?name=xserver-xorg-
core_1.13.3-0ubuntu6.2_i386.deb

和:

https://code.google.com/p/diyism-
myboard/downloads/detail?name=libgtk2.0-0_2.24.17-0ubuntu2_i386.deb



 类似资料:
  • 当用户点击某个元素或使用键盘上的 Tab 键选中时,该元素将会获得聚焦(focus)。还有一个 HTML 特性(attribute)autofocus 可以让焦点在网页加载时默认落在一个元素上,此外还有其它途径可以获得焦点。 聚焦到一个元素通常意味着:“准备在此处接受数据”,所以,这正是我们可以运行代码以初始化所需功能的时刻。 失去焦点的时刻(“blur”)可能更为重要。它可能发生在用户点击页面的

  • Focus聚焦社区是GoFrame社区项目,采用了简洁强大的GoFrame作为后端WEB框架, 由于前台系统需要SEO因此使用了GF自带template模板引擎,数据库用MySQL,前端使用jQuery/bootstrap框架。 一、源码地址 github:https://github.com/gogf/focus  gitee:https://gitee.com/johng/focus 二、演示

  • 我正在用Java编程一个聊天客户机,在那里我希望有一个单独的JDialog用于所有打开的聊天。所以我决定使用一个JTabbedPane,其中一个选项卡代表一个单独的聊天。 我在每个选项卡中都放了一个JPanel,它只包含一个用于消息历史记录的JTextPane和一个用户输入消息的JTextArea。 为了更好的可用性,我实现了一个特性,当 打开新的ChatTab 用户在chattab之间进行更改(

  • 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 就是 捜索引擎抓取系统,目的是将互联网上的所有的网页下载到本地,形成一个互联网内容的镜像备份。 它决定着整个搜索引擎内容的丰富性和时效性,因此它的性能优劣直接影响着搜索引擎的效果。 通用搜索引擎(Search Engine)工作原理 第一步:抓取网页 搜索引擎网络爬虫的基本工作流程如下: 首先选取一部分的初始UR

  • 问题内容: 我使用此代码在iOS自定义相机App中实现了“轻按一下”功能,但无法正常工作。这是代码 问题答案: 我不知道为什么这样做,但确实如此。

  • 问题内容: 我正在编写一个小型游戏,其中一个JFrame负责主游戏,另一个JFrame负责显示得分。问题是,当我完成构建它们时,分数JFrame总是最终集中精力!我试过调用scoreDisplay.toFront(),scoreDisplay.requestFocus(),甚至: 有什么办法可以使这项工作吗?预先感谢,约翰·穆拉诺 问题答案: 您是否考虑过将得分设置在与游戏框架相同的框架中? 其他