【问题标题】:Why does XWarpPointer only work once (while in a loop)?为什么 XWarpPointer 只工作一次(在循环中)?
【发布时间】:2011-05-01 14:12:26
【问题描述】:

为什么 XWarpPointer 只能工作一次?

当我跑步时:

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>

int main()
{
  Display *dpy = XOpenDisplay(0);
  while (1) {
    Window root_window;
    root_window = XRootWindow(dpy, 0);
    XSelectInput(dpy, root_window, KeyReleaseMask);
    XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100);
    XSync(dpy, False);
  }
}

鼠标应该锁定在一个位置。但它只移动鼠标一次,然后让我在循环仍在运行时移动它。是什么导致 XWarpPointer 只运行一次?它是某种 X11 功能来保护用户免受应用程序的影响吗?

仅供参考,我在 Mac OSX 10.6 上的 VMWare Fusion 上运行 RHEL 5.2。

更新:

  • 运行二进制文件时,组件 像按钮或图标闪烁,但是 视觉鼠标光标停留在我的位置 移动它。
  • 在 XWarpPointer 执行一次之后 工作,当我移动鼠标时, 光标跳到它所在的位置附近 在我扭​​曲它之前。好像在那里 是 (last_x,last_y) 不是 正在更新。
  • 当我通过 OpenVMTools 似乎使 指针停留在所需位置 更多,但视觉指针没有 改变。

谢谢, 陈兹

【问题讨论】:

标签: c x11 cursor-position


【解决方案1】:

我没有这方面的经验,但是如果您不丢弃 XSync 中的事件会发生什么?例如XSync(dpy, True);?

【讨论】:

  • 没有明显的差异。我什至一起删除了 XSync 调用,没有区别。我注意到了一件新事物(如问题更新中所述。)
  • 基于他们用于实现 SetCursorPos(x,y) 的 Wine 代码,它映射到:XWarpPointer( data-&gt;display, root_window, root_window, 0, 0, 0, 0, x - virtual_screen_rect.left, y - virtual_screen_rect.top ); 似乎不同之处在于他们为 src 窗口指定了 root_window 而不是 None? source.winehq.org/git/wine.git/blob?f=dlls/winex11.drv/…
  • 不,没有变化....感谢您的洞察力!我正在研究查看 VMWare 如何对指针进行虚拟化。我的想法是我在来宾操作系统中正确设置了指针,但是要“虚拟化”,我也必须在主机中设置指针。 (也许我正在运行的 X11 不够更新,无法为我执行此操作。)
  • 如上所述,我能够从客户操作系统设置主机(报告)指针。它确实有效果,但视觉指针没有改变。我只能猜测两者是分开的或者是硬件控制的。
  • 如果你使用 Xflush(dpy) 而不是 Xsync 会发生什么?
【解决方案2】:

之后

XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100);

试试

XFlush(dpy);

这应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多