Xサーバーでプログラムでカーソルを表示するかどうかを切り替えます。

Xサーバーでプログラムでカーソルを表示するかどうかを切り替えます。

私は、さまざまなグラフィックプログラムをホストするXサーバーを実行するキオスクシステムを持っています。すべてのプログラムは、システムユニットがクラッシュするため、相互に排他的です。これらのプログラムのいくつかでは、デフォルトのX11カーソルを使用したいと思います。クロス。そのアプリケーションのsystemd単位で設定できますxsetrootxsetrootあるいは、他のツールを使ってカーソルを隠すこともできますか?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拡張(参考資料を参照)がある場合は、rootウィンドウを呼び出して、プログラムが終了するまですべてのカーソルを隠すxdpyinfo小さなCプログラムを作成できます。インクルードファイルを含めるには、XFixesHideCursor()一部のX11開発パッケージ(libXfixes-develディストリビューションなど)をインストールする必要があります/usr/include/X11/extensions/Xfixes.hnocursor.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中断されるまでカーソルは表示されません。

おすすめ記事