最強の端末環境を整えるべく、 #mlterm にマウススクロール機能を足すパッチを書いた

読了まで:約3分


と​いう​お話。


最近、​僕は​ コミュニティ系 Web サービスの​開発 、​ と​いう​目標を​諦めた​関係で、​割と​こう、​日常的に​開発したい​ネタが​尽きてしまい、​手持ち無沙汰に​なった​ため、

んー、​ [[開発環境]] の​ [[再開発]] でも​するか

と​いう​感じで、​最強な​端末環境作るべく、​色々​作業を​していました。​それで、​ OSX の​ターミナルエミュレーターの​再選定とか​していて、

Terminal.app は​ Sixel とか​表示できないし、​かと​いって​ iTerm2 は​設定する​所が​結構​複雑だし、​もっと​こう、​シンプルで​いて、​かつ​痒い​ところに​手が​届きやすいターミナルエミュレーターは​無い​ものか。

と​思っていた​ところ、

そう​言えば、​前に​ Macbook Air mid 2011 に​ Archlinux を​突っ込んでいた​時、​ mlterm ​使ってたよなー

と​思い出した​ため、

を​ OSX で​使えないか、と​調べた​ところ、​なんと​ OSX の​ Cocoa 向けな​ビルドが​可能じゃないですかーやだー、​と​判った​ため、​ [[mlterm]] を​使ってみるべく、​自前で​コンパイルとか​していました。

が、​しかし。

実際に​ mlterm を​ OSX の​ Cocoa 向けの​ビルドを​行って​判った​事なんですが、​なんか、​マウス (正確には​トラックパッド) での​スクロールが​出来ない、​なんでや!と​いう​感じで、​一時は​ mlterm ​使うのは​諦めるかなーどうしようかなーと​考えて​たんですが、

とか​見てて、​色々​調べた​結果、

あれ、​これ、​も​しかして、​マウススクロール機能、​自分でも​実装出来るんじゃね?

と​思いに​至り。

自分で​実装しますた!!​1


と​いうのが​長い​前フリなんですが、​出来上がった​パッチは​下記に​なります。

$NetBSD$
--- xwindow/quartz/cocoa.m.orig 2016-05-08 06:47:04.000000000 +0000
+++ xwindow/quartz/cocoa.m
@@ -954,6 +954,47 @@ get_current_window(
x_window_receive_event( xwindow , (XEvent*)&mev) ;
}
+- (void)scrollWheel:(NSEvent *)event
+{
+   NSPoint loc =  [[event locationInWindow]]  ;
+   XButtonEvent bevPress;
+   XButtonEvent bevRelease;
+
+   bevPress.type   = X_BUTTON_PRESS ;
+   bevRelease.type = X_BUTTON_RELEASE ;
+
+   bevPress.time   = event.timestamp * 1000;
+   bevRelease.time = (event.timestamp * 1000) + 1;
+
+   bevPress.x    = loc.x - self.frame.origin.x;
+   bevRelease.x  = loc.x - self.frame.origin.x;
+
+   bevPress.y    = ACTUAL_HEIGHT(xwindow->parent) - loc.y - /* self.frame.origin.y - */ 1 ;
+   bevRelease.y  = ACTUAL_HEIGHT(xwindow->parent) - loc.y - /* self.frame.origin.y - */ 1 ;
+
+   bevPress.state    = event.modifierFlags &
+       (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask) ;
+   bevRelease.state  = event.modifierFlags &
+       (NSShiftKeyMask|NSControlKeyMask|NSAlternateKeyMask) ;
+
+   bevPress.click_count = 1;
+
+   if ( event.deltaY > 1 ) {
+       bevPress.button = 4;
+       bevRelease.button = 4;
+   }
+
+   if ( event.deltaY < -1 ) {
+       bevPress.button = 5;
+       bevRelease.button = 5;
+   }
+
+   if ( event.deltaY < -1 || event.deltaY > 1 ) {
+       x_window_receive_event( xwindow , (XEvent*)&bevPress );
+       x_window_receive_event( xwindow , (XEvent*)&bevRelease );
+   }
+}
+
- (void)keyDown:(NSEvent *)event
{
if(  [[event type]]  == NSFlagsChanged)

また、​この​パッチの​ファイルは

  • <https://github.com/nyarla/pkgsrc-nyarla/blob/master/mlterm/patches/patch-cocoa.m https://github.com/nyarla/pkgsrc-nyarla/blob/master/mlterm/patches/patch-cocoa.m>

でも​アクセス出来ます。

な​お、​この​パッチの​注意点は​幾つか​注意点が​あり、​まず​第一に、​僕が​ pkgsrc + pkgin を​使っている​関係で、​それらを​利用して​作った​パッチな​ため、​ [[Homebrew]] とかでも​取り込めるか​どうかが​良く​判っていません。

また、​この​パッチでは​スクロールイベントの​移動幅 (?) を​取る​ために​使っている​プロパティが​最新の​ OSX (正確には​ Lion 以降​) では​ deprecated で、​代りに​新しい​ API を​使った方が​良いのですが、​ mlterm の​ Cocoa 向け GUI が、​どの​ バージ​ョンの​ OSX まで​サポートするのかが​良く​判らなかった​ため、​古い​ OSX でも​動くように、​ deprecated な​ プロパティを​そのまま​使っています。

その​ため、​きちんと​丁寧に​この​辺りを​実装した​パッチを​作成するのならば、​その​辺り、​ OSX の​バージ​ョンを​見て、​処理を​分岐させた方が​良い、と​言えるかと​思います。

あと、​その​他にも​定数​使った方が​良いだとか、​あるいは、​Lion 以降の​ナチュラルスクロールへ​対応とか、​それと、​そも​そも​この​実装、​結構イベント発生させる​辺りが​強引じゃね?​ とか​そういう​問題も​有る​ため、

これを​そのまま​本家に​パッチと​して​投げるのは​ちょっとなー

と​思っている​関係で、​本家と​いうか​開発者の​方に​パッチを​投げるとか、​そういうのは​今の​ところ​僕の​方では​考えていません。

ただ、​この​パッチが​有る​ことに​よって、

mlterm の​ Cocoa 向けビルドへ​マウススクロールを​実装する

と​いう​事への​叩き台には​なるかなぁと​思うし、​あと、もし実装への​叩き台に​するのであれば、​ [[Objective-C]] とか​サッパリな​自分が​権利​持ってても​仕方が​ないし、と​考えているので、​この​パッチに​ついては、

と​いう​扱いで​お願いします。

と​いう​事で​以上です。

まあ、

最強の​端末環境

は、​まだ出来上ってなかったりしますが、​とりあえず、​その​過程で​出来た​成果物を​公開した、と​いう​お話しでした。​と​いう​事で​以上です。​終わります。​はい。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。