X 서버에서 프로그래밍 방식으로 커서 표시 여부를 전환합니다.

X 서버에서 프로그래밍 방식으로 커서 표시 여부를 전환합니다.

저는 다양한 그래픽 프로그램을 호스팅하는 X 서버를 실행하는 키오스크 시스템을 가지고 있습니다. 모든 프로그램은 시스템 단위가 충돌하기 때문에 상호 배타적입니다. 이러한 프로그램 중 일부에서는 기본 X11 커서를 사용하고 싶습니다.십자가. 해당 애플리케이션의 systemd 단위에서 설정하면 됩니다 xsetroot. xsetroot또는 다른 도구를 사용하여 커서를 숨길 수도 있습니까?X 서버를 다시 시작할 필요가 없습니다.?

내가 배제한 옵션은 다음과 같습니다.

  • -nocursorX 서버용 매개변수 - 런타임 전체에 걸쳐 모든 애플리케이션에 대한 커서가 비활성화됩니다.
  • unclutter- 이동하지 않을 때뿐만 아니라 런타임 내내 해당 응용 프로그램에서 커서가 숨겨지길 원합니다.
[Unit]
Description=Plain X.org server
After=plymouth-quit-wait.service
[email protected] display-manager.service

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=/usr/bin/Xorg vt7 -nolisten tcp -noreset -nocursor
# Wait for server to be ready and set kiosk configuration.
ExecStartPost=/usr/bin/kiosk
# Set chicken as cursor to be able to test touch screen
# and see whether X server is actually running.
ExecStartPost=/usr/bin/xsetroot -cursor_name tcross
Restart=on-failure
RestartSec=3

[Install]
WantedBy=graphical.target

답변1

X11 서버에 XFIXES 확장(참고자료 참조)이 있는 경우 루트 창을 호출하여 프로그램이 끝날 때까지 모든 커서를 숨기는 xdpyinfo작은 C 프로그램을 작성할 수 있습니다 . 포함 파일을 포함하려면 XFixesHideCursor()일부 X11 개발 패키지(예 libXfixes-devel: 배포판에 따라 다름) 를 설치해야 할 수도 있습니다 /usr/include/X11/extensions/Xfixes.h. nocursor.c저장할 파일을 만듭니다 .

/* https://unix.stackexchange.com/a/726059/119298 */
/* compile with -lX11 -lXfixes */
/* https://www.x.org/releases/current/doc/fixesproto/fixesproto.txt */
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    Display *display = XOpenDisplay(NULL);
    if(display==0)exit(1);
    int screen = DefaultScreen(display);
    Window root = RootWindow(display, screen);
    XFixesHideCursor(display, root);
    XSync(display, True);
    pause(); /* need to hold connection */
    return 0;
}

그리고 gcc -o nocursor nocursor.c -lX11 -lXfixes. ./nocursor적절한 환경에서 set을 실행한 후에 DISPLAY는 프로그램이 중단될 때까지 커서가 나타나지 않습니다.

관련 정보