Как скрыть указатель мыши под 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
может работать.
Это мое решение. Он помещает курсор туда, где вы его не видите (в моем случае, в левом нижнем углу)-затем он отключает мышь, поэтому вы не можете ее перемещать.
Примечание вы можете анализировать данные из 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