«Почему это так?»
Основная причина такого поведения заключается в том, что функция 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
, и указатель мыши исчезнет, как только вы перестанете перемещать курсор.