ご無沙汰です。
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 上で効かなくなったりするので、これを機にスクロールホイールのあるマウス購入検討中、なのであります。
エレコムのでかい奴かなー。
コメント失礼します。
中クリック+ホイールでスクロールをなんとかしたいと思っている時にこちらのブログに辿り着きました。
書かれているコードを入力したところ、
2021-12-28 21:49:45: — Lazy extension loading enabled
2021-12-28 21:49:45: — Loading ~/.hammerspoon/init.lua
2021-12-28 21:49:45: *** ERROR: /Users/xxxx/.hammerspoon/init.lua:2: unexpected symbol near ”
というエラーが出てしまうのですが、なにか解決法分かりますでしょうか?
もし教えていただければ幸いです。
宜しくお願い致します。
Hello, nike.
もうアプリケーションが動かない環境になってしまったので正確な答えは返せません。
が、init.lua を見る限り、2行目(かな?)にログ関連の記述があるので、とりあえず local log から始まる2行目を消せばよいと思います。
ログ出力は確認用でいれただけのコードなので消しても問題ありません。
ちなみに、当該記事で書いていたのは
+ 中クリック+マウス移動→スクロール
なので、ホイールの場合はちょっと書換が必要だと思います。
Lua の知識が無いとちょっと厳しいと思いますが、頑張ってみて下さい。