Raspberry Pi でウィンドウ内の指定位置をクリックする

Raspberry Pi で指定ウィンドウ内の、指定位置をクリックする操作をコマンドラインから実行したい。その方法のメモ。

環境:Raspberry Pi 3 Model B、Raspberry Pi OS Buster

(1)xdotool をインストールする。

[Raspberry Pi] xdotool でマウスを自動操作 – with a Christian Wife
https://wacw.cf/2019/08/01/xdotool-on-raspberrypi/

以下 SSH 経由で操作する場合は、コマンドの先頭に DISPLAY=:0 を付ける。

(2)アクティブなウィンドウの window_id を取得する。

対象ウィンドウをクリック。そのうえで以下のコマンドを実行する。

$ xdotool getmouselocation
x:813 y:184 screen:0 window:16777668

これで、マウスカーソルの絶対位置および window_id(windows: に続く数字)が分かる。

windows_id を取得するには別の方法もある。以下のコマンドを実行し、対象のウィンドウをクリックしても表示される。

$ xdotool selectwindow

(3)対象ウィンドウの現在の位置におけるウィンドウの左上の座標を取得する。

$ xdotool mousemove --window 16777668 0 0
$ xdotool getmouselocation
x:86 y:95 screen:0 window:16777498

window_id が先ほどと変わっているのは、ウィンドウ内の相対座標が (0, 0) においては、ウィンドウの外(ウィンドウからカーソルが外れている)の状態だからなようだ。だから前述の window_id が正しい。

ウィンドウ左上の座標が (86, 95) だと分かった。

(4)最終的にウィンドウ内でクリックしたい位置にマウスを持っていく。そのうえで、現在位置を取得する。

$ xdotool getmouselocation
x:737 y:598 screen:0 window:16777668

ウィンドウ内でクリックしたい位置の座標が (737, 598) だと分かった。

(5)クリックしたい位置のウィンドウ内での相対座標を計算する(4から3の座標を引けばいい)。

(737-86, 598-95) = (651, 503)

テストとして、ウィンドウ内での相対位置に対してマウスカーソルを移動させてみる。

$ xdotool mousemove --window 16777668 651 503

確かに望み通りの場所にマウスカーソルが移動した。ウィンドウを動かしても、ちゃんと持っていきたい位置にマウスカーソルが行くようになった。

さらにその位置でクリックするには以下のコマンド。

$ xdotool click 1

マウスカーソルの移動とクリックを一つのコマンドで実行するには以下。

$ xdotool mousemove --window 16777668 651 503 click 1

参考:
xdotool コマンド全26実例 – console dot log
https://blog.capilano-fw.com/?p=3477

Xdotool – Mouse | Linux.org
https://www.linux.org/threads/xdotool-mouse.10556/

Is there an X app which can position the mouse relative to a window (not the screen)? – Ask Ubuntu
https://askubuntu.com/questions/9162/is-there-an-x-app-which-can-position-the-mouse-relative-to-a-window-not-the-scr

Raspberry Pi xdotoolで快適なディスクトップ環境
https://dbpro.xyz/4621