Pebble's Diary

プログラマーの作業メモ

gitkを改良してWindow位置を復元する

私の開発環境の一つはMacBookProと27Inch Thunderbolt Displayを使ったデュアルディスプレイ環境です。
頻繁に使うコマンドの一つにgitk --allがあるのですが、 このgitkコマンド君、ウィンドウ位置を復元してくれません。 普通に実行すると、MacBookProの本体側のディスプレイにこんな感じに表示されます。

f:id:pebble8888:20131119125014j:plain

そして、Thunderboltディスプレイの方にウィンドウを引っ張っていき閉じます。

f:id:pebble8888:20131119125747j:plain

すると、次にgitk --allした時は元のMacBookPro側のディスプレイに表示されてしまうわけです。
アホすぎます。
使いづらいことこの上ないです。
それならgitkのソースを修正しウィンドウ位置が復元されるように
直してしまえばいいじゃない。
ということで修正しました。

gitのソースはgithubにありますが、フォークしました。
https://github.com/pebble8888/git

まずはgitをビルドしますが、brewでgitをインストールしている場合は、事前にアンインストールしておきます。

$brew uninstall git

ビルドは以下のコマンドで行います。

$make configure
$./configure
$make
$make install

失敗する場合は何かが足りませんので、がんばって足して下さい。(放り投げ)

gitkはtcl/tkというシェルを拡張したようなスクリプト言語でできています。
Mac環境ではwishという別名?が付いたりしているようです。
tcl/tk自体にはトップウィンドウの位置を指定する機能がありますので、
gitkにこの機能を組み込んであげることにします。

     if {[info exists geometry(main)]} {
-       if {[scan $geometry(main) "%dx%d" w h] >= 2} {
+    # restore root window left top position
+    set geometry_ex [regsub -all {\+} $geometry(main) {,}]
+       if {[scan $geometry_ex "%dx%d,%d,%d" w h x y] >= 4} {
            if {$w > [winfo screenwidth .]} {
                set w [winfo screenwidth .]
            }
            if {$h > [winfo screenheight .]} {
                set h [winfo screenheight .]
            }
-           wm geometry . "${w}x$h"
+           wm geometry . "${w}x${h}+${x}+${y}"
        }
     }

gitk-git/gitkファイルの中身を見ると、トップウィンドウのwidthとheight は設定していますが、topとleftを指定していません。
保存はしているようだったので、保存されている値を用いてウィンドウ位置を
指定するように修正してあげます。

修正したらビルドして完了です。
見事に復元されるようになりました。やったー。

この作業後にOSをMavericksにあげたのですが、ディスプレイのミラーリングモード に機能強化が入っており、ミラーリングモードでも、27Inch Thunderbolt Displayの 解像度が指定できるようになっていました。
おおう、これは便利。
これを先にやっていたらgitkの修正はしていなかったかもしれません。
まあ、便利になってはいるのでよしとします。

<tcl/tk参考URL> http://homepage3.nifty.com/kaku-chan/tcl_tk/