1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

トラックボールでスクロールがしたい(Mac向け)

Posted at

トラックボールでスクロールがしたくて設定をしていたが、HammerspoonとKarabinerの仕様の差に嵌められたよって話です。

インストール

調べてね
トラックボールによるスクロール自体はHammerspoonのみでできます。

この記事とか

こんな記事読んでる人はもうインストール済かと思うけども、 Karabiner-Elementsも便利だからインストールしましょう。
そのせいで嵌められたと言っても過言ではないけど

設定方法

GitHubに偉大な先達がいるので、基本的にはコードをそのまま実行するだけです。

  1. メニューバーのHannmerSpoonアイコンから、"Open Config"を押す。
    tmp.png

  2. テキストエディタとかで"init.lua"というファイルが開くので、以下のコードをペースト

init.lua
-- HANDLE SCROLLING WITH MOUSE BUTTON PRESSED
local scrollMouseButton = 2
local deferred = false

overrideOtherMouseDown = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDown }, function(e)
    -- print("down")
    local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
    if scrollMouseButton == pressedMouseButton 
    then 
    deferred = true
    return true
end
end)

overrideOtherMouseUp = hs.eventtap.new({ hs.eventtap.event.types.otherMouseUp }, function(e)
    -- print("up")
    local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
    if scrollMouseButton == pressedMouseButton 
    then 
    if (deferred) then
    overrideOtherMouseDown:stop()
    overrideOtherMouseUp:stop()
    hs.eventtap.otherClick(e:location(), 0, pressedMouseButton)
    overrideOtherMouseDown:start()
    overrideOtherMouseUp:start()
    return true
end
return false
end
return false
end)

local oldmousepos = {}
local scrollmult = -2	-- negative multiplier makes mouse work like traditional scrollwheel

dragOtherToScroll = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDragged }, function(e)
    local pressedMouseButton = e:getProperty(hs.eventtap.event.properties['mouseEventButtonNumber'])
    -- print ("pressed mouse " .. pressedMouseButton)
    if scrollMouseButton == pressedMouseButton 
    then 
    -- 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}
    else 
    return false, {}
end 
end)

overrideOtherMouseDown:start()
overrideOtherMouseUp:start()
dragOtherToScroll:start()

こちらのコードはGitHubにいた先達から拝借しました。ありがとうございます。

2行目のscrollMouseButtonの値を変更することで、トリガーとなるボタンを変更できるのですが、ここに罠がありました。

私はもともとKarabinerを使用していたので、Karabiner-Eventviewerでボタンの名前を確認していました。
image.png

戻るボタンを押して確認したら"Button4"だったので、先のコードに"4"を入力しても動かず、なんでやねんと思っておりましたが、どうもHannmerSpoonとKarabinerでボタンの番号が違うことが原因のようです。

ボタン番号をHannmerSpoonで確認する

以下のコードをinit.luaに書き込む

init.lua
hs.eventtap.new({hs.eventtap.event.types.otherMouseDown}, function(e)
    print("Button pressed: ", e:getProperty(hs.eventtap.event.properties.mouseEventButtonNumber))
end):start()

保存してメニューバーのHannmerSpoonアイコンから"Console"を選択

image.png

こんな画面が開くので、右上の"Reload config"を押してから、トリガーにしたいマウスボタンを押す。

画像のように押されたボタンの番号が表示されるのでこれを覚えておいて、長い方のコードをinit.luaに貼り付け、2行目を先程確認したボタンの番号に書き換えればOK

保存したらReload configを忘れずに!!!(n敗)

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?