diff --git a/doc/en/html/about/history.html b/doc/en/html/about/history.html index a68e29f9d..3b2998ae7 100644 --- a/doc/en/html/about/history.html +++ b/doc/en/html/about/history.html @@ -55,6 +55,8 @@

YYYY.MM.DD (Ver 5.4 not released yet)

  • All available character codes can be specified using command line options.
  • Supports "COM%d" style serial ports of com0com (virtual serial port driver), which are not Ports class.
  • +
  • Changed initial directory for file select dialog of send file to File transfer folder.
  • +
  • SendFile options are saved in TERATERM.INI.
  • @@ -70,6 +72,7 @@

    YYYY.MM.DD (Ver 5.4 not released yet)

  • Fixed to handle U+20000 to U+3FFFF of UTF-8.
  • Fixed display characters containing surrogate pair character when "Drawing resized font to fit cell width"
  • MACRO: Fixed getenv, expandenv and setenv macro commands were not Unicode-compatible.
  • +
  • Fixed B-plus send is not working
  • @@ -101,7 +104,7 @@

    2024.09.08 (Ver 5.3)

  • General setup dialog is now shown the information from Language file which is selected.
  • "Default port" settings is moved to General tab of Additional settings dialog from General setup dialog.
  • Removed Language setting from General setup dialog.
  • -
  • Download folder setting is moved to General tab of Additional settings dialog.
  • +
  • Download folder setting is moved to General tab of Additional settings dialog.
  • Added ViewlogEditor argument on Log Tab in Additional settings dialog.
  • Setup - Font was integrated into Font tab of Additional settings dialog.
  • Keyboard setup dialog is moved to Keyboard tab of Additional settings dialog.
  • @@ -152,7 +155,7 @@

    2024.09.08 (Ver 5.3)

  • Apply changes even if only No Frame is changed at Window setup dialog.
  • Fixed the issue where specifying the /V option with ttermpro.exe would cause a crash upon exit.
  • Fixed window maximization works immediately after startup.
  • -
  • Added download folder for log saving folder same as Tera Term 4.
  • +
  • Added download folder for log saving folder same as Tera Term 4.
  • MACRO: Fixed send macro command could not send $00.
  • MACRO: Fixed clipb2var macro command is not working.
  • MACRO: Fixed path of basename and dirname macro commands were not Unicode-compatible.
  • diff --git a/doc/en/html/macro/command/changedir.html b/doc/en/html/macro/command/changedir.html index 21a482d87..d89bcd989 100644 --- a/doc/en/html/macro/command/changedir.html +++ b/doc/en/html/macro/command/changedir.html @@ -14,7 +14,7 @@

    changedir

    -Changes the Download directory. +Changes the File transfer directory.

    @@ -24,19 +24,25 @@ 

    changedir

    Remarks

    -Changes the Download directory for Tera Term to <path>. +Changes the File transfer directory for Tera Term to <path>.

    -File names specified for the communication commands (e.g. kmtsend) are based on the current directory for Tera Term. +File name specified for the send communication commands (e.g. sendfile, kmtsend) and destination folder for receive commands (e.g. zmodemrecv) are based on the "File transfer directory for Tera Term."

    -You must specify a fullpath name to the communication commands (e.g. sendfile, kmtsend) because these commands are not affected by `changedir' command. +You must specify a fullpath name to the communication commands because these commands are not affected by `changedir' command.

    +

    Note

    + +

    +The changedir command changes "File transfer directory for Tera Term."
    +The setdir command changes "current working directory for MACRO."
    +

    -The download folder also affects log storage. +The File transfer folder also affects log save location. Reffer to Folder to put setup files.

    diff --git a/doc/en/html/macro/command/setdir.html b/doc/en/html/macro/command/setdir.html index b2e4e98e9..d60a5706e 100644 --- a/doc/en/html/macro/command/setdir.html +++ b/doc/en/html/macro/command/setdir.html @@ -28,7 +28,14 @@

    Remarks

    -File names specified for other commands (e.g. fileopen) are based on the current directory for MACRO. +File names specified for other commands (e.g. fileopen) are based on the "current working directory for MACRO." +

    + +

    Note

    + +

    +The setdir command changes "current working directory for MACRO."
    +The changedir command changes "File transfer directory for Tera Term."

    Example

    @@ -39,6 +46,7 @@

    Example

    See also

    diff --git a/doc/en/html/menu/file-chdir.html b/doc/en/html/menu/file-chdir.html index cb2e5a2cd..b149d1e5f 100644 --- a/doc/en/html/menu/file-chdir.html +++ b/doc/en/html/menu/file-chdir.html @@ -11,7 +11,7 @@

    Change directory ([File] menu)

    - Open General tab of Additional settings dialog. + Open General tab of Additional settings dialog.

    diff --git a/doc/en/html/menu/file-sendfile.html b/doc/en/html/menu/file-sendfile.html index 519006051..ae2590668 100644 --- a/doc/en/html/menu/file-sendfile.html +++ b/doc/en/html/menu/file-sendfile.html @@ -22,7 +22,7 @@

    "Send file" dialog box (to input the file name)

    By dropping a file into dialog, You can also enter file name. -
    Send in same way as Tera Term 4
    +
    Send in same way as Tera Term 4
    Checked(same way as Tera Term 4)
    @@ -38,14 +38,14 @@

    "Send file" dialog box (to input the file name)

    -
    Binary
    +
    Binary
    If you select this option, received characters are sent without any modifications. Otherwise, new-line codes are converted and control characters (except TAB, LF and CR) are stripped out.
    -
    delay type
    +
    delay type
    no delay
    @@ -71,17 +71,25 @@

    "Send file" dialog box (to input the file name)

    -
    send size
    +
    send size
    Send size (valid when delay type is "per sendsize")
    -
    delay time(ms)
    +
    delay time(ms)
    Delay time (valid when delay type is not "no delay")
    +

    Special options in the Tera Term setup file

    + See also the following settings + + +

    Send size

    diff --git a/doc/en/html/menu/file-transfer-kermit-get.html b/doc/en/html/menu/file-transfer-kermit-get.html index 1c464c014..0d85e52ac 100644 --- a/doc/en/html/menu/file-transfer-kermit-get.html +++ b/doc/en/html/menu/file-transfer-kermit-get.html @@ -16,8 +16,8 @@

    Kermit Get ([File] Transfer menu)

    "Kermit Get" dialog box

    - Enter the file name to be received. The received file is stored - in the current directory. + Enter the file name to be received.
    + The received file is stored in the File transfer foler.

    diff --git a/doc/en/html/menu/setup-additional-general.html b/doc/en/html/menu/setup-additional-general.html index 2d972769a..9485fb1f2 100644 --- a/doc/en/html/menu/setup-additional-general.html +++ b/doc/en/html/menu/setup-additional-general.html @@ -121,13 +121,13 @@

    Additional settings / "General" Tab ([Setup] Menu)

    -
    Download Folder
    +
    File transfer folder
    - Sets directory for file transfer.
    + Sets directory for file transfer (send and receive).
    Environment variables (ex "%USERPROFILE%\Downloads") are expanded when included.
    - If not set, default download folder is used.
    + If not set, Download folder of Windows is used.
    The current folder can be check in Setup Directory.
    - This can be change with changedir macro command. + From MACRO, this can be change with changedir macro command.
    diff --git a/doc/en/html/setup/folder.html b/doc/en/html/setup/folder.html index 351e6080d..45a5c4b33 100644 --- a/doc/en/html/setup/folder.html +++ b/doc/en/html/setup/folder.html @@ -28,16 +28,16 @@

    Folders used by Tera Term

  • %LOCALAPPDATA%\teraterm5
  • -
  • download folder(Priority order, below is used when not set) +
  • File transfer (Priority order, below is used when not set)
      -
    1. download folder
    2. +
    3. File transfer folder
    4. %USERPROFILE%\Downloads
  • Terminal log folder(Priority order, below is used when not set)
    1. Default log save folder
    2. -
    3. download folder
    4. +
    5. File transfer folder
    6. %LOCALAPPDATA%\teraterm5
  • @@ -56,16 +56,16 @@

    Folders used by Tera Term

  • a folder which is exist exe file + \log
  • -
  • download folder(Priority order, below is used when not set) +
  • File transfer (Priority order, below is used when not set)
      -
    1. download folder
    2. +
    3. File transfer folder
    4. %USERPROFILE%\Downloads
  • Terminal log folder(Priority order, below is used when not set)
    1. Default log save folder
    2. -
    3. download folder
    4. +
    5. File transfer folder
    6. a folder which is exist exe file + \log
  • diff --git a/doc/en/html/setup/teraterm-ini.html b/doc/en/html/setup/teraterm-ini.html index d23b5acf3..40a72b179 100644 --- a/doc/en/html/setup/teraterm-ini.html +++ b/doc/en/html/setup/teraterm-ini.html @@ -1069,6 +1069,36 @@

    Tera Term

    <- + + SendfileDelayTick + 0 + <- + + + + SendfileDelayType + NoDelay + <- + + + + SendfileMethod4 + off + <- + + + + SendfileSize + 4096 + <- + + + + SendfileSkipOptionDialog + off + <- + + ScpSendDir @@ -1298,7 +1328,7 @@

    Tera Term

    - TransBin + TransBin off <- diff --git a/doc/en/html/setup/teraterm-trans.html b/doc/en/html/setup/teraterm-trans.html index a3f556748..11594fee1 100644 --- a/doc/en/html/setup/teraterm-trans.html +++ b/doc/en/html/setup/teraterm-trans.html @@ -483,5 +483,24 @@

    High Speed File Transfer on Serial Connection

    +

    Skip Send file dialog

    + +

    +When [File]-[Send file...] is selected, Send file dialog box appears.
    +If same options are always used, you can send files only by file selection. +

    + +
    +SendfileSkipOptionDialog=on
    +
    + +
    +default:
    +SendfileSkipOptionDialog=off
    +
    + +When [File]-[Send file...] is selected with holding down CTRL key, +You can temporarily switch on/off behavior. + diff --git a/doc/en/html/setup/teraterm.html b/doc/en/html/setup/teraterm.html index 17dbb66e4..3ec6cbdaf 100644 --- a/doc/en/html/setup/teraterm.html +++ b/doc/en/html/setup/teraterm.html @@ -116,6 +116,7 @@

    File transfer

  • Confirmation of File Transfer by Drag & Drop
  • File Transfer Dialog is hidden
  • High Speed File Transfer on Serial Connection
  • +
  • Skip Send file dialog
  • Printing

    diff --git a/doc/ja/html/about/history.html b/doc/ja/html/about/history.html index 8d2307dde..bf7b64a20 100644 --- a/doc/ja/html/about/history.html +++ b/doc/ja/html/about/history.html @@ -55,6 +55,8 @@

    YYYY.MM.DD (Ver 5.4 not released yet)

  • コマンドラインオプションで使用可能文字コードを全て指定できるようにした。
  • com0com(virtual serial port driver) の Ports class ではない "COM%d" 形式のシリアルポートを選択できるようにした。
  • +
  • 送信ファイルを選択するダイアログの初期ディレクトリがファイル転送用のフォルダになるようにした。
  • +
  • ファイル送信オプションをTERATERM.INIに保存するようにした。
  • @@ -70,6 +72,7 @@

    YYYY.MM.DD (Ver 5.4 not released yet)

  • UTF-8 の U+20000 から U+3FFFF を正しく扱うよう修正した。
  • "Drawing resized font to fit cell width" が on のとき、サロゲートペアの文字が存在したとき正しく表示するよう修正した。
  • MACRO: getenv, expandenv, setenv マクロコマンド が Unicode に対応していなかったので修正した。
  • +
  • B-Plusの送信ができなくなっていたので修正した。
  • @@ -101,7 +104,7 @@

    2024.09.08 (Ver 5.3)

  • General setup ダイアログで、選択されている 言語ファイルの情報を表示するようにした。
  • General setup ダイアログの Language 設定を削除した。
  • "Default port" 設定を General setup ダイアログから Additional settings の General タブへ移動した。
  • -
  • ダウンロードフォルダの設定を Additional settings の General タブへ移動した。
  • +
  • ダウンロードフォルダの設定を Additional settings の General タブへ移動した。
  • ViewlogEditor の引数を Additional settings の Log タブに追加した。
  • Setup-Font 設定を Additional settings の Font タブへ統合した。
  • Keyboard setup ダイアログを Additional settings の Keyboard タブへ移動した。
  • diff --git a/doc/ja/html/macro/command/changedir.html b/doc/ja/html/macro/command/changedir.html index 827363783..9efcaa685 100644 --- a/doc/ja/html/macro/command/changedir.html +++ b/doc/ja/html/macro/command/changedir.html @@ -14,7 +14,7 @@

    changedir

    -Tera Term のダウンロードディレクトリを変更する。 +Tera Term のファイル転送用ディレクトリを変更する。

    @@ -24,19 +24,25 @@ 

    changedir

    解説

    -Tera Term のダウンロードディレクトリを <path> に変更する。 +Tera Term のファイル転送用ディレクトリを <path> に変更する。

    -通信コマンド(kmtsend 等)で指定されるファイル名は Tera Term の現在のディレクトリを基準にする。 +通信コマンドの送信時(sendfile, kmtsend 等)に指定されるファイル名、受信コマンド(zmodemrecv 等)のファイル保存先は "Tera Term のファイル転送用ディレクトリ" を基準にする。

    -通信コマンド(sendfile, kmtsend等)に指定されるファイル名は、changedirコマンドの影響を受けないため、絶対パスである必要がある。 +通信コマンドに指定されるファイル名は、changedirコマンドの影響を受けないため、絶対パスである必要がある。

    +

    注意

    + +

    +changedir コマンドは "Tera Term のファイル転送用ディレクトリ" を変更する。
    +setdir コマンドは "MACRO のカレントディレクトリ" を変更する。
    +

    -ダウンロードフォルダはログの保存にも影響します。 +ファイル転送用フォルダはログの保存先にも影響します。 Tera Term が使用するフォルダを参照ください。

    diff --git a/doc/ja/html/macro/command/getdir.html b/doc/ja/html/macro/command/getdir.html index f98e08f1d..544701ecc 100644 --- a/doc/ja/html/macro/command/getdir.html +++ b/doc/ja/html/macro/command/getdir.html @@ -14,7 +14,7 @@

    getdir

    -MACRO の現在のディレクトリを得る。 +MACRO のカレントディレクトリを得る。

    @@ -24,7 +24,7 @@ 

    getdir

    解説

    -(Tera Term ではなく) MACRO の現在のディレクトリを文字列変数 <strvar> に格納する。
    +(Tera Term ではなく) "MACRO のカレントディレクトリ" を文字列変数 <strvar> に格納する。
    ルートディレクトリの場合、文字列の末尾には円記号 (\) が付く。ルート以外のディレクトリの場合、文字列はディレクトリ名で終わり、末尾に円記号は付かない。

    diff --git a/doc/ja/html/macro/command/setdir.html b/doc/ja/html/macro/command/setdir.html index 27449d5b6..bff3b2990 100644 --- a/doc/ja/html/macro/command/setdir.html +++ b/doc/ja/html/macro/command/setdir.html @@ -14,7 +14,7 @@

    setdir

    -MACRO の現在のディレクトリを変更する。 +MACRO のカレントディレクトリを変更する。

    @@ -24,11 +24,18 @@ 

    setdir

    解説

    -MACRO の現在のディレクトリを <dir> に変更する。 +MACRO のカレントディレクトリを <dir> に変更する。

    -ファイル操作コマンド(fileopen 等)で指定されるファイル名はMACRO の現在のディレクトリを基準にする。 +ファイル操作コマンド(fileopen 等)で指定されるファイル名は "MACRO のカレントディレクトリ" を基準にする。 +

    + +

    注意

    + +

    +setdir コマンドは "MACRO のカレントディレクトリ" を変更する。
    +changedir コマンドは "Tera Term のファイル転送用ディレクトリ" を変更する。

    @@ -39,6 +46,7 @@

    setdir

    参照

    diff --git a/doc/ja/html/menu/file-chdir.html b/doc/ja/html/menu/file-chdir.html index 12740b7e2..11fd92c3a 100644 --- a/doc/ja/html/menu/file-chdir.html +++ b/doc/ja/html/menu/file-chdir.html @@ -11,7 +11,7 @@

    Change directory ([File] メニュー)

    - Additional settings の General タブが開きます。 + Additional settings の General タブが開きます。

    diff --git a/doc/ja/html/menu/file-sendfile.html b/doc/ja/html/menu/file-sendfile.html index 436d7e4d5..0b8418c6d 100644 --- a/doc/ja/html/menu/file-sendfile.html +++ b/doc/ja/html/menu/file-sendfile.html @@ -22,7 +22,7 @@ ダイアログにファイルをドロップすることでファイル名を入力することもできます。 -
    Tera Term 4 と同じ方法で送信
    +
    Tera Term 4 と同じ方法で送信
    チェックを入れたとき(Tera Term 4 と同じ方法)
    @@ -38,14 +38,14 @@
    -
    Binary
    +
    Binary
    ファイルの内容をそのまま送信したい場合は選択してください。 選択しない場合は、漢字コード、改行文字が変換されて送信され、 TAB ($09), LF ($0A), CR ($0D)以外の制御文字は送信されません。
    -
    delay type
    +
    delay type
    no delay
    @@ -71,17 +71,25 @@
    -
    send size
    +
    send size
    送信サイズ(delay typeが "per sendsize"のとき有効)
    -
    delay time(ms)
    +
    delay time(ms)
    ディレイ時間(delay typeが "no delay"以外のとき有効)
    +

    設定ファイルの特別オプション

    + 次の設定も参照ください + + +

    送信サイズ

    diff --git a/doc/ja/html/menu/file-transfer-kermit-get.html b/doc/ja/html/menu/file-transfer-kermit-get.html index 4c43c1ca1..278ed362f 100644 --- a/doc/ja/html/menu/file-transfer-kermit-get.html +++ b/doc/ja/html/menu/file-transfer-kermit-get.html @@ -17,8 +17,8 @@

    "Kermit Get" ダイアログボックス

    - 受信したいホスト側のファイルのファイル名を入力してください。 - 受信したファイルは、現在のディレクトリの中に、 + 受信したいホスト側のファイルのファイル名を入力してください。
    + 受信したファイルは、ファイル転送用フォルダの中に、 ホスト側と同じファイル名で保存されます。

    diff --git a/doc/ja/html/menu/setup-additional-general.html b/doc/ja/html/menu/setup-additional-general.html index e708f471a..c0c4b3a55 100644 --- a/doc/ja/html/menu/setup-additional-general.html +++ b/doc/ja/html/menu/setup-additional-general.html @@ -119,13 +119,13 @@ -
    Download Folder
    +
    File transfer folder
    - ファイル転送のためのディレクトリを設定します。
    + ファイル転送(送信・受信)のためのディレクトリを設定します。
    環境変数(ex "%USERPROFILE%\Downloads")が含まれていれば展開されます。
    - 未設定の場合はデフォルトのダウンロードフォルダが使用されます。
    + 未設定の場合は Windows のダウンロードフォルダが使用されます
    現在の設定は Setup directory で確認できます。
    - changedir マクロコマンド で設定できます。 + マクロからは changedir マクロコマンド で設定できます。
    diff --git a/doc/ja/html/setup/folder.html b/doc/ja/html/setup/folder.html index 13487a75f..eea9978b1 100644 --- a/doc/ja/html/setup/folder.html +++ b/doc/ja/html/setup/folder.html @@ -28,16 +28,16 @@
  • %LOCALAPPDATA%\teraterm5
  • -
  • ダウンロードフォルダ(優先順,未設定の時一つ下が使用される) +
  • ファイル転送(優先順,未設定の時一つ下が使用される)
      -
    1. ダウンロードフォルダ
    2. +
    3. ファイル転送用フォルダ
    4. %USERPROFILE%\Downloads
  • 端末ログ(優先順,未設定の時一つ下が使用される)
    1. 標準ログ保存先フォルダ
    2. -
    3. ダウンロードフォルダ
    4. +
    5. ファイル転送用フォルダ
    6. %LOCALAPPDATA%\teraterm5
  • @@ -56,16 +56,16 @@
  • exeファイルのあるフォルダ + \log
  • -
  • ダウンロードフォルダ(優先順,未設定の時一つ下が使用される) +
  • ファイル転送(優先順,未設定の時一つ下が使用される)
      -
    1. ダウンロードフォルダ
    2. +
    3. ファイル転送用フォルダ
    4. %USERPROFILE%\Downloads
  • 端末ログ(優先順,未設定の時一つ下が使用される)
    1. 標準ログ保存先フォルダ
    2. -
    3. ダウンロードフォルダ
    4. +
    5. ファイル転送用フォルダ
    6. exeファイルのあるフォルダ + \log
  • diff --git a/doc/ja/html/setup/teraterm-ini.html b/doc/ja/html/setup/teraterm-ini.html index 7789e8771..ab8771158 100644 --- a/doc/ja/html/setup/teraterm-ini.html +++ b/doc/ja/html/setup/teraterm-ini.html @@ -1069,6 +1069,36 @@

    Tera Term

    <- + + SendfileDelayTick + 0 + <- + + + + SendfileDelayType + NoDelay + <- + + + + SendfileMethod4 + off + <- + + + + SendfileSize + 4096 + <- + + + + SendfileSkipOptionDialog + off + <- + + ScpSendDir @@ -1298,7 +1328,7 @@

    Tera Term

    - TransBin + TransBin off <- diff --git a/doc/ja/html/setup/teraterm-trans.html b/doc/ja/html/setup/teraterm-trans.html index 50aaf8ba5..b5240d116 100644 --- a/doc/ja/html/setup/teraterm-trans.html +++ b/doc/ja/html/setup/teraterm-trans.html @@ -523,5 +523,25 @@
    +

    ファイル送信ダイアログをスキップする

    + +

    +([File]-[Send file...])選択時、ファイル送信ダイアログが表示されます。
    +いつも同じ設定を使用する場合は、次のように設定することでファイル選択のみでファイルを送信できます。 +

    + +
    +SendfileSkipOptionDialog=on
    +
    + +
    +省略時:
    +SendfileSkipOptionDialog=off
    +
    + +CTRLキーを押しながら[File]-[Send file...]を選択することで、 +この設定のon/offを入れ替えた動作を行うことができます。 + + diff --git a/doc/ja/html/setup/teraterm.html b/doc/ja/html/setup/teraterm.html index 41f63df36..838c84ffc 100644 --- a/doc/ja/html/setup/teraterm.html +++ b/doc/ja/html/setup/teraterm.html @@ -120,6 +120,7 @@
  • ドラッグ&ドロップによるファイル送信の確認
  • ファイル送信時の転送状況ダイアログを表示しない
  • シリアル接続における高速なファイル転送
  • +
  • ファイル送信ダイアログをスキップする
  • 印刷

    diff --git a/installer/release/TERATERM.INI b/installer/release/TERATERM.INI index babc7d445..fc36e85e5 100644 --- a/installer/release/TERATERM.INI +++ b/installer/release/TERATERM.INI @@ -395,6 +395,15 @@ AcceptBroadcast=on ; Number of broadcast command history MaxBroadcatHistory=99 +; Sendfile DelayType NoDelay/PerChar/PerLine/PerSendSize +SendfileDelayType=NoDelay +; Sendfile Delay (ms) +SendfileDelayTick=0 +; Sendfile size when PerSendSize +SendfileSize=4096 +; Sendfile use Tera Term 4 Method +SendfileMethod4=off + ;------ special options (see Tera Term help) ; C1 (8-bit) control characters @@ -793,6 +802,9 @@ IniAutoBackup=on ; Wait time (ms) when Beep is Visual Bell BeepVBellWait=10 +; skip SendFile dialog +SendfileSkipOptionDialog=off + ;------ end of special options ; Unicode diff --git a/teraterm/common/i18n.h b/teraterm/common/i18n.h index 6f5048803..cc3facf0f 100644 --- a/teraterm/common/i18n.h +++ b/teraterm/common/i18n.h @@ -49,6 +49,7 @@ typedef struct { typedef struct { const char *key; // NULLの場合は常にdefault_text が使用される const wchar_t *default_text; // key == NULL && default_text == NULLの場合終端 + uintptr_t data; } I18nTextInfo; DllExport size_t WINAPI GetI18nStrW(const char *section, const char *key, wchar_t *buf, int buf_len, const wchar_t *def, const char *iniFile); @@ -76,7 +77,7 @@ void SetI18nMenuStrsW(HMENU hMenu, const char *section, const DlgTextInfo *infos void SetI18nMenuStrsA(HMENU hMenu, const char *section, const DlgTextInfo *infos, size_t infoCount, const char *UILanguageFile); void SetI18nListW(const char *section, HWND hDlg, int nIDDlgItem, const I18nTextInfo *infos, size_t infoCount, - const wchar_t *UILanguageFile, int nsel); + const wchar_t *UILanguageFile, uintptr_t nsel); void SetI18nList(const char *section, HWND hDlg, int nIDDlgItem, const I18nTextInfo *infos, size_t infoCount, const char *UILanguageFile, int nsel); int GetI18nLogfontAW(const char *section, const char *key, PLOGFONTA logfont, int ppi, const wchar_t *iniFile); diff --git a/teraterm/common/i18n_static.c b/teraterm/common/i18n_static.c index d5fbafd77..032a15857 100644 --- a/teraterm/common/i18n_static.c +++ b/teraterm/common/i18n_static.c @@ -121,28 +121,36 @@ void GetI18nStrU8(const char *section, const char *key, char *buf, int buf_len, * @param[in] I18nTextInfo テキスト情報 * @param[in] infoCount テキスト情報数 * @param[in] UILanguageFile lng file - * @param[in] nsel CB_SETCURSEL の引数と同じ - * -1 未選択 - * 0〜 選択項目 + * @param[in] nsel I18nTextInfo の data メンバがセットされていないとき + * CB_SETCURSEL の引数と同じ + * -1 未選択 + * 0〜 選択項目 + * I18nTextInfo の data メンバがセットされているとき + * data の値と同じアイテムが選択される + * 同じ値がないとき、最初の値が選択される */ void SetI18nListW(const char *section, HWND hDlg, int nIDDlgItem, const I18nTextInfo *infos, size_t infoCount, - const wchar_t *UILanguageFile, int nsel) + const wchar_t *UILanguageFile, uintptr_t nsel) { UINT ADDSTRING; UINT SETCURSEL; + UINT SETITEMDATA; size_t i; char ClassName[32]; int r = GetClassNameA(GetDlgItem(hDlg, nIDDlgItem), ClassName, _countof(ClassName)); assert(r != 0); (void)r; + BOOL data_available = TRUE; if (strcmp(ClassName, "ListBox") == 0) { ADDSTRING = LB_ADDSTRING; + SETITEMDATA = LB_SETITEMDATA; SETCURSEL = LB_SETCURSEL; } else { // "ComboBox" ADDSTRING = CB_ADDSTRING; + SETITEMDATA = CB_SETITEMDATA; SETCURSEL = CB_SETCURSEL; } @@ -155,19 +163,39 @@ void SetI18nListW(const char *section, HWND hDlg, int nIDDlgItem, const I18nText infoCount = i; } + // dataに値が入っている? for (i = 0; i < infoCount; i++) { - if (infos->key != NULL) { + if (infos[i].data != 0) { + data_available = TRUE; + } + } + + for (i = 0; i < infoCount; i++) { + LRESULT index; + if (infos[i].key != NULL) { wchar_t *uimsg; - GetI18nStrWW(section, infos->key, infos->default_text, UILanguageFile, &uimsg); - SendDlgItemMessageW(hDlg, nIDDlgItem, ADDSTRING, 0, (LPARAM)uimsg); + GetI18nStrWW(section, infos[i].key, infos[i].default_text, UILanguageFile, &uimsg); + index = SendDlgItemMessageW(hDlg, nIDDlgItem, ADDSTRING, 0, (LPARAM)uimsg); free(uimsg); } else { - SendDlgItemMessageW(hDlg, nIDDlgItem, ADDSTRING, 0, (LPARAM)infos->default_text); + index = SendDlgItemMessageW(hDlg, nIDDlgItem, ADDSTRING, 0, (LPARAM)infos[i].default_text); } - infos++; + SendDlgItemMessageA(hDlg, nIDDlgItem, SETITEMDATA, index, infos[i].data); } - SendDlgItemMessageA(hDlg, nIDDlgItem, SETCURSEL, nsel, 0); + + if (data_available) { + uintptr_t sel = 0; + for (i = 0; i < infoCount; i++) { + if (infos[i].data == nsel) { + sel = i; + break; + } + } + nsel = sel; + } + + SendDlgItemMessageA(hDlg, nIDDlgItem, SETCURSEL, (WPARAM)nsel, 0); } void SetI18nList(const char *section, HWND hDlg, int nIDDlgItem, const I18nTextInfo *infos, size_t infoCount, diff --git a/teraterm/common/tt_res.h b/teraterm/common/tt_res.h index 2092951f9..a9dedfd53 100644 --- a/teraterm/common/tt_res.h +++ b/teraterm/common/tt_res.h @@ -248,9 +248,9 @@ #define IDC_BROADCAST_HELP 2624 #define IDC_GENPORT 2625 #define IDC_GENPORT_LABEL 2626 -#define IDC_DOWNLOAD_DIR_TITLE 2627 -#define IDC_DOWNLOAD_DIR 2628 -#define IDC_DOWNLOAD_DIR_SELECT 2629 +#define IDC_FILE_DIR_TITLE 2627 +#define IDC_FILE_DIR 2628 +#define IDC_FILE_DIR_SELECT 2629 #define IDC_GENUILANG 2630 #define IDC_GENUILANG_LABEL 2631 #define ID_ACC_SENDBREAK 50001 diff --git a/teraterm/common/ttlib_static_cpp.cpp b/teraterm/common/ttlib_static_cpp.cpp index c88acc607..2d75acdab 100644 --- a/teraterm/common/ttlib_static_cpp.cpp +++ b/teraterm/common/ttlib_static_cpp.cpp @@ -1303,12 +1303,12 @@ BOOL IsRelativePathW(const wchar_t *path) return TRUE; } -BOOL IsRelativePathA(const char *path) +BOOL IsRelativePathA(const char *pathA) { - if (path[0] == '\\' || path[0] == '/' || (path[0] != '\0' && path[1] == ':')) { - return FALSE; - } - return TRUE; + wchar_t *pathW = ToWcharA(pathA); + BOOL r = IsRelativePathW(pathW); + free(pathW); + return r; } // OSが 指定されたバージョンと等しい かどうかを判別する。 diff --git a/teraterm/common/ttlib_types.cpp b/teraterm/common/ttlib_types.cpp index 0a0ffc73d..562563d3f 100644 --- a/teraterm/common/ttlib_types.cpp +++ b/teraterm/common/ttlib_types.cpp @@ -41,11 +41,11 @@ #include "ttlib_types.h" -wchar_t *GetDownloadDir(const TTTSet *pts) +wchar_t *GetFileDir(const TTTSet *pts) { wchar_t *dir = NULL; if (pts->FileDirW != NULL && pts->FileDirW[0] != 0) { - // ダウンロードフォルダが設定されている + // ファイル転送用フォルダが設定されている // 環境変数を展開 hExpandEnvironmentStringsW(pts->FileDirW, &dir); if (DoesFolderExistW(dir)) { @@ -67,9 +67,9 @@ wchar_t *GetTermLogDir(const TTTSet *pts) return _wcsdup(pts->LogDefaultPathW); } - // ダウンロードフォルダ + // ファイル転送用フォルダ if (pts->FileDirW != NULL && pts->FileDirW[0] != 0) { - // ダウンロードフォルダが設定されている + // ファイル転送用フォルダが設定されている // 環境変数を展開 wchar_t *dir; hExpandEnvironmentStringsW(pts->FileDirW, &dir); diff --git a/teraterm/common/ttlib_types.h b/teraterm/common/ttlib_types.h index 8bd30fab9..cd8b0ace0 100644 --- a/teraterm/common/ttlib_types.h +++ b/teraterm/common/ttlib_types.h @@ -35,11 +35,11 @@ extern "C" { #endif /** - * @brief ダウンロードフォルダを取得 + * @brief ファイル転送用フォルダを取得 * @param pts TTTSet * @return フォルダ 不要になったら free() すること */ -wchar_t *GetDownloadDir(const TTTSet *pts); +wchar_t *GetFileDir(const TTTSet *pts); /** * @brief 端末ログを保存するフォルダを取得 diff --git a/teraterm/common/tttypes.h b/teraterm/common/tttypes.h index 2aa98bdf4..7366a7667 100644 --- a/teraterm/common/tttypes.h +++ b/teraterm/common/tttypes.h @@ -594,7 +594,7 @@ struct tttset { wchar_t *reserve_UILanguageFileW_ini; wchar_t *ExeDirW; // ttermpro.exe のあるフォルダ wchar_t *LogDirW; // プログラムの動作のlogやダンプを置くフォルダ、GetLogDirW() と同一。端末のログは GetTermLogDir() で取得。 - wchar_t *FileDirW; // ダウンロードパス("%APPDATA%" 等が含まれる,使用前に環境変数を展開する, GetDownloadDir()を利用すると便利) + wchar_t *FileDirW; // ファイル転送用フォルダ("%APPDATA%" 等が含まれる,使用前に環境変数を展開する, GetFileDir()を利用すると便利) wchar_t *LogDefaultPathW; // ログフォルダ([file]/[log]メニューのログ) HINSTANCE PluginVTIconInstance; WORD PluginVTIconID; @@ -611,6 +611,11 @@ struct tttset { wchar_t *ViewlogEditorW; wchar_t *ViewlogEditorArg; int BeepVBellWait; + WORD SendfileDelayType; + WORD SendfileDelayTick; + DWORD SendfileSize; + WORD SendfileMethod4; + WORD SendfileSkipOptionDialog; // Experimental BYTE ExperimentalTreePropertySheetEnable; diff --git a/teraterm/teraterm/filesys.cpp b/teraterm/teraterm/filesys.cpp index a09112d1a..800181acf 100644 --- a/teraterm/teraterm/filesys.cpp +++ b/teraterm/teraterm/filesys.cpp @@ -170,6 +170,10 @@ static void FreeFileVar(PFileVar *pfv) /** * ファイル送信 + * Tera Term 4 方式のファイル送信 + * + * @param filename ファイル名 + * @param binaryy 0/1 = text / binary */ BOOL FileSendStart(const wchar_t *filename, int binary) { diff --git a/teraterm/teraterm/filesys_proto.cpp b/teraterm/teraterm/filesys_proto.cpp index 0eeeea511..2818fd032 100644 --- a/teraterm/teraterm/filesys_proto.cpp +++ b/teraterm/teraterm/filesys_proto.cpp @@ -220,7 +220,7 @@ static BOOL NewFileVar_(PFileVarProto *pfv) // 受信フォルダ { - wchar_t *dir = GetDownloadDir(&ts); + wchar_t *dir = GetFileDir(&ts); size_t len = wcslen(dir) + 2; dir = (wchar_t *)realloc(dir, sizeof(wchar_t) * len); AppendSlashW(dir, len); @@ -688,7 +688,7 @@ wchar_t **MakeFileArrayMultiSelect(const wchar_t *lpstrFile) static wchar_t **_GetXFname(HWND HWin, BOOL Receive, const wchar_t *caption, LPLONG Option) { - wchar_t *CurDir = GetDownloadDir(&ts); + wchar_t *FileDir = GetFileDir(&ts); wchar_t *filterW = ToWcharA(ts.FileSendFilter); wchar_t *FNFilter = GetCommonDialogFilterWW(!Receive ? filterW : NULL, ts.UILanguageFileW); free(filterW); @@ -696,7 +696,7 @@ static wchar_t **_GetXFname(HWND HWin, BOOL Receive, const wchar_t *caption, LPL wchar_t FullName[MAX_PATH]; FullName[0] = 0; if (!Receive) { - wchar_t *default_filename = GetCommonDialogDefaultFilenameW(CurDir); + wchar_t *default_filename = GetCommonDialogDefaultFilenameW(FileDir); if (default_filename != NULL) { wcsncpy_s(FullName, _countof(FullName), default_filename, _TRUNCATE); free(default_filename); @@ -710,7 +710,7 @@ static wchar_t **_GetXFname(HWND HWin, BOOL Receive, const wchar_t *caption, LPL ofn.nFilterIndex = 1; ofn.lpstrFile = FullName; ofn.nMaxFile = _countof(FullName); - ofn.lpstrInitialDir = CurDir; + ofn.lpstrInitialDir = FileDir; LONG opt = *Option; if (! Receive) { @@ -740,7 +740,7 @@ static wchar_t **_GetXFname(HWND HWin, BOOL Receive, const wchar_t *caption, LPL Ok = GetSaveFileNameW(&ofn); } free(FNFilter); - free(CurDir); + free(FileDir); SetCurrentDirectoryW(TempDir); wchar_t **ret = NULL; @@ -940,7 +940,7 @@ static wchar_t **_GetMultiFname(HWND hWnd, WORD FuncId, const wchar_t *caption, #define FnStrMemSize 4096 wchar_t TempDir[MAX_PATH]; const wchar_t *UILanguageFileW = ts.UILanguageFileW; - wchar_t *CurDir = GetDownloadDir(&ts); + wchar_t *FileDir = GetFileDir(&ts); /* save current dir */ GetCurrentDirectoryW(_countof(TempDir), TempDir); @@ -956,7 +956,7 @@ static wchar_t **_GetMultiFname(HWND hWnd, WORD FuncId, const wchar_t *caption, wchar_t *FNFilter = GetCommonDialogFilterWW(filterW, UILanguageFileW); free(filterW); - wchar_t *default_filename = GetCommonDialogDefaultFilenameW(CurDir); + wchar_t *default_filename = GetCommonDialogDefaultFilenameW(FileDir); if (default_filename != NULL) { wcsncpy_s(FnStrMem, FnStrMemSize, default_filename, _TRUNCATE); free(default_filename); @@ -970,7 +970,7 @@ static wchar_t **_GetMultiFname(HWND hWnd, WORD FuncId, const wchar_t *caption, ofn.lpstrFile = FnStrMem; ofn.nMaxFile = FnStrMemSize; ofn.lpstrTitle= caption; - ofn.lpstrInitialDir = CurDir; + ofn.lpstrInitialDir = FileDir; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.Flags |= OFN_ALLOWMULTISELECT | OFN_EXPLORER; ofn.Flags |= OFN_SHOWHELP; @@ -996,7 +996,7 @@ static wchar_t **_GetMultiFname(HWND hWnd, WORD FuncId, const wchar_t *caption, ret = MakeFileArrayMultiSelect(FnStrMem); } free(FnStrMem); - free(CurDir); + free(FileDir); /* restore dir */ SetCurrentDirectoryW(TempDir); @@ -1504,7 +1504,7 @@ static wchar_t **_GetTransFname(HWND hWnd, const wchar_t *DlgCaption) wchar_t TempDir[MAX_PATH]; wchar_t FileName[MAX_PATH]; const wchar_t *UILanguageFileW = ts.UILanguageFileW; - wchar_t *CurDir = GetDownloadDir(&ts); + wchar_t *FileDir = GetFileDir(&ts); /* save current dir */ GetCurrentDirectoryW(_countof(TempDir), TempDir); @@ -1513,6 +1513,7 @@ static wchar_t **_GetTransFname(HWND hWnd, const wchar_t *DlgCaption) wchar_t *FNFilter = GetCommonDialogFilterWW(filterW, UILanguageFileW); free(filterW); + FileName[0] = 0; OPENFILENAMEW ofn = {}; ofn.lStructSize = get_OPENFILENAME_SIZE(); ofn.hwndOwner = hWnd; @@ -1520,14 +1521,14 @@ static wchar_t **_GetTransFname(HWND hWnd, const wchar_t *DlgCaption) ofn.nFilterIndex = 1; ofn.lpstrFile = FileName; ofn.nMaxFile = _countof(FileName); - ofn.lpstrInitialDir = CurDir; + ofn.lpstrInitialDir = FileDir; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_SHOWHELP; ofn.lpstrTitle = DlgCaption; ofn.hInstance = hInst; BOOL Ok = GetOpenFileNameW(&ofn); free(FNFilter); - free(CurDir); + free(FileDir); wchar_t **ret = NULL; if (Ok) { diff --git a/teraterm/teraterm/general_pp.cpp b/teraterm/teraterm/general_pp.cpp index 36eef11af..949f166d6 100644 --- a/teraterm/teraterm/general_pp.cpp +++ b/teraterm/teraterm/general_pp.cpp @@ -329,8 +329,8 @@ void CGeneralPropPageDlg::OnInitDialog() SendDlgItemMessageA(IDC_GENPORT, CB_SETCURSEL, w, 0); } - // Download dir - SetDlgItemTextW(IDC_DOWNLOAD_DIR, pts->FileDirW); + // File transfer dir + SetDlgItemTextW(IDC_FILE_DIR, pts->FileDirW); #if 0 // ダイアログにフォーカスを当てる (2004.12.7 yutaka) @@ -410,9 +410,9 @@ void CGeneralPropPageDlg::OnOK() } } - // Download dir + // File transfer dir free(pts->FileDirW); - hGetDlgItemTextW(m_hWnd, IDC_DOWNLOAD_DIR, &pts->FileDirW); + hGetDlgItemTextW(m_hWnd, IDC_FILE_DIR, &pts->FileDirW); if (pts->FileDirW != NULL && pts->FileDirW[0] == 0) { free(pts->FileDirW); pts->FileDirW = NULL; @@ -463,13 +463,13 @@ BOOL CGeneralPropPageDlg::OnCommand(WPARAM wParam, LPARAM lParam) Notify2Hide(ni); break; } - case IDC_DOWNLOAD_DIR_SELECT | (BN_CLICKED << 16): { + case IDC_FILE_DIR_SELECT | (BN_CLICKED << 16): { wchar_t *uimsgW; wchar_t *src; wchar_t *dest; GetI18nStrWW("Tera Term", "DLG_SELECT_DIR_TITLE", L"Select new directory", data->pts->UILanguageFileW, &uimsgW); - hGetDlgItemTextW(m_hWnd, IDC_DOWNLOAD_DIR, &src); + hGetDlgItemTextW(m_hWnd, IDC_FILE_DIR, &src); if (src != NULL && src[0] == 0) { free(src); // Windowsのデフォルトのダウンロードフォルダ @@ -482,7 +482,7 @@ BOOL CGeneralPropPageDlg::OnCommand(WPARAM wParam, LPARAM lParam) src = FileDirExpanded; } if (doSelectFolderW(m_hWnd, src, uimsgW, &dest)) { - SetDlgItemTextW(IDC_DOWNLOAD_DIR, dest); + SetDlgItemTextW(IDC_FILE_DIR, dest); free(dest); } free(src); diff --git a/teraterm/teraterm/sendfiledlg.cpp b/teraterm/teraterm/sendfiledlg.cpp index 700edaa22..47870b0ec 100644 --- a/teraterm/teraterm/sendfiledlg.cpp +++ b/teraterm/teraterm/sendfiledlg.cpp @@ -32,18 +32,18 @@ #include #include #include -#include #include "i18n.h" #include "tt_res.h" #include "ttlib.h" +#include "ttlib_types.h" #include "dlglib.h" #include "tttypes.h" // for WM_USER_DLGHELP2 #include "helpid.h" -#include "codeconv.h" #include "asprintf.h" #include "win32helper.h" #include "tipwin2.h" +#include "sendmem.h" #include "sendfiledlg.h" @@ -54,26 +54,79 @@ typedef struct { UINT MsgDlgHelp; } SendFileDlgWork_t; +static void ArrangeControls(HWND hDlgWnd) +{ + LRESULT index = SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0); + SendMemDelayType sel = (SendMemDelayType)SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETITEMDATA, (WPARAM)index, 0); + + if (IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_CHECK_4) == BST_CHECKED) { + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTYPE_LABEL), FALSE); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN), FALSE); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_LABEL), FALSE); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), FALSE); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_LABEL), FALSE); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), FALSE); + } + else { + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTYPE_LABEL), TRUE); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN), TRUE); + BOOL enable = (sel == SENDMEM_DELAYTYPE_PER_SENDSIZE) ? TRUE : FALSE; + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_LABEL), enable); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), enable); + enable = (sel == SENDMEM_DELAYTYPE_NO_DELAY) ? FALSE : TRUE; + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_LABEL), enable); + EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), enable); + } +} + +static BOOL SelectFile(HWND hDlgWnd, const sendfiledlgdata *data, const wchar_t *filename_ini, wchar_t **filename) +{ + wchar_t *uimsg; + GetI18nStrWW("Tera Term", "FILEDLG_TRANS_TITLE_SENDFILE", L"Send file", data->UILanguageFileW, &uimsg); + wchar_t *title; + aswprintf(&title, L"Tera Term: %s", uimsg); + free(uimsg); + uimsg = NULL; + + wchar_t *filterW = GetCommonDialogFilterWW(data->filesend_filter, data->UILanguageFileW); + + TTOPENFILENAMEW ofn = {}; + ofn.hwndOwner = hDlgWnd; + ofn.lpstrFilter = filterW; + ofn.nFilterIndex = 0; + ofn.lpstrTitle = title; + ofn.lpstrFile = filename_ini; // 初期ファイル名 + ofn.lpstrInitialDir = data->initial_dir; // 初期フォルダ + ofn.Flags = OFN_FILEMUSTEXIST | OFN_SHOWHELP | OFN_HIDEREADONLY; + BOOL Ok = TTGetOpenFileNameW(&ofn, filename); + + free(filterW); + free(title); + + return Ok; +} + static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp) { static const DlgTextInfo TextInfos[] = { - {0, "FILEDLG_TRANS_TITLE_SENDFILE"}, - {IDC_SENDFILE_FILENAME_TITLE, "DLG_SENDFILE_FILENAME_TITLE"}, - {IDC_SENDFILE_CHECK_BINARY, "DLG_FOPT_BINARY"}, - {IDC_SENDFILE_DELAYTYPE_LABEL, "DLG_SENDFILE_DELAYTYPE_TITLE"}, - {IDC_SENDFILE_SEND_SIZE_LABEL, "DLG_SENDFILE_SEND_SIZE_TITLE"}, - {IDC_SENDFILE_DELAYTIME_LABEL, "DLG_SENDFILE_DELAYTIME_TITLE"}, - {IDC_SENDFILE_CHECK_4, "DLG_SENDFILE_TERATERM4"}, - {IDCANCEL, "BTN_CANCEL"}, - {IDOK, "BTN_OK"}, + { 0, "FILEDLG_TRANS_TITLE_SENDFILE" }, + { IDC_SENDFILE_FILENAME_TITLE, "DLG_SENDFILE_FILENAME_TITLE" }, + { IDC_SENDFILE_CHECK_BINARY, "DLG_FOPT_BINARY" }, + { IDC_SENDFILE_DELAYTYPE_LABEL, "DLG_SENDFILE_DELAYTYPE_TITLE" }, + { IDC_SENDFILE_SEND_SIZE_LABEL, "DLG_SENDFILE_SEND_SIZE_TITLE" }, + { IDC_SENDFILE_DELAYTIME_LABEL, "DLG_SENDFILE_DELAYTIME_TITLE" }, + { IDC_SENDFILE_CHECK_4, "DLG_SENDFILE_TERATERM4" }, + { IDHELP, "BTN_HELP" }, + { IDCANCEL, "BTN_CANCEL" }, + { IDOK, "BTN_OK" }, }; static const I18nTextInfo delaytype_list[] = { - {"DLG_SENDFILE_DELAYTYPE_NO_DELAY", L"no delay"}, - {"DLG_SENDFILE_DELAYTYPE_PER_CHAR", L"per character"}, - {"DLG_SENDFILE_DELAYTYPE_PER_LINE", L"per line"}, - {"DLG_SENDFILE_DELAYTYPE_PER_SENDSIZE", L"per sendsize"}, + { "DLG_SENDFILE_DELAYTYPE_NO_DELAY", L"no delay", SENDMEM_DELAYTYPE_NO_DELAY }, + { "DLG_SENDFILE_DELAYTYPE_PER_CHAR", L"per character", SENDMEM_DELAYTYPE_PER_CHAR }, + { "DLG_SENDFILE_DELAYTYPE_PER_LINE", L"per line", SENDMEM_DELAYTYPE_PER_LINE }, + { "DLG_SENDFILE_DELAYTYPE_PER_SENDSIZE", L"per sendsize", SENDMEM_DELAYTYPE_PER_SENDSIZE }, }; - static const int send_size_list[] = {16, 256, 4 * 1024}; + static const size_t send_size_list[] = {16, 256, 4 * 1024}; SendFileDlgWork_t *work = (SendFileDlgWork_t *)GetWindowLongPtr(hDlgWnd, DWLP_USER); sendfiledlgdata *data = work != NULL ? work->create_param : NULL; @@ -89,19 +142,25 @@ static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARA CenterWindow(hDlgWnd, GetParent(hDlgWnd)); SetI18nListW("Tera Term", hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, delaytype_list, _countof(delaytype_list), - data->UILanguageFileW, 0); + data->UILanguageFileW, data->delay_type); + if (data->initial_file != NULL) { + SetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, data->initial_file); + } + + // 送信サイズ for (size_t i = 0; i < _countof(send_size_list); i++) { char buf[32]; - sprintf(buf, "%d", send_size_list[i]); + sprintf(buf, "%lu", (unsigned long)send_size_list[i]); SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, CB_ADDSTRING, 0, (LPARAM)buf); } - SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, CB_SETCURSEL, _countof(send_size_list) - 1, 0); + SetDlgNum(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, (LONG)data->send_size); - SetDlgItemTextA(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, "1"); + SetDlgNum(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, data->delay_tick); + CheckDlgButton(hDlgWnd, IDC_SENDFILE_CHECK_BINARY, data->binary ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hDlgWnd, IDC_SENDFILE_CHECK_4, data->method_4 ? BST_CHECKED : BST_UNCHECKED); - EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), FALSE); - EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), FALSE); + ArrangeControls(hDlgWnd); TipWin2 *tip = TipWin2Create(NULL, hDlgWnd); work->tip = tip; @@ -111,8 +170,6 @@ static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARA TipWin2SetTextW(tip, IDC_SENDFILE_CHECK_4, text); free(text); } - //TipWin2SetTextW(tip, IDC_SENDFILE_FILENAME_EDIT, L"ファイル名を入れる"); // test - //TipWin2SetTextW(tip, IDC_SENDFILE_FILENAME_BUTTON, L"ファイル選択"); // test return TRUE; } @@ -120,6 +177,7 @@ static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARA TipWin2Destroy(work->tip); work->tip = NULL; free(work); + SetWindowLongPtr(hDlgWnd, DWLP_USER, 0); return FALSE; } case WM_COMMAND: @@ -145,14 +203,12 @@ static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARA } data->filename = filename; - data->binary = - SendMessage(GetDlgItem(hDlgWnd, IDC_SENDFILE_CHECK_BINARY), BM_GETCHECK, 0, 0) == BST_CHECKED - ? TRUE - : FALSE; - data->delay_type = (int)SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0); + data->binary = IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_CHECK_BINARY) == BST_CHECKED ? TRUE : FALSE; + LRESULT index = SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0); + data->delay_type = (SendMemDelayType)SendDlgItemMessageA(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETITEMDATA, (WPARAM)index, 0); data->delay_tick = GetDlgItemInt(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT, NULL, FALSE); data->send_size = GetDlgItemInt(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN, NULL, FALSE); - data->method_4 = IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_CHECK_4); + data->method_4 = IsDlgButtonChecked(hDlgWnd, IDC_SENDFILE_CHECK_4) == BST_CHECKED ? TRUE : FALSE; TTEndDialog(hDlgWnd, IDOK); return TRUE; @@ -167,53 +223,36 @@ static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARA TTEndDialog(hDlgWnd, IDCANCEL); return TRUE; + case IDC_SENDFILE_CHECK_4 | (BN_CLICKED << 16): + ArrangeControls(hDlgWnd); + return TRUE; + case IDC_SENDFILE_FILENAME_BUTTON | (BN_CLICKED << 16): { - wchar_t TempDir[MAX_PATH]; - GetCurrentDirectoryW(_countof(TempDir), TempDir); - - wchar_t *uimsg; - GetI18nStrWW("Tera Term", "FILEDLG_TRANS_TITLE_SENDFILE", L"Send file", data->UILanguageFileW, &uimsg); - wchar_t *title; - aswprintf(&title, L"Tera Term: %s", uimsg); - free(uimsg); - uimsg = NULL; - - wchar_t *filterW = GetCommonDialogFilterWW(data->filesend_filter, data->UILanguageFileW); - wchar_t filename[MAX_PATH]; - filename[0] = 0; - OPENFILENAMEW ofn = {}; - ofn.lStructSize = get_OPENFILENAME_SIZEW(); - ofn.hwndOwner = hDlgWnd; - ofn.lpstrFile = filename; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrFilter = filterW; - ofn.nFilterIndex = 0; - ofn.lpstrTitle = title; - ofn.Flags = OFN_FILEMUSTEXIST | OFN_SHOWHELP | OFN_HIDEREADONLY; - BOOL Ok = GetOpenFileNameW(&ofn); - free(filterW); - free(title); - - SetCurrentDirectoryW(TempDir); + wchar_t *filename_ini; + hGetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, &filename_ini); + + wchar_t *filename; + BOOL Ok = SelectFile(hDlgWnd,data, filename_ini, &filename); + free(filename_ini); if (Ok) { SetDlgItemTextW(hDlgWnd, IDC_SENDFILE_FILENAME_EDIT, filename); PostMessage(hDlgWnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hDlgWnd, IDOK), TRUE); + free(filename); } return TRUE; } case IDC_SENDFILE_DELAYTYPE_DROPDOWN | (CBN_SELCHANGE << 16): { - int sel = (int)SendDlgItemMessage(hDlgWnd, IDC_SENDFILE_DELAYTYPE_DROPDOWN, CB_GETCURSEL, 0, 0); - EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_SEND_SIZE_DROPDOWN), sel != 3 ? FALSE : TRUE); - EnableWindow(GetDlgItem(hDlgWnd, IDC_SENDFILE_DELAYTIME_EDIT), sel == 0 ? FALSE : TRUE); + ArrangeControls(hDlgWnd); return TRUE; } default: return FALSE; } + break; case WM_DROPFILES: { // 複数ドロップされても最初の1つだけを扱う @@ -246,8 +285,23 @@ static INT_PTR CALLBACK SendFileDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARA INT_PTR sendfiledlg(HINSTANCE hInstance, HWND hWndParent, sendfiledlgdata *data) { - INT_PTR ret; - data->method_4 = FALSE; - ret = TTDialogBoxParam(hInstance, MAKEINTRESOURCEW(IDD_SENDFILEDLG), hWndParent, SendFileDlgProc, (LPARAM)data); - return ret; + BOOL skip_dialog = data->skip_dialog; + if ((GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0) { + skip_dialog = !skip_dialog; + } + + if (!skip_dialog) { + INT_PTR ret; + ret = TTDialogBoxParam(hInstance, MAKEINTRESOURCEW(IDD_SENDFILEDLG), hWndParent, SendFileDlgProc, (LPARAM)data); + return ret; + } + else { + wchar_t *filename_ini = data->filename; + wchar_t *filename; + BOOL Ok = SelectFile(hWndParent, data, filename_ini, &filename); + if (Ok) { + data->filename = filename; + } + return Ok ? (INT_PTR)IDOK : (INT_PTR)IDCANCEL; + } } diff --git a/teraterm/teraterm/sendfiledlg.h b/teraterm/teraterm/sendfiledlg.h index 22ae0a0c2..f6a3371d9 100644 --- a/teraterm/teraterm/sendfiledlg.h +++ b/teraterm/teraterm/sendfiledlg.h @@ -29,21 +29,27 @@ #pragma once #include +#include "sendmem.h" + #ifdef __cplusplus extern "C" { #endif typedef struct { // in - const wchar_t* UILanguageFileW; + const wchar_t *UILanguageFileW; const wchar_t *filesend_filter; - // out - wchar_t* filename; // IDOK時、選択ファイル名が返る,使用後free()すること - BOOL binary; // TRUE/FALSE = バイナリ/テキスト - int delay_type; + const wchar_t *initial_dir; + const wchar_t *initial_file; // 初期ファイル名, NULL=指定なし + // in/out + BOOL skip_dialog; + BOOL binary; // TRUE/FALSE = バイナリ/テキスト + SendMemDelayType delay_type; DWORD delay_tick; size_t send_size; - BOOL method_4; // Tera Term 4 のルーチンを使用する + BOOL method_4; // Tera Term 4 のルーチンを使用する + // out + wchar_t *filename; // IDOK時、選択ファイル名が返る,使用後free()すること } sendfiledlgdata; INT_PTR sendfiledlg(HINSTANCE hInstance, HWND hWndParent, sendfiledlgdata *data); diff --git a/teraterm/teraterm/setupdirdlg.cpp b/teraterm/teraterm/setupdirdlg.cpp index eaf68a3b0..cb61a8bdd 100644 --- a/teraterm/teraterm/setupdirdlg.cpp +++ b/teraterm/teraterm/setupdirdlg.cpp @@ -467,12 +467,12 @@ static wchar_t *_GetTermLogPath(const SetupList *list, const TTTSet *pts) } } -static wchar_t *_GetDownloadDir(const SetupList *list, const TTTSet *pts) +static wchar_t *_GetFileDir(const SetupList *list, const TTTSet *pts) { if (list->data_ptr == 0) { // raw if (pts->FileDirW != NULL) { - wchar_t *d = GetDownloadDir(pts); + wchar_t *d = GetFileDir(pts); int r = wcscmp(d, pts->FileDirW); free(d); if (r == 0) { @@ -488,7 +488,7 @@ static wchar_t *_GetDownloadDir(const SetupList *list, const TTTSet *pts) } } else { - return GetDownloadDir(pts); + return GetFileDir(pts); } } @@ -555,10 +555,10 @@ static INT_PTR CALLBACK OnSetupDirectoryDlgProc(HWND hDlgWnd, UINT msg, WPARAM w LIST_PARAM_STR, pts->HomeDirW, NULL }, { NULL, L"ExeDir", LIST_PARAM_STR, pts->ExeDirW, NULL }, - { NULL, L"Download(FileDir in ini)", - LIST_PARAM_FUNC, (void*)_GetDownloadDir, (void *)0 }, - { NULL, L"Download", - LIST_PARAM_FUNC, (void*)_GetDownloadDir, (void *)1 }, + { NULL, L"FileDir (INI file)", + LIST_PARAM_FUNC, (void*)_GetFileDir, (void *)0 }, + { NULL, L"FileDir", + LIST_PARAM_FUNC, (void*)_GetFileDir, (void *)1 }, { NULL, L"LogDir(General)", LIST_PARAM_STR, pts->LogDirW, NULL }, { NULL, L"Default log save folder", diff --git a/teraterm/teraterm/ttermpro.rc b/teraterm/teraterm/ttermpro.rc index 3fa7a1332..e311cc848 100644 --- a/teraterm/teraterm/ttermpro.rc +++ b/teraterm/teraterm/ttermpro.rc @@ -84,9 +84,9 @@ BEGIN CONTROL "&Notify sound",IDC_NOTIFY_SOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,21,204,220,10 PUSHBUTTON "&Notify test",IDC_NOTIFICATION_TEST_POPUP,20,218,50,14 PUSHBUTTON "&Tray test",IDC_NOTIFICATION_TEST_TRAY,75,218,50,14 - LTEXT "Download Folder",IDC_DOWNLOAD_DIR_TITLE,10,237,125,8 - EDITTEXT IDC_DOWNLOAD_DIR,21,249,210,14,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_DOWNLOAD_DIR_SELECT,235,249,17,14 + LTEXT "File transfer folder",IDC_FILE_DIR_TITLE,10,237,125,8 + EDITTEXT IDC_FILE_DIR,21,249,210,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_FILE_DIR_SELECT,235,249,17,14 LTEXT "UI Language:",IDC_GENUILANG_LABEL,11,81,59,11 COMBOBOX IDC_GENUILANG,21,91,95,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END @@ -341,26 +341,26 @@ BEGIN PUSHBUTTON "Help",IDHELP,313,127,50,14 END -IDD_SENDFILEDLG DIALOGEX 0, 0, 271, 188 +IDD_SENDFILEDLG DIALOGEX 0, 0, 271, 199 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Send file" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN LTEXT "&Filename (drop file in this dialog)",IDC_SENDFILE_FILENAME_TITLE,9,7,172,8 - EDITTEXT IDC_SENDFILE_FILENAME_EDIT,18,21,224,14,ES_AUTOHSCROLL - PUSHBUTTON "...",IDC_SENDFILE_FILENAME_BUTTON,245,21,14,14 + EDITTEXT IDC_SENDFILE_FILENAME_EDIT,18,21,228,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_SENDFILE_FILENAME_BUTTON,251,21,14,14 CONTROL "Send in same way as Tera Term 4",IDC_SENDFILE_CHECK_4, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,42,124,10 CONTROL "&Binary",IDC_SENDFILE_CHECK_BINARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,9,59,72,10 LTEXT "delay type",IDC_SENDFILE_DELAYTYPE_LABEL,9,76,74,11 - COMBOBOX IDC_SENDFILE_DELAYTYPE_DROPDOWN,18,90,64,53,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SENDFILE_DELAYTYPE_DROPDOWN,18,90,64,53,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP LTEXT "send size(bytes)",IDC_SENDFILE_SEND_SIZE_LABEL,9,107,75,8 - COMBOBOX IDC_SENDFILE_SEND_SIZE_DROPDOWN,18,121,65,47,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SENDFILE_SEND_SIZE_DROPDOWN,18,121,65,47,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP LTEXT "delay time(ms)",IDC_SENDFILE_DELAYTIME_LABEL,9,139,75,8 EDITTEXT IDC_SENDFILE_DELAYTIME_EDIT,18,154,40,14,ES_AUTOHSCROLL - PUSHBUTTON "Help",IDHELP,104,166,50,14 - DEFPUSHBUTTON "OK",IDOK,160,166,50,14 - PUSHBUTTON "Cancel",IDCANCEL,215,166,50,14 + PUSHBUTTON "Help",IDHELP,104,179,50,14 + PUSHBUTTON "Cancel",IDCANCEL,160,179,50,14 + DEFPUSHBUTTON "OK",IDOK,215,179,50,14 END IDD_TABSHEET_THEME DIALOGEX 0, 0, 307, 162 @@ -493,9 +493,12 @@ BEGIN IDD_SENDFILEDLG, DIALOG BEGIN + LEFTMARGIN, 9 + RIGHTMARGIN, 265 VERTGUIDE, 9 VERTGUIDE, 18 - BOTTOMMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 193 END IDD_TABSHEET_THEME, DIALOG diff --git a/teraterm/teraterm/vtwin.cpp b/teraterm/teraterm/vtwin.cpp index 777bbd694..1ced1df21 100644 --- a/teraterm/teraterm/vtwin.cpp +++ b/teraterm/teraterm/vtwin.cpp @@ -3965,27 +3965,43 @@ void CVTWindow::OnReplayLog() void CVTWindow::OnFileSend() { - // new file send SetDialogFont(ts.DialogFontNameW, ts.DialogFontPoint, ts.DialogFontCharSet, ts.UILanguageFileW, "Tera Term", "DLG_TAHOMA_FONT"); - sendfiledlgdata data; + sendfiledlgdata data = {}; data.UILanguageFileW = ts.UILanguageFileW; wchar_t *filterW = ToWcharA(ts.FileSendFilter); data.filesend_filter = filterW; + wchar_t *initial_dir = GetFileDir(&ts); + data.initial_dir = initial_dir; + data.skip_dialog = (BOOL)ts.SendfileSkipOptionDialog; + data.binary = ts.TransBin; + data.delay_type = (SendMemDelayType)ts.SendfileDelayType; + data.delay_tick = ts.SendfileDelayTick; + data.send_size = ts.SendfileSize; + data.method_4 = ts.SendfileMethod4; + INT_PTR ok = sendfiledlg(m_hInst, m_hWnd, &data); + free(initial_dir); free(filterW); if (ok != IDOK) { return; } + ts.SendfileSkipOptionDialog = data.skip_dialog; + ts.TransBin = data.binary; + ts.SendfileDelayType = data.delay_type; + ts.SendfileDelayTick = data.delay_tick; + ts.SendfileSize = data.send_size; + ts.SendfileMethod4 = data.method_4; wchar_t *filename = data.filename; if (!data.method_4) { - SendMemSendFile(filename, data.binary, (SendMemDelayType)data.delay_type, data.delay_tick, data.send_size); + // new file send + SendMemSendFile(filename, data.binary, data.delay_type, data.delay_tick, data.send_size); } else { // file send same as teraterm 4 HelpId = HlpFileSend; - FileSendStart(filename, 0); + FileSendStart(filename, data.binary); } free(filename); } diff --git a/teraterm/ttpset/ttset.c b/teraterm/ttpset/ttset.c index 870deaf4b..48d2c3722 100644 --- a/teraterm/ttpset/ttset.c +++ b/teraterm/ttpset/ttset.c @@ -2005,6 +2005,17 @@ void PASCAL _ReadIniFile(const wchar_t *FName, PTTSet ts) ts->BracketedSupport = GetOnOff(Section, "BracketedSupport", FName, TRUE); ts->BracketedControlOnly = GetOnOff(Section, "BracketedControlOnly", FName, FALSE); + // Sendfile + GetPrivateProfileString(Section, "SendfileDelayType", "NoDelay", Temp, sizeof(Temp), FName); + ts->SendfileDelayType = + (_stricmp(Temp, "PerChar") == 0) ? 1 : + (_stricmp(Temp, "PerLine") == 0) ? 2 : + (_stricmp(Temp, "PerSendSize") == 0) ? 3 : /*NoDelay*/ 0; + ts->SendfileDelayTick = GetPrivateProfileInt(Section, "SendfileDelayTick", 0, FName); + ts->SendfileSize = GetPrivateProfileInt(Section, "SendfileSize", 4096, FName); + ts->SendfileMethod4 = GetOnOff(Section, "SendfileMethod4", FName, FALSE); + ts->SendfileSkipOptionDialog = GetOnOff(Section, "SendfileSkipOptionDialog", FName, FALSE); + // Experimental ts->ExperimentalTreePropertySheetEnable = GetOnOff("Experimental", "TreeProprtySheet", FName, FALSE); ts->ExperimentalTreePropertySheetEnable = GetOnOff("Experimental", "TreePropertySheet", FName, ts->ExperimentalTreePropertySheetEnable); @@ -3260,6 +3271,18 @@ void PASCAL _WriteIniFile(const wchar_t *FName, PTTSet ts) // Bracketed paste mode WriteOnOff(Section, "BracketedSupport", FName, ts->BracketedSupport); WriteOnOff(Section, "BracketedControlOnly", FName, ts->BracketedControlOnly); + + // Sendfile + WritePrivateProfileString(Section, "SendfileDelayType", + ts->SendfileDelayType == 1 ? "PerChar" : + ts->SendfileDelayType == 2 ? "PerLine" : + ts->SendfileDelayType == 3 ? "PerSendSize" : + "NoDelay", + FName); + WriteInt(Section, "SendfileDelayTick", FName, 2); + WriteInt(Section, "SendfileSize", FName, ts->SendfileSize); + WriteOnOff(Section, "SendfileMethod4", FName, ts->SendfileMethod4); + WriteOnOff(Section, "SendfileSkipOptionDialog", FName, ts->SendfileSkipOptionDialog); } void PASCAL _CopySerialList(const wchar_t *IniSrc, const wchar_t *IniDest, const wchar_t *section, diff --git a/ttssh2/ttxssh/ssh.c b/ttssh2/ttxssh/ssh.c index 1b03e3175..345c15e75 100644 --- a/ttssh2/ttxssh/ssh.c +++ b/ttssh2/ttxssh/ssh.c @@ -4304,7 +4304,7 @@ int SSH_scp_transaction(PTInstVar pvar, const char *sendfile, const char *dstfil if (fn && fn[1] == '\0') goto error; - FileDirExpanded = GetDownloadDir(pvar->ts); + FileDirExpanded = GetFileDir(pvar->ts); FileDirExpandedU8 = ToU8W(FileDirExpanded); _snprintf_s(c->scp.localfilefull, sizeof(c->scp.localfilefull), _TRUNCATE, "%s\\%s", FileDirExpandedU8, fn ? fn : sendfile); free(FileDirExpanded);