代码之家  ›  专栏  ›  技术社区  ›  Günter Obiltschnig

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

  •  6
  • Günter Obiltschnig  · 技术社区  · 16 年前

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

    2 回复  |  直到 9 年前
        1
  •  4
  •   J. A. Corbal    13 年前

    为什么会这样?

    这种行为的主要原因是 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 或者它的一个子窗口 ; 否则,将为 抓住窗户 显示。

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

    我想你可以用 XUnDefineCursor XUndefineCursor :

    XUndefineCursor(Display *display;
                    Window w);
    

    撤消前一个选项的效果 XDefineCursor() 用于活动窗口。当指针在窗口中时,将使用父级光标。如果选择一个透明指针作为默认指针,并使用取消定义子窗口的游标,则应该根本看不到游标。 迅达 相当于 XDefineCursor 当光标设置为 没有一个 .

        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,使用其他方法与windows进行通信,但可能无论如何都不起作用。


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

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

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

        2
  •  1
  •   Havoc P    16 年前

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

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

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