我正在使用透明光标主题技巧(请参阅http://obiltschnig.com/2010/08/14/hiding-the-gtkx11-mouse-cursor/)在全屏 Linux GTK+ 应用程序中隐藏 X11 光标以用于触摸屏-基于设备。我基本上是在全屏模式下使用没有窗口管理器的 Xorg 服务器运行基于 WebKit GTK+ 的应用程序。现在,通过设置透明的 1 像素光标默认主题来隐藏光标效果很好(另请参阅:如何在 Linux/X11 下隐藏鼠标指针?)。然而,只要光标在子窗口内(例如,JavaScript 警报窗口或组合框/HTML),X 光标就会出现(如果光标移出窗口,则再次消失)。有谁知道为什么会这样?有没有办法完全隐藏光标?
2 回答
“为什么会这样?”</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
,当您停止移动光标时,鼠标指针会立即消失。
如果子窗口设置了光标,那么它将具有该光标而不是父窗口上设置的光标。窗口管理器通常设置根窗口光标,但如果应用程序更改光标,它将覆盖它。
GTK 应用程序通常会设置光标主题光标,但可能缺少 xsettings 管理器或其他正常的桌面环境设置会导致问题。查看运行 gnome-settings-manager 是否可以修复它,如果可以,您可以尝试复制它的功能。
您还可以查看 XFixesHideCursor(),只要您可以依赖具有该扩展名的 X 服务器,它就可以很好地解决问题。