2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Hammerspoon】トラックボールで画面スクロールを可能にする

Last updated at Posted at 2024-11-20

私はせっかちなので、画面スクロールを爆速でしようとホイールを全力で回し、指が痛くなってきました(汗)
PC設定のホイール感度を挙げているにもかかわらずです。

そんな中、トラックボールマウスを使っているので指の中でも強い親指は酷使に耐えられるのではないかと思いました。

何をする

特定のキーまたはボタンを押している間、トラックボールを動かすと画面がスクロールするようにする。
私はcommandを押している間スクロールモードにしてみています。

※Mac向けの説明になります。

設定手順

1. Hammerspoonのインストール

画面上部のDownloadボタンを押すとGitHubに飛びます。

GitHubのページ下にある Hammerspoon-(バージョン).zip からダウンロード(下図)。

                                       
Qiita

ダウンロードできたらzipを展開してアプリを開きましょう。

2. 設定ファイルの書き換え

アプリを起動できたらメニューバーにアプリアイコンが追加されるのでクリック。
OpenConfigで設定ファイルを開きます。

                                       
Qiita

そしたらエディタで設定ファイルが開くかと思いますので、そこに以下をペースト。
これはcommandを押している間トラックボールの動きがスクロールになります。

-- HANDLE SCROLLING
local oldmousepos = {}
local scrollmult = -4	-- negative multiplier makes mouse work like traditional scrollwheel

mousetap = hs.eventtap.new({5}, function(e)
	oldmousepos = hs.mouse.getAbsolutePosition()
	local mods = hs.eventtap.checkKeyboardModifiers()
	if mods['cmd'] then -- ここでキーを選べる 例:ctrl
		-- print ("will scroll")
		local dx = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaX'])
		local dy = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaY'])
		local scroll = hs.eventtap.event.newScrollEvent({dx * scrollmult, dy * scrollmult},{},'pixel')
		scroll:post()
		
		-- put the mouse back
		hs.mouse.setAbsolutePosition(oldmousepos)
		
		-- return true, {scroll}
		return true
	else
		return false, {}
	end
	-- print ("Mouse moved!")
	-- print (dx)
	-- print (dy)
end)
mousetap:start()

3. 設定ファイルのリロード

最後に設定ファイルを上書き保存して、メニューバーからReload Configを押せば設定が反映されます!

                                       
Qiita

オプション

  • スクロール向きの変更
local scrollmult = -4

の数字を小さくするとスクロールスピードが遅くなります。
マイナスをなくすとスクロールの向きが反対になります。

  • キーの変更
if mods['cmd'] then 

のところから変更可能。

if mods['cmd'] and mods['ctrl'] then 

複数のキーを押している間にすることも可能。

(ちなみに)マウスを右クリック中にスクロールモードにする場合

設定ファイルを以下に書き換える。
片手で済むので楽になりますね。

-- HANDLE SCROLLING

local deferred = false

overrideRightMouseDown = hs.eventtap.new({ hs.eventtap.event.types.rightMouseDown }, function(e)
    --print("down"))
    deferred = true
    return true
end)

overrideRightMouseUp = hs.eventtap.new({ hs.eventtap.event.types.rightMouseUp }, function(e)
    -- print("up"))
    if (deferred) then
        overrideRightMouseDown:stop()
        overrideRightMouseUp:stop()
        hs.eventtap.rightClick(e:location())
        overrideRightMouseDown:start()
        overrideRightMouseUp:start()
        return true
    end

    return false
end)


local oldmousepos = {}
local scrollmult = -4	-- negative multiplier makes mouse work like traditional scrollwheel
dragRightToScroll = hs.eventtap.new({ hs.eventtap.event.types.rightMouseDragged }, function(e)
    -- print("scroll");

    deferred = false

    oldmousepos = hs.mouse.getAbsolutePosition()    

    local dx = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaX'])
    local dy = e:getProperty(hs.eventtap.event.properties['mouseEventDeltaY'])
    local scroll = hs.eventtap.event.newScrollEvent({dx * scrollmult, dy * scrollmult},{},'pixel')
    
    -- put the mouse back
    hs.mouse.setAbsolutePosition(oldmousepos)

    return true, {scroll}
end)

overrideRightMouseDown:start()
overrideRightMouseUp:start()
dragRightToScroll:start()

その他設定

に色々な設定が書いてありそうでした。
この記事に記載のコードはこちらから抜粋したものです。

関連ページ

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?