近況とハンマー何とか

ご無沙汰です。

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 上で効かなくなったりするので、これを機にスクロールホイールのあるマウス購入検討中、なのであります。

エレコムのでかい奴かなー。

カテゴリー: tech パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です