Как скрыть указатель мыши под X11? Я хотел бы использовать встроенные библиотеки для этого, а не что-то вроде SDL (SDL_ShowCursor (0)) или glut (glutSetCursor (GLUT_CURSOR_NONE)). Кроме того, указатель мыши должен быть скрыт независимо от местоположения указателя, а не только в его собственном окне.
Как скрыть указатель мыши под Linux/X11?
Ответ 1
Вы можете создать и установить невидимую тему курсора. Этот трюк используется maemo, потому что он довольно бессмыслен, чтобы иметь курсор на сенсорном устройстве.
К сожалению, возможность изменения темы глобального курсора во время выполнения неравномерна в приложениях и инструментах X11. Вы можете изменить ресурс сервера Xcursor.theme
, и никто не заметит (обычно он запрашивается только при запуске); вы можете сообщить xsettings, который, по-видимому, влияет на программы Gtk +; KDE использует какое-то сообщение через свойства в корневом окне; и др.
По крайней мере, изменение курсора для вашего собственного приложения так же просто, как XDefineCursor, и если вы сделаете это в корневом окне, некоторые приложения могут следовать.
Ответ 2
Здесь описание, как это делает утилита unclutter
.
Unclutter - это программа, которая постоянно работает на фоне X11 сессия. Он проверяет позицию указателя (курсора) X11 каждые несколько секунд, и когда он находит, что он не перемещен (и никаких кнопок нажимаются на мышь, а курсор не находится в корневом окне) он создает небольшое вспомогательное окно в качестве дочернего элемента окна, в котором находится курсор. В новом окне устанавливается курсор размера 1x1, но маска все 0, т.е. невидимый курсор. Это позволяет увидеть весь текст в например, xterm или xedit. Толпа человеческих факторов согласилась бы с этим должно сделать вещи менее отвлекающими.
После создания программа ждет, пока указатель покинет окно а затем уничтожает его, восстанавливая исходную ситуацию. События кнопок передаются прозрачно в родительское окно. Они, как правило, заставят курсор появляться, потому что активный захват будет выполняться программой, пока кнопка не работает, поэтому указатель по-видимому, покинет окно, хотя его положение x y не изменится.
Ответ 3
Я бы предпочел использовать более простой метод:
unclutter -idle 0
Вы почти не видите курсор, но он доступен. Чтобы отключить мышь:
rmmod psmouse
Или полностью отключить модуль мыши где-нибудь в /etc/. См. Руководство по дистрибуции.
Ответ 4
В итоге я использовал XDefineCursor, как упоминалось выше. Приложение управления изменило курсор корневого окна по умолчанию, а другие приложения (которые находятся под моим контролем) унаследовали его.
Особенности кода выглядят следующим образом:
// 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);
Ответ 5
альтернатива unclutter
Unclutter не работал у меня, так как он плохо работает с аппаратными ускоренными поверхностями (например, такими, которые создаются VA-API intels при декодировании видео). Поэтому я нашел программу, которая спрятала указатель мыши менее окольным способом, hhp и переписала его на C с минимальные зависимости, результат hhpc. Я сделал это, чтобы избавиться от необходимости иметь haskell для его компиляции и потому, что hhp иногда переставал скрывать указатель мыши.
hhpc, полагается только на glibc
и xlib
, поэтому его легко создавать, просто сделайте make release
. Вы можете получить код и инструкции из моего репозитория. Это очень эффективная память и процессор (потому что почти ничего не делает).
Ответ 6
Существует опция -no-cursor
для Xorg 1.7 и более поздних версий. https://www.x.org/wiki/AdvancedTopicsFAQ/
xinit -- -nocursor
или startx -- -nocursor
может работать.
Ответ 7
Использовать xbanish! Он "изгоняет курсор мыши при наборе текста"! Начните с
xbanish &
и наслаждайтесь!
Ответ 8
Хорошо!
Я думаю, что этот пост может быть немного старым, но если то, что я нашел, может помочь некоторым из нас, я определенно должен опубликовать его здесь;)
Я нашел себе чистое и простое решение, которое отлично работает, не используя "xcb" (для чего я пытался добиться этого, это было litte over-engineering (..)
Итак:
Все, что вам нужно, это команда "xsetroot" с соответствующими аргументами/параметрами:
- > , чтобы скрыть указатель мыши, вам нужен дополнительный маленький файл (я назвал свой "blnk_ptr.xbm" )
содержимое этого файла:
#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, но я был бы рад есть кто-то, кто знает, как мне дать ответ (было бы хорошо;))
Наслаждайтесь? ; Р
Ответ 9
Это мое решение. Он помещает курсор туда, где вы его не видите (в моем случае, в левом нижнем углу) - тогда он отключает мышь, поэтому вы не можете ее перемещать.
Примечание. Вы можете анализировать данные из xrandr
или помещать эти данные в среду при входе в систему, а затем использовать ее; таким образом, вам не придется жестко закодировать. Но, что касается меня, я никогда не меняю разрешение экрана, поэтому 768 в порядке:)
setmouse () {
DISPLAY=":0" xinput $1 `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
}