透明X11光标主题 - 为什么X光标出现在GTK +子窗口中?

时间:2010-08-16 08:55:10

标签: webkit x11 gtk mouse-cursor

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

2 个答案:

答案 0 :(得分:3)

“为什么会这样?”

这种行为的主要原因是因为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 当指针位于{时>显示该窗口的正常游标{1}}或其子窗口之一 ;否则,显示grab_window的光标。

“有没有办法完全隐藏光标?”

我认为您可以使用XUnDefineCursorXUndefineCursor覆盖该行为:

grab_window

取消先前XUndefineCursor(Display *display; Window w); 对活动窗口的影响。当指针在窗口中时,将使用父光标。如果选择透明指针作为默认指针,并且还使用取消定义子窗口的游标,则根本不会看到游标。当光标设置为XDefineCursor()时,XUndefineCursor相当于XDefineCursor

None

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


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

  

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); 在X11会话的后台运行,之后运行   指定的不活动时间会将光标隐藏在显示屏上。当。。。的时候   移动光标,其显示恢复。用户可以指定具体的   unclutter要忽略的窗口。

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

答案 1 :(得分:0)

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

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

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