【问题标题】:Capturing events in X11 even after the loss of focus即使在失去焦点后也能在 X11 中捕捉事件
【发布时间】:2011-10-11 19:46:23
【问题描述】:

我正在尝试开发一个响应多支数字笔(IRIS Pens)的应用程序,以便任何一支笔在纸上书写;我将输出中继到单个屏幕。从而为自己制作了一个多输入白板。

在 Ubuntu 中,这些笔被识别为鼠标,因此可以以与处理鼠标事件类似的方式进行处理。

所以现在我打算做的是使用 XLib 在 C/C++ 中处理这些事件,并使用 JNI 回调将这些事件传递给 Java Swing 应用程序。我能够做到这一点,但是当 X11 窗口失去焦点时,没有事件被转移到 Swing 框架。我也尝试在 X11 中使用根窗口,但它似乎不起作用。

任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

  • 没有简单的方法可以做到这一点。一个著名的xeyes 程序只是定期轮询鼠标,这可能是最简单的选择。

标签: java c x11


【解决方案1】:

如何最大化 Java 前面的 C/X11 窗口并使其透明?您应该能够看到 Java 窗口,同时仍然专注于 C/X11 窗口。

由于您使用的是 Ubuntu,因此您可以使用 Compiz 的“不透明度、亮度和饱和度”插件来实现这一点。它位于compiz-plugins-main 包中,您可以使用 Compiz 设置管理器(来自compizconfig-settings-manager 包)激活它。当你激活插件时,alt+wheel 默认绑定来改变焦点窗口的透明度。

【讨论】:

  • 谢谢您的回答。我之前尝试使用transset 设置我的X11 窗口的透明度,但它对我不起作用。但我刚刚尝试了 CCSM,效果非常好,现在我不必担心我的注意力丢失问题。
【解决方案2】:

尝试直接读取鼠标。我不记得确切的位置,但你应该可以在“/dev/input/mouseX”之类的地方找到它,其中 X 是你的设备编号,范围从 0 到 n-1 个设备..

当您读取数据包时,您的应用程序应该阻塞直到鼠标移动,然后您的读取函数将返回一个原始鼠标数据包,该数据包描述了增量(在您的情况下,这可能比屏幕坐标更有用)和鼠标按钮状态。

原始数据包可以按照此处所述进行解码:http://www.computer-engineering.org/ps2mouse/

【讨论】:

  • 感谢您的帮助。这可能是一种可能的方式。
  • 请注意,如果您使用 /dev/input,则必须以 root 身份运行您的应用程序,因为这也将允许任何人窃听当前用户。
【解决方案3】:

创建一个模态对话框并将其设置为XmDIALOG_SYSTEM_MODAL(属性的实际名称取决于您的工具包:Motif、Gtk、Qt...)。像这样的对话框会阻塞整个显示,并且永远不会失去焦点。

当然,缺点是当这个对话框在屏幕上时你不能做任何其他事情。

This entry in the X11 FAQ 可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多