Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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
}