comment -*- mode: text; tab-width:2; indent-tabs-mode:nil -*-

WIN32 native GUI 対応に関するメモ

* テスト環境
  MS Windows 10 + MSYS2 3.1.7 or Cygwin 3.4.3
                + libssh2 1.9.0(win32 native)
                + Fribidi 0.19.2(win32 native)

* ビルド
  (PKG_CONFIG=i686-w64-mingw32-pkg-config CC=i686-pc-mingw32-gcc) ./configure \
      (--enable-ssh2) (--with-gui=win32) (--config-cache) (--prefix=) \
      (--with-libintl-prefix=[GTK+(win32) installed directory]) \
      (--with-libiconv-prefix=[GTK+(win32) installed directory])
  make
  (DESTDIR=/foo/bar) make install

  もし、make install が失敗する場合は、インストールしたいディレクトリに、
  baselib/src/.libs/*.dll
  encodefilter/src/.libs/*.dll
  encodefilter/module/.libs/*.dll
  vtemu/.libs/*.dll
  vtemu/libctl/.libs/*.dll
  main/.libs/mlterm.exe
  scrollbar/sample/.libs/*.dll
  inputmethod/kbd/.libs/*.dll
  libind/.libs/*.dll
  tool/mlimgloader/.libs/mlimgloader.exe
  をコピーしてください。

* configure オプション
  --with-gui=(xlib|win32)
  GUI ライブラリとして xlib の API を使用するか win32 の API を使用
  するかを指定します。
  このオプションが指定されない場合、MSYS 環境では win32 と判断し、
  CYGWIN 環境では X がインストールされていれば xlib と、X がインス
  トールされていなければ win32 と判断します。

* インストール
  o MinGW or Cygwin(gcc -mno-cygwin, i686-pc-mingw32-gcc など) で --enable-ssh2
    なしでビルドした場合は、win32/plink/plink.exe もコピーしてください。
    libssh2 を使用しない場合、リモートホストへの接続には plink.exe を使用します。
  o MSYS-DTK or MSYS2 or Cygwin でビルドした場合は、ソースツリーの
    contrib/tool/mlcc/mlcc.exe, tool/mlclient/mlclient.exe もコピーしてください。
  o mlconfig,mlterm-menu をビルドできた場合(あらかじめ GTK+ >= 2.0 をインストー
    ルしておく必要があります)は、ソースツリーの
    tool/mlconfig/.libs/mlconfig.exe
    contrib/tool/mlterm-menu/.libs/mlterm-menu.exe
    もコピーしてください。

* 環境設定
  (MSYS-DTK or MSYS2 or Cygwin でビルドした場合)
  SYSCONFDIR/mlterm 及び各ユーザごとの $HOME/.mlterm/ 以下に設定ファイル
  (ソースツリーの etc/ 以下のファイル)を配置することにより環境設定を行うことが
  できます。

  (MinGW or Cygwin(gcc -mno-cygwin, i686-pc-mingw32-gcc など) でビルドした場合)
  [mlterm がインストールされたディレクトリ]\mlterm\ 及び各ユーザごとの
  %HOMEPATH%\mlterm\ (%HOMEPATH% が存在しないディレクトリの場合は %HOME%\.mlterm\)
  以下の設定ファイル(ソースツリーの etc/ 以下のファイル) を配置することにより
  環境設定を行うことができます。

  (フォント指定)
  font,vfont,tfont は、次のフォーマットとなります。
  [font family]( Bold Italic [font size]:[percentage])
  ※ [font family]の文字列に'-'が含まれる場合、aafontの形式と異なり、'\'でエスケ
    ープする必要はありません。
  ※ aafont,vaafont,taafont は使用しません。

  (エンコーディング)
  -E/--km/encoding オプションで AUTO を指定又は同オプションを指定しなかっ
  た場合におけるエンコーディングは、MSYS-DTK or MSYS2 or Cygwin でビルドした場合
  は UTF-8、MinGW or Cygwin(gcc -mno-cygwin, i686-pc-mingw32-gcc など) でビルド
  した場合には Windows の CodePageに対応したエンコーディングとなります。

* 起動方法
  コマンドプロンプト等から次のとおり起動
  (又は win32/mlterm-{win32|msys_cygwin}.bat のようなバッチファイルを用意)
  
  (MSYS-DTK or MSYS2 or Cygwin でビルドした場合)
  set HOME=c:\msys\...\home\...
  set CYGWIN=tty
  mlterm.exe (options...) -e /bin/sh --login -i

  (MinGW or Cygwin(gcc -mno-cygwin, i686-pc-mingw32-gcc など) でビルドした場合)
  set HOMEPATH=...
  mlterm.exe (options...) (-e plink.exe [-telnet/-ssh/-rlogin/-raw] [host])
  ※ -e オプションを指定しない場合、起動時に、接続するサーバ、プロトコル、
     ユーザ名、パスワード、エンコーディングを入力するダイアログが表示され
     ます。なお、このとき、パスワードを入力しなければ、Authentication Agent に
     よる認証を試みます。
     また、main 設定ファイルにおいて、あらかじめ次のオプションを指定することも
     できます(括弧書きは mlterm の起動時の引数として指定する場合
     のオプション名)。
     o default_server(--serv) = (<protocol>://)(<user>@)<server>(:<port>)(:<encoding>)
       ダイアログの既定値として表示するユーザ名、プロトコル及びサーバを
       指定します(ユーザ名又はプロトコルを省略した場合は、ユーザ名は環境変数
       USERNAME の値、プロトコルは SSH となります。)。
     o MinGW でビルドした場合は --serv オプションを指定せずに起動することで、
       Cygwin 又は MSYS でビルドした場合は --serv=? オプションを指定することで、
       接続先サーバの一覧の管理画面 (tool/servman) が開きます。
     o always_show_dialog(--dialog) = true/false
       既に確立された SSH セッションがあり、そのセッション上に新しいチャンネルを
       開くことができる場合でも、必ず接続先のサーバを指定するためのダイアログを
       表示します。

* WIN32 GUI 版の制限
  o -I/--icon, --iconpath, -Y/--decsp, -&/--borderless, -d/--display 及び
    -t/--transbgオプションは使用できません。
  o mlterm server 機能で genuine モードは使用できません(対応予定もありません。)。
    MinGW 版では、mlterm server 機能自体が使用できません(対応予定もありません。)。
    代わりに、"\x1b]5379;mlclient <prefix opitions> <options>\x07" sequence
    (see doc/en/PROTOCOL) が使用できます(mlclient 又は mlclientx コマンドも、
    同 sequence に対応しています。)。
  o -X/--alpha オプションで透過率を指定した場合、win32 のレイヤードウィンドウの
    機能を使ってウィンドウを半透明にします。
  o Bold な文字は、設定ファイルで使用するフォントを指定しない限り、基本的には、
    重ね打ちによる擬似的な bold 表示を行います(Bold と Normal でフォント幅が異
    なる場合があるため)
  o スクロールバーは、"simple" 又は "sample" のみ使用できます。
  o MinGW では、~/.mlterm/key の OPERATION の "exesel:..." では、mlclient 以外を
    実行することはできません。
  o utmp は常に無効となります。

* ソースコード
  o USE_WIN32APIマクロ: MinGW 又は CYGWIN(gcc -mno-cygwin, i686-pc-mingw32-gcc
                        など) でビルドする際に define されます。
  o USE_WIN32GUIマクロ: --with-gui=win32 の場合 define されます。
  o ファイル名 *_win32.c: --with-gui=win32 の場合に compile されます。

* 留意事項
  o MSYS-DTK 1.0.1 に含まれる winuser.h / libuser32.a は古いため、
    背景透過に使用する SetLayeredWindowAttributes() が使用できません。
    背景透過を使用できるようにするためには、mlterm のビルドの前に
    MSYS-DTK 1.0.1 の winuser.h / libuser32.a を 最新の MinGW の
    ものに置きかえておく必要があります。

  o MinGW / Gtk+(win32 native) でビルドした mlconfig.exe 及び
    mlterm-menu.exe は、MSYS や Cygwin でビルドした mlterm と
    一緒に使用することができます。

  o mlterm-menu は、MinGW でビルドする場合には win32 native の GTK+ と、
    Cygwin でビルドする場合には Cygwin 用の GTK+ とリンクしないと、設定ファイ
    ル(menu)の読み込みができず正常に動作しません。

  o MSYS でビルドした mlterm は、CYGWIN=tty 環境変数をセットした上で、
    実行してください。そうしないと、mlterm 上で Windows native のコン
    ソールアプリケーション(MinGW の gcc 等)を実行した場合に、console
    が継承されず、新しい console window が表示されてしまう問題が生じ
    ることがあります。

  o DEC SPECIAL 文字を表示するには、Tera Term (https://ja.osdn.net/projects/ttssh2/)
    に含まれている "Tera Special" フォント (TSPECIAL1.TTF) をインストールする
    必要があります。

  o Cygwin/X 1.17 以降では、デフォルトでは、X サーバが 127.0.0.1:6000 での接続を
    待ち受けなくなりました。MinGW でビルドした mlterm が X サーバに接続し x11
    forwarding を行えるようにするためには、X サーバを次のとおり起動する必要があ
    ります。
    $ startxwin -- :0 -listen tcp &

* 実行可能バイナリの入手
  http://mlterm.sourceforge.net/bin.html から cygwin/msys 用の実行可能バイナリ
  を入手することができます(不定期更新)。
