ご無沙汰です。
Apple のデベロッパー登録料をにらんでみて、iOS の開発者登録を一時休止しています。このごろは PHP, Java が多い感じです。というわけでアプリ開発も休止中。久しぶりに Orizome で遊んでみたら「やっぱ良いね〜」と思いましたが、処理速度がネックですね。(というか今の端末ではダウンロードできないか。。。)
さて、技術的な話題を1つ。
セキュリティ的な問題(CPU の脆弱性)からMac OS を更新して High Sierra (=10.13.x) になったのですが、今まで使っていた KeyRemap4MacBook での設定が効かなくなってしまいました。
そもそもを言うと、マウスではなく、トラックボール T-BC21 を使っているのですが、こいつはボールはあってもスクロールホイールがありません。ではどうやってスクロールするかというと「いわゆる中ボタンを押しながらボールを回すとスクロール」という設定でやっていました。この設定を取り持つのが KeyRemap4MacBook だったわけで。
しかし、使えなくなってしまったので、久しぶりに改めて調べてみると後続となるアプリケーション Karbiner がありました。https://pqrs.org/osx/karabiner/
が、インストールしても中ボタン→スクロールの変換設定はなしorz。アンインストール。
参ったなあ、AppleScript でも組むかと思いましたが、最終的にたどり着いたのが HammerSpoon。http://www.hammerspoon.org/
Lua は知識としては知っていましたが、結構書き方が独特だなぁ… といっても、ほとんどはコピペしただけですけど。設定は ~/.hammerspoon/init.lua のファイルにテキストエディタで書き込みます。HammerSpoon.app を起動してリロードして設定適用。
というわけで中ボタン→スクロールの変換をするコードは以下の通り。使用は自己責任で。※自分もテスト中に一度、クリックできなくなってかなり焦りました…
(べた書きですみません。ちゃんとインデントしてね。)
++++++++++++++++++++++++++++++++++++++++
local log = hs.logger.new(‘my_logger’,’debug’)
— log.i(‘Initializing’) — will print “[mymodule] Initializing” to the console
curr_win = nil
mx = 100
my = 100
function get_window_under_mouse()
— Invoke `hs.application` because `hs.window.orderedWindows()` doesn’t do it
— and breaks itself
local _ = hs.application
local my_pos = hs.geometry.new(hs.mouse.getAbsolutePosition())
local my_screen = hs.mouse.getCurrentScreen()
return hs.fnutils.find(hs.window.orderedWindows(), function(w)
return my_screen == w:screen() and my_pos:inside(w:frame())
end)
end
down_event = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDown }, function(e)
curr_win = get_window_under_mouse()
local mp = hs.mouse.getAbsolutePosition();
mx = mp[‘x’]
my = mp[‘y’]
return true
end)
down_event:start()
release_event = hs.eventtap.new({ hs.eventtap.event.types.otherMouseUp }, function(e)
curr_win = nil
return true
end)
release_event:start()
drag_event = hs.eventtap.new({ hs.eventtap.event.types.otherMouseDragged }, function(e)
— log.i(‘dragging,,,’)
if (curr_win) then
local dx = e:getProperty(hs.eventtap.event.properties.mouseEventDeltaX)
local dy = e:getProperty(hs.eventtap.event.properties.mouseEventDeltaY)
— log.i(‘x:’ .. dx .. ‘ y:’ .. dy)
hs.eventtap.scrollWheel({-dx * 3, -dy * 4}, {}, ‘pixel’)
hs.mouse.setAbsolutePosition({x = mx, y = my})
end
return true
end)
drag_event:start()
++++++++++++++++++++++++++++++++++++++++
MouseButton3 でも 4 でも全部取ってしまう処理です。down_event と release_event は不要だと思って一旦消したけど、たまに Firefox がクラッシュする原因になってたっぽかったので復活。curr_win を取るコスト考えてもあっていいよね。速度測ってないけど。
hs.eventtap.scrollWheel({-dx * 3, -dy * 4}, {}, ‘pixel’)
の行の数字をいじるとスクロールスピード調整ができます。dx, dy のマイナスをとればスクロール方向が逆に。
まあそんなところです。
といっても XQuarts 上で効かなくなったりするので、これを機にスクロールホイールのあるマウス購入検討中、なのであります。
エレコムのでかい奴かなー。