X11でマウスポインターを非表示にするにはどうすればよいですか? SDL(SDL_ShowCursor(0))やglut(glutSetCursor(GLUT_CURSOR_NONE))のようなものではなく、これを行うために組み込みライブラリを使用したいと思います。また、マウスポインターは、ウィンドウ内だけでなく、ポインターの位置に関係なく非表示にする必要があります。
非表示のカーソルテーマを作成および設定できます。このトリックは maemo で使用されます。これは、タッチスクリーンデバイスにカーソルを置くのは無意味だからです。
悲しいことに、実行時にグローバルカーソルテーマを変更する機能は、X11アプリケーションとツールキット間で統一されていません。サーバーリソースを変更できますXcursor.theme
、そして誰も気付かないでしょう(一般的には起動時にのみ問い合わせられます)。 xsettings に通知できますが、これはGtk +プログラムにのみ影響するようです。 KDEは、ルートウィンドウのプロパティを介して何らかの通信を使用します。等.
少なくとも、独自のアプリケーションのカーソルを変更するのは XDefineCursor と同じくらい簡単で、ルートウィンドウでそれを行う場合、someアプリケーションmightが続きます。
説明unclutter
ユーティリティの動作を次に示します。
Unclutterは、X11セッションのバックグラウンドで永続的に実行されるプログラムです。 X11ポインター(カーソル)の位置を数秒ごとにチェックし、移動していない(マウスでボタンが押されておらず、カーソルがルートウィンドウにない)ことがわかると、小さなサブウィンドウを作成します。カーソルが置かれているウィンドウの子。新しいウィンドウは、サイズ1x1のカーソルをインストールしますが、マスクはすべて0、つまり非表示カーソルです。これにより、たとえば、xtermまたはxeditのすべてのテキストを表示できます。人的要因の群衆は、物事を混乱させないようにすることに同意するでしょう。
作成されると、プログラムはポインターがウィンドウを離れるのを待ってからウィンドウを破棄し、元の状態を復元します。ボタンイベントは、親ウィンドウに透過的に渡されます。ボタンが押されている間、プログラムによってアクティブなグラブが行われるため、通常、カーソルが再表示されます。そのため、ポインタは、ウィンドウのx y位置が変わらなくてもウィンドウから離れます。
私はむしろより簡単な方法を使用します:
unclutter -idle 0
カーソルはほとんど表示されませんが、使用可能です。マウスを無効にするには:
rmmod psmouse
または、/ etc /のどこかでマウスモジュールを永続的に無効にします。配布マニュアルを参照してください。
Unclutterは、ハードウェアアクセラレートされたサーフェス(たとえば、IntelのVA-APIで作成されたサーフェスなど)でうまく動作しないため、機能しませんでしたビデオをデコードするとき)。そこで、マウスポインターをあまり遠回りしない方法で隠したプログラムhhpを見つけて、最小限のCで書き直しました。依存関係の場合、結果はhhpcです。これは、コンパイルにhaskellを使用する必要性をなくすため、およびhhpがマウスポインターの非表示を停止することがあるためです。
hhpc、glibc
とxlib
のみに依存しているため、構築が簡単です。ただmake release
。 my repository からコードと手順を取得できます。それは非常にメモリとCPU効率的です(ほとんど何もしないため)。
-no-cursor
Xorg 1.7以降のオプション。 https://www.x.org/wiki/AdvancedTopicsFAQ/
xinit -- -nocursor
またはstartx -- -nocursor
動作する可能性があります。
私は言及されたエフェミエントのように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);
Xbanishを使用してください! 「入力時にマウスカーソルを消す」!で始める
xbanish&
そしてお楽しみください!
大丈夫!
この投稿は少し古くなっているかもしれませんが、見つけたことが私たちの一部を助けることができるなら、私は間違いなくここに投稿する必要があります;)
「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 };
その後、次の2つのコマンドを使用できます。
->マウスポインターカーソルを非表示にするには:
xsetroot -cursor blnk_ptr.xbm blnk_ptr.xbm
->マウスポインターカーソルを再び表示するには:
xsetroot -cursor_name left_ptr
( "left_ptr"以外のマウスポインターカーソルを使用できますが、これは* nixシステム(..)で広く利用できるようです。
Btw-> xsetrootを使用してシステムで現在使用されているポインターの名前を取得する方法はまだわかりません-> [通常どおり]それを掘り起こすと思いますが、私に答えを与える方法を知っています(それは素敵です;))
楽しい ? ; p
これが私の解決策です。それはあなたがそれを見ることができない場所にカーソルを置きます(私の場合、左下隅に)-そして、それはマウスを無効にするので、あなたはそれを動かすことができません。
注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
}