7

我正在使用透明光标主题技巧(请参阅http://obiltschnig.com/2010/08/14/hiding-the-gtkx11-mouse-cursor/)在全屏 Linux GTK+ 应用程序中隐藏 X11 光标以用于触摸屏-基于设备。我基本上是在全屏模式下使用没有窗口管理器的 Xorg 服务器运行基于 WebKit GTK+ 的应用程序。现在,通过设置透明的 1 像素光标默认主题来隐藏光标效果很好(另请参阅:如何在 Linux/X11 下隐藏鼠标指针?)。然而,只要光标在子窗口内(例如,JavaScript 警报窗口或组合框/HTML),X 光标就会出现(如果光标移出窗口,则再次消失)。有谁知道为什么会这样?有没有办法完全隐藏光标?

4

2 回答 2

4

“为什么会这样?”</h2>

该行为的主要原因是该XGrabPointer()函数(参见 Xlib 编程手册)主动获取指针的控制权并GrabSuccess在获取成功时返回。进一步的指针事件仅报告给抓取客户端。XGrabPointer()覆盖此客户端的任何活动指针抓取。

int XGrabPointer(Display *display;
                 Window grab_window;
                 Bool owner_events;
                 unsigned int event_mask;
                 int pointer_mode, keyboard_mode;
                 Window confine_to;
                 Cursor cursor;
                 Time time);

如果指定了光标,则无论指针在哪个窗口中都会显示。如果None指定了,则当指针位于或其子窗口之一时,将显示该窗口的正常光标grab_window;否则,grab_window显示光标。

“有没有办法完全隐藏光标?”</h2>

XUnDefineCursor我认为您可以使用and覆盖该行为XUndefineCursor

XUndefineCursor(Display *display;
                Window w);

取消XDefineCursor()活动窗口的先前效果。当指针在窗口中时,将使用父级的光标。如果您选择透明指针作为默认指针,并且还使用 undefine 子窗口的光标,您应该根本看不到光标。XUndefineCursor相当于XDefineCursor将光标设置为None

    display=XOpenDisplay(NULL)
    window = DefaultRootWindow(display);
    Cursor invisible_cursor;
    Pixmap no_pixmap;
    XColor black;
    static char nothing[] = { 0, 0, 0, 0, 0, 0, 0, 0 };

    no_pixmap = XCreateBitmapFromData(display, window, nothing, 8, 8);
    invisible_cursor = XCreatePixmapCursor(display,
                                           no_pixmap, no_pixmap,
                                           &black, &black, 0, 0);
    XDefineCursor(display, window, invisible_cursor);

某些桌面(例如 KDE)使用其他方法与其窗口进行通信,但可能无论如何都不起作用。


或者,还有另一个程序 ,unclutter它会在几秒钟不活动后从屏幕上删除空闲光标。这会在不使用时隐藏鼠标指针。

unclutter在 X11 会话的后台运行,并且在指定的非活动时间段后隐藏光标不显示。当光标移动时,其显示将恢复。用户可以指定要被忽略的特定窗口unclutter

您可以将延迟时间设置为 0: unclutter -idle 0,当您停止移动光标时,鼠标指针会立即消失。

于 2013-05-31T02:42:28.813 回答
1

如果子窗口设置了光标,那么它将具有该光标而不是父窗口上设置的光标。窗口管理器通常设置根窗口光标,但如果应用程序更改光标,它将覆盖它。

GTK 应用程序通常会设置光标主题光标,但可能缺少 xsettings 管理器或其他正常的桌面环境设置会导致问题。查看运行 gnome-settings-manager 是否可以修复它,如果可以,您可以尝试复制它的功能。

您还可以查看 XFixesHideCursor(),只要您可以依赖具有该扩展名的 X 服务器,它就可以很好地解决问题。

于 2010-08-16T19:23:06.383 回答