Как скрыть указатель мыши под Linux / X11?

Как скрыть указатель мыши под X11? Я хотел бы использовать встроенные библиотеки, чтобы сделать это, а не что-то вроде SDL (SDL_ShowCursor(0)) или glut (glutSetCursor(GLUT_CURSOR_NONE)). Кроме того, указатель мыши должен быть скрыт независимо от местоположения указателя, а не только в собственном окне.

9 ответов


вы можете создать и установить невидимую тему курсора. Этот трюк используется maemo, потому что довольно бессмысленно иметь курсор на сенсорном устройстве.

к сожалению, возможность изменения темы глобального курсора во время выполнения неоднородна в приложениях и наборах инструментов X11. Вы можете изменить ресурс сервера Xcursor.theme, и никто не заметит (обычно это запрашивается только при запуске); вы можете сообщить xsettings который, похоже, влияет только на Gtk+ программы; KDE использует некоторую связь через свойства в корневом окне и т. д.

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


здесь описание как unclutter утилита делает это.

Unclutter-это программа, которая постоянно работает в фоновом режиме X11 сессия. Он проверяет положение указателя X11 (курсора) каждые несколько секунды, и когда он находит, что он не переместился (и нет кнопок нажатии на мышь, и курсор находится не в корневом окне) он создает небольшое подокно в качестве дочернего элемента окна, в котором находится курсор. Новое окно устанавливает курсор размера 1x1 но маска все 0, т. е. невидимый курсор. Это позволяет увидеть весь текст в например, xterm или xedit. Толпа людей согласится с этим. следует делать меньше отвлекает.

после создания программа ожидает, пока указатель покинет окно а потом уничтожает его, восстанавливая первоначальную ситуацию. События Button прозрачно передаются в родительское окно. Они обычно заставляют курсор появляться снова, потому что активный захват будет сделано программой пока кнопка вниз, поэтому указатель по-видимому, покинет окно, даже если его положение x y не изменится.


Я бы предпочел использовать более простой метод:

unclutter -idle 0

вы почти не видите курсор, все еще он доступен. Чтобы отключить мышь:

rmmod psmouse

или отключить модуль мыши постоянно где-то в /etc/. Обратитесь к руководству по распределению.


альтернатива unclutter

Unclutter не работал для меня, так как он не хорошо играет с аппаратными ускоренными поверхностями (например, теми, которые производятся VA-API intels при декодировании видео). Поэтому я нашел программу, которая спрятала указатель мыши менее окольным путем,hhp, и переписал его в C с минимальными зависимостями, результат hhpc. Я сделал это, чтобы избавить Хаскелла от необходимости скомпилируйте его и потому, что hhp иногда перестает скрывать указатель мыши.

hhpc, полагается только на glibc и xlib, поэтому его легко построить, просто сделайте make release. Вы можете получить код и инструкции от мой репозиторий. Это очень эффективная память и процессор (потому что он почти ничего не делает).


Я закончил с использованием XDefineCursor как ephemient упомянул. Управляющее приложение изменило курсор корневого окна по умолчанию, а другие приложения (которые находятся под моим контролем) унаследовали его.

специфика кода выглядит так:

// Hide the cursor

if (NULL==(display=XOpenDisplay(NULL))) 
{
   printf("Unable to open NULL display\n");
   exit(1);
}
window = DefaultRootWindow(display);

Cursor invisibleCursor;
Pixmap bitmapNoData;
XColor black;
static char noData[] = { 0,0,0,0,0,0,0,0 };
black.red = black.green = black.blue = 0;

bitmapNoData = XCreateBitmapFromData(display, window, noData, 8, 8);
invisibleCursor = XCreatePixmapCursor(display, bitmapNoData, bitmapNoData, 
                                     &black, &black, 0, 0);
XDefineCursor(display,window, invisibleCursor);
XFreeCursor(display, invisibleCursor);
XFreePixmap(display, bitmapNoData);

для того, чтобы скрыть курсор, а затем после того, как я

// Restore the X left facing cursor
Cursor cursor;
cursor=XCreateFontCursor(display,XC_left_ptr);
XDefineCursor(display, window, cursor);
XFreeCursor(display, cursor);

для восстановления курсора левой руки X (так как это корневое окно, и я не хочу, чтобы он оставался невидимым. Я не уверен, но я также мог бы использовать

XUndefineCursor(display, window);

есть -no-cursor опция для Xorg 1.7 и более поздних версий. https://www.x.org/wiki/AdvancedTopicsFAQ/

xinit -- -nocursor или startx -- -nocursor может работать.


используйте xbanish! Это "изгнать курсор мыши при вводе"! Начните с

xbanish &

и наслаждайтесь!


Это мое решение. Он помещает курсор туда, где вы его не видите (в моем случае, в левом нижнем углу)-затем он отключает мышь, поэтому вы не можете ее перемещать.

Примечание вы можете анализировать данные из xrandr, или поместите эти данные в среду при входе в систему, а затем используйте ее; таким образом, вам не придется жестко кодировать. Но, что касается меня, я никогда не меняю разрешение экрана, поэтому 768 в порядке:)

setmouse () {
   DISPLAY=":0" xinput  `DISPLAY=":0" xinput | grep Mouse |
           tr -d " " | tr "\t" " " |
           cut -d" " -f2 | cut -d"=" -f2`
}

offmouse () {
   DISPLAY=":0" xdotool mousemove 0 768 # use xrandr to find out
   setmouse disable
}

onmouse () {
   setmouse enable
}

все правильно!

Я думаю, что этот пост может стать немного старым, но если то, что я нашел, может помочь некоторым из нас, я определенно должен опубликовать его здесь ;)

Я нашел себе чистое и простое решение, которое отлично работает, без использования " xcb " (для того, что я пытался достичь, это было немного сверхинженерии (..)

Так:

все, что вам нужно, это команда "xsetroot" с соответствующими аргументами/параметрами:

- > чтобы скрыть курсор мыши, вы нужен дополнительный маленький файл (я назвал свой " blnk_ptr.cur и")

содержание этого файла:

#define blnk_ptr_width 1
#define blnk_ptr_height 1
#define blnk_ptr_x_hot 0
#define blnk_ptr_y_hot 0
static unsigned char blnk_ptr_bits[] = {
   0x00 };

затем, мы можем использовать две следующие команды:

- > чтобы скрыть курсор указателя мыши:

xsetroot -cursor blnk_ptr.xbm blnk_ptr.xbm

-> чтобы снова показать курсор указателя мыши:

xsetroot -cursor_name left_ptr

(вы можете использовать курсор указателя мыши, отличный от "left_ptr", но этот, похоже, широко доступен в системах *nix (..)

Btw - > я еще не знаю, как получите имя указателя, используемого в настоящее время системой с помощью xsetroot --> я думаю, что я [как обычно] digg это тоже, но я был бы рад иметь кого-то, кто знает, как дать мне ответ ( было бы неплохо ;) )

пользуются ? ; p