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

Webkit 透明X11光标主题-为什么X光标出现在GTK+子窗口中?,webkit,x11,gtk,mouse-cursor,Webkit,X11,Gtk,Mouse Cursor,我正在使用透明光标主题技巧see在基于触摸屏的设备的全屏Linux GTK+应用程序中隐藏X11光标。我基本上使用Xorg服务器运行基于WebKit GTK+的应用程序,全屏模式下没有窗口管理器。现在,通过设置透明的1像素光标默认主题来隐藏光标效果非常好,请参见:。但是,一旦光标位于子窗口(例如JavaScript警报窗口或combobox/HTML)内,X光标就会出现,如果光标移出窗口,X光标就会再次消失。有人知道为什么会这样吗?有没有办法完全隐藏光标?如果子窗口设置了光标,那么它将使用该光标

我正在使用透明光标主题技巧see在基于触摸屏的设备的全屏Linux GTK+应用程序中隐藏X11光标。我基本上使用Xorg服务器运行基于WebKit GTK+的应用程序,全屏模式下没有窗口管理器。现在,通过设置透明的1像素光标默认主题来隐藏光标效果非常好,请参见:。但是,一旦光标位于子窗口(例如JavaScript警报窗口或combobox/HTML)内,X光标就会出现,如果光标移出窗口,X光标就会再次消失。有人知道为什么会这样吗?有没有办法完全隐藏光标?

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

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

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

“为什么会这样?” 这种行为的主要原因是因为函数参见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);
如果指定了光标,则无论光标在哪个窗口中,都会显示该光标。如果未指定,则当指针位于grab_窗口或其子窗口之一时,将显示该窗口的正常光标;否则,将显示“抓取”窗口的光标

“有没有办法完全隐藏光标?” 我认为你可以通过以下方法来克服这种行为:

撤消活动窗口上一个XDefineCursor的效果。当指针在窗口中时,将使用父级光标。如果选择透明指针作为默认指针,并使用取消定义子窗口的游标,则应该根本看不到游标。当光标设置为“无”时,XUndefineCursor相当于XDefineCursor

有些桌面,比如KDE,使用其他方法与它的窗口通信,但可能无论如何都不起作用

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

unclutter在X11会话的后台和 指定的非活动时间段将隐藏光标,使其无法显示。当 光标移动,其显示恢复。用户可以指定特定的 要被“整洁”忽略的窗口


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

谢谢。我现在有点忙着其他事情,但我会调查一下。
XUndefineCursor(Display *display;
                Window w);
    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);