Как скрыть указатель мыши под Linux / X11? - PullRequest
28 голосов
/ 19 марта 2009

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

Ответы [ 9 ]

34 голосов
/ 30 марта 2009

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

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

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

18 голосов
/ 18 декабря 2012

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

unclutter -idle 0

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

rmmod psmouse

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

17 голосов
/ 01 мая 2013

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

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

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

14 голосов
/ 20 марта 2009

В итоге я использовал 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);
14 голосов
/ 19 марта 2009

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

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

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

13 голосов
/ 15 сентября 2016

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

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

6 голосов
/ 05 февраля 2017

Используйте xbanish! Это «изгнать курсор мыши при наборе текста»! Начните с

xbanish &

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

4 голосов
/ 17 июня 2013

Хорошо!

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

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

Итак:

Все, что вам нужно, это команда "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 -> Я думаю, что я [как обычно] тоже откопаю это, но я был бы рад есть кто-то, кто знает, как с практическими рекомендациями дать мне ответ (это было бы хорошо;))

Наслаждайтесь? ; Р

4 голосов
/ 24 января 2013

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

Примечание Вы можете проанализировать данные из 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
}
...