マウスカーソルの自動隠蔽

マウスの動きが一定時間なければマウスカーソルを非表示にし、動きがあれば表示する何かを作りました。

mouse.lua

-- mouse.lua
do
	-- マウスの座標
	local x = -1
	local y = -1
	-- 直前のマウスの座標
	local lx = -1
	local ly = -1

	-- 現在の時刻
	local now = 0
	-- 最後に動いた時刻
	local last = 0
	-- 最後に動いた時刻からの経過時間
	local past = 0

	-- マウスカーソルを消去する限界のミリ秒
	local limit = 5000 -- 初期状態で5秒とする。
	-- 現在マウスカーソルが表示されているかどうか。
	local flag = true

	-- ローカル関数
	
	-- booleanを1か0に変換して返す。
	local bool2num = function(bool)
		if bool then return 1 else return 0 end
	end
	-- 0をfalseに、それ以外をtrueにして返す。
	local num2bool = function(num)
		if num==0 then return false else return true end
	end
	
	-- マウスカーソルを表示する。
	local print_cursor = function()
		if not(flag) then -- 表示していない時に限り
			NSExec("_mousemode 1")
			flag = true
		end
	end

	-- マウスカーソルを非表示にする。
	local erace_cursor = function()
		if flag then -- 表示している時に限り
			NSExec("_mousemode 0")
			flag = false
		end
	end

	-- mousemodeを上書きする。
	NSExec("luasub mousemode")
	function NSCOM_mousemode()
		if num2bool(NSPopInt()) then
			print_cursor()
		else
			erace_cursor()
		end
	end

	-- マウスに動きがあった時の処理
	local move_mouse = function()
		-- 即座にマウスカーソルを表示する。
		print_cursor()
		-- また、最後に動いた時刻を更新する。
		last = now
		-- 値を更新
		lx = x
		ly = y
	end

	-- NSCALL_animationの中から、mouse_blink関数を呼び出すこと。
	function mouse_blink()
		now = NSTimer() -- 現在の時刻を取得
		past = now - last -- 最後に動いた時刻からの経過時間を取得

		x, y = NSGetMouse() -- 現在のマウスの座標を取得
		if x == lx and y == ly then -- 不動であれば
			-- 経過時刻を見る。
			if past > limit then -- 限界を超えていれば、消去する。
				erace_cursor()
			else -- そうでなければ表示する。
				print_cursor()
			end
		else -- 動きが認められれば
			move_mouse()
		end
		return false -- 常にfalseを返す。
	end
	
	-- getmouseposを上書きする。
	NSExec("luasub getmousepos")
	function NSCOM_getmousepos()
		local rx = NSPopIntRef()
		NSPopComma()
		local ry = NSPopIntRef()
		mouse_blink() -- マウスの表示非表示処理をする。
		NSSetIntValue(rx, x)
		NSSetIntValue(ry, y)
	end
	
	-- 追加命令
	-- 現在、マウスの表示非表示を取得する。
	function is_mouse_printed() return flag end
	-- それをNScripterの側から扱えるようにする。
	NSExec("luasub getmousemode")
	function NSCOM_getmousemode()
		NSSetIntValue(NSPopIntRef(), bool2num(is_mouse_printed()))
	end

	-- movemousecursorを上書き
	NSExec("luasub movemousecursor")
	function NSCOM_movemousecursor()
		x = NSPopInt()
		NSPopComma()
		y = NSPopInt()
		-- マウスカーソルを動かす。
		NSExec("_movemousecursor "..tostring(x)..","..tostring(y))
		move_mouse() -- 画面の更新
	end
end

使い方

  1. 上述のmouse.luaを保存する。
  2. system.luaの中から、NL_dofile("mouse.lua")などと呼び出す。
  3. NSCALL_animation関数の中から、mouse_blink()関数を呼び出すようにする。

こうするだけで一定時間(初期設定では5秒)マウスカーソルが動かなければマウスカーソルを自動で非表示にする。動かせば自動的に表示になる。
消えるまでの秒数の変更は、mouse.luaの中のlimitに代入する数値を変更すること。

その他

  • getmouseposとmousemodeとmovemousecursorを上書きしているので、これ以上上書きしないように注意する。
  • getmousemodeと言う、mousemodeと対になる命令を作成した。現在マウスカーソルを表示しているかいないかを取得する命令。結果を受け取る数値変数を指定する。

何に使うの?

いやなんかさ。世の中には、エロい画像の上にあるマウスカーソルが邪魔で邪魔でしょうがなく感じる人がいるらしくてさ。そんな人のためにちょちょっと作ってみたんですけど。