Прозрачная тема курсора X11 - Почему курсор X появляется в подокнах GTK +? - PullRequest
7 голосов
/ 16 августа 2010

Я использую трюк с прозрачным курсором (см. http://obiltschnig.com/2010/08/14/hiding-the-gtkx11-mouse-cursor/), чтобы скрыть курсор X11 в полноэкранном приложении Linux GTK + для устройства на сенсорном экране. В основном я использую приложение на основе WebKit GTK + с использованием XorgСервер без оконного менеджера в полноэкранном режиме. Теперь скрытие курсора путем установки прозрачного 1-пиксельного курсора по умолчанию работает довольно хорошо (см. также: Как скрыть указатель мыши в Linux / X11? )Однако, как только курсор находится в подокне (например, окно предупреждения JavaScript или комбинированный список / HTML), появляется курсор X (и он снова исчезает, если курсор перемещается из окна). Кто-нибудь знает, почему этоэто так? И есть ли способ полностью скрыть курсор?

Ответы [ 2 ]

4 голосов
/ 31 мая 2013

«Почему это так?»

Основная причина такого поведения заключается в том, что функция 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.

«Есть ли способ полностью скрыть курсор?»

Я думаю, что вы можете изменить это поведение с помощью XUnDefineCursor и 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, и указатель мыши исчезнет, ​​как только вы перестанете перемещать курсор.

1 голос
/ 16 августа 2010

Если дочернее окно устанавливает курсор, тогда он будет иметь этот курсор вместо того, который установлен в родительском окне. Диспетчер окон обычно устанавливает курсор корневого окна, но если приложение меняет курсор, оно отменяет это.

Приложение GTK обычно устанавливает курсоры темы курсора, но, возможно, проблема связана с отсутствием менеджера xsettings или другой обычной настройки среды рабочего стола. Посмотрите, исправляет ли это запущенный gnome-settings-manager, и если да, то можете попробовать воспроизвести его функциональность.

Вы также можете заглянуть в XFixesHideCursor (), если вы можете положиться на X-сервер с этим расширением, это может решить проблему.

...