September 28, 2007
[PC環境改善] cygterm で端末エミュレータのウィンドウ位置を指定
いつも cygterm から PuTTY 0.58 (蛭子屋さんのごった煮版) を使っていますが,PuTTY は起動時のウィンドウ位置を指定できません.
PuTTY の要望にもあるみたいですが,実装しないようです (「ウィンドウ位置の設定は PuTTY でやるより,ウィンドウシステムあるいは外部ツールに任せた方がいい」という意見です.ごもっとも).
しかしながら,(私のワガママですが)他アプリのウィンドウ位置は特にどうでもよくて,PuTTY のためだけに外部ツールを入れるのも何か負けた気分になるので,PuTTY を起動する cygterm を改造して,指定した位置に PuTTY のウィンドウを配置させることにしました.
改造対象は cygterm 1.07 です.
- パッチ本体 (cygterm107-window-position.patch, unified-diff 形式, 3,164 bytes)
- パッチ適用済み実行ファイル (cygterm-107-r1.exe, 13,312 bytes, ウィルスチェック済み, sha1sum 6a3406b81721a9aeec794909cd4f82a764da460c)
以下のように,cygterm.cfg に X_POS と Y_POS を指定することでウィンドウ位置を指定します.
TERM = path\to\putty.exe -telnet %s -P %d TERM_TYPE = xterm PORT_START = 20000 PORT_RANGE = 40 SHELL = /bin/zsh --login X_POS = 0 Y_POS = 326
で,以下技術的な話.
CreateProcess() に渡す STARTUPINFO
構造体の dwFlags
に STARTF_USEPOSITION
を設定し,dwX
, dwY
メンバにウィンドウ位置を入れて起動することで,大抵のアプリケーションの位置は指定できます.ただ,この情報を元にウィンドウ作成時の位置を指定するのはアプリ側の実装次第で,PuTTY は残念ながら STARTUPINFO
による指定ができませんでした.
ですので,今回の改造では,CreateProcess()
後,WaitForInputIdle()
で待機してから,EnumWindows()
と GetThreadProcessId()
でウィンドウを探し出し,SetWindowPos()
するようにしています.