[Ttssh2-commit] [8823] ブロードキャスト関連を vtwin.cpp から broadcast.cpp へ分離

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2020年 7月 3日 (金) 23:42:55 JST


Revision: 8823
          https://osdn.net/projects/ttssh2/scm/svn/commits/8823
Author:   zmatsuo
Date:     2020-07-03 23:42:55 +0900 (Fri, 03 Jul 2020)
Log Message:
-----------
ブロードキャスト関連を vtwin.cpp から broadcast.cpp へ分離

Modified Paths:
--------------
    trunk/teraterm/teraterm/CMakeLists.txt
    trunk/teraterm/teraterm/ttdde.c
    trunk/teraterm/teraterm/ttermpro.v16.vcxproj
    trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters
    trunk/teraterm/teraterm/ttermpro.vcproj
    trunk/teraterm/teraterm/vtwin.cpp
    trunk/teraterm/teraterm/vtwin.h

Added Paths:
-----------
    trunk/teraterm/teraterm/broadcast.cpp
    trunk/teraterm/teraterm/broadcast.h

-------------- next part --------------
Modified: trunk/teraterm/teraterm/CMakeLists.txt
===================================================================
--- trunk/teraterm/teraterm/CMakeLists.txt	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/CMakeLists.txt	2020-07-03 14:42:55 UTC (rev 8823)
@@ -11,6 +11,8 @@
   teraterm WIN32
   addsetting.cpp
   addsetting.h
+  broadcast.cpp
+  broadcast.h
   buffer.c
   buffer.h
   clipboar.c

Added: trunk/teraterm/teraterm/broadcast.cpp
===================================================================
--- trunk/teraterm/teraterm/broadcast.cpp	                        (rev 0)
+++ trunk/teraterm/teraterm/broadcast.cpp	2020-07-03 14:42:55 UTC (rev 8823)
@@ -0,0 +1,743 @@
+/*
+ * Copyright (C) 2020 TeraTerm Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// vtwin\x82\xA9\x82番\x97\xA3
+
+#include "teraterm_conf.h"
+#include "teraterm.h"
+#include "tttypes.h"
+#include "ttcommon.h"
+#include "ttwinman.h"
+
+#include <stdio.h>
+#define _CRTDBG_MAP_ALLOC
+#include <stdlib.h>
+#include <crtdbg.h>
+#include <string.h>
+#include <windowsx.h>
+#include <commctrl.h>
+
+#include "ttsetup.h"
+#include "keyboard.h"	// for ShiftKey() ControlKey()
+#include "ttlib.h"
+#include "dlglib.h"
+#include "tt_res.h"
+#include "clipboar.h"
+
+#include "broadcast.h"
+
+
+// WM_COPYDATA\x82ɂ\xE6\x82\xE9\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82̎\xED\x95\xCA (2005.1.22 yutaka)
+#define IPC_BROADCAST_COMMAND 1      // \x91S\x92[\x96\x96\x82֑\x97\x90M
+#define IPC_MULTICAST_COMMAND 2      // \x94C\x88ӂ̒[\x96\x96\x8CQ\x82֑\x97\x90M
+
+#define BROADCAST_LOGFILE "broadcast.log"
+
+
+static void ApplyBroadCastCommandHisotry(HWND Dialog, char *historyfile)
+{
+	char EntName[13];
+	char Command[HostNameMaxLength+1];
+	int i = 1;
+
+	SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_RESETCONTENT, 0, 0);
+	do {
+		_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "Command%d", i);
+		GetPrivateProfileString("BroadcastCommands",EntName,"",
+		                        Command,sizeof(Command), historyfile);
+		if (strlen(Command) > 0) {
+			SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_ADDSTRING,
+			                   0, (LPARAM)Command);
+		}
+		i++;
+	} while ((i <= ts.MaxBroadcatHistory) && (strlen(Command)>0));
+
+	SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, EM_LIMITTEXT,
+	                   HostNameMaxLength-1, 0);
+
+	SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_SETCURSEL,0,0);
+}
+
+// \x83h\x83\x8D\x83b\x83v\x83_\x83E\x83\x93\x82̒\x86\x82̃G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82\xF0
+// \x83T\x83u\x83N\x83\x89\x83X\x89\xBB\x82\xB7\x82邽\x82߂̃E\x83C\x83\x93\x83h\x83E\x83v\x83\x8D\x83V\x81[\x83W\x83\x83
+static WNDPROC OrigBroadcastEditProc; // Original window procedure
+static HWND BroadcastWindowList;
+static LRESULT CALLBACK BroadcastEditProc(HWND dlg, UINT msg,
+                                          WPARAM wParam, LPARAM lParam)
+{
+	char buf[1024];
+	int len;
+
+	switch (msg) {
+		case WM_CREATE:
+			break;
+
+		case WM_DESTROY:
+			break;
+
+		case WM_LBUTTONUP:
+			// \x82\xB7\x82łɃe\x83L\x83X\x83g\x82\xAA\x93\xFC\x97͂\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x8Fꍇ\x82́A\x83J\x81[\x83\\x83\x8B\x82𖖔\xF6\x82ֈړ\xAE\x82\xB3\x82\xB9\x82\xE9\x81B
+			len = GetWindowText(dlg, buf, sizeof(buf));
+			SendMessage(dlg, EM_SETSEL, len, len);
+			SetFocus(dlg);
+			break;
+
+		case WM_LBUTTONDOWN:
+		case WM_RBUTTONDOWN:
+		case WM_RBUTTONUP:
+			SetFocus(dlg);
+			break;
+
+		case WM_KEYDOWN:
+		case WM_KEYUP:
+		case WM_SYSKEYDOWN:
+		case WM_SYSKEYUP:
+			{
+				int i;
+				HWND hd;
+				int count;
+
+				if (wParam == 0x0d) {  // Enter key
+					SetWindowText(dlg, "");
+					SendMessage(dlg, EM_SETSEL, 0, 0);
+				}
+
+				count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
+				for (i = 0 ; i < count ; i++) {
+					if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
+						hd = GetNthWin(i);
+						if (hd) {
+							PostMessage(hd, msg, wParam, lParam);
+						}
+					}
+				}
+			}
+			break;
+
+		case WM_CHAR:
+			// \x93\xFC\x97͂\xB5\x82\xBD\x95\xB6\x8E\x9A\x82\xAAIDC_COMMAND_EDIT\x82Ɏc\x82\xE7\x82Ȃ\xA2\x82悤\x82Ɏ̂Ă\xE9
+			return FALSE;
+
+		default:
+			return CallWindowProc(OrigBroadcastEditProc, dlg, msg, wParam, lParam);
+	}
+
+	return FALSE;
+}
+
+static void UpdateBroadcastWindowList(HWND hWnd)
+{
+	int i, count;
+	HWND hd;
+	TCHAR szWindowText[256];
+
+	SendMessage(hWnd, LB_RESETCONTENT, 0, 0);
+
+	count = GetRegisteredWindowCount();
+	for (i = 0 ; i < count ; i++) {
+		hd = GetNthWin(i);
+		if (hd == NULL) {
+			break;
+		}
+
+		GetWindowText(hd, szWindowText, 256);
+		SendMessage(hWnd, LB_INSERTSTRING, -1, (LPARAM)szWindowText);
+	}
+}
+
+/*
+ * \x83_\x83C\x83A\x83\x8D\x83O\x82őI\x91\xF0\x82\xB3\x82ꂽ\x83E\x83B\x83\x93\x83h\x83E\x82̂݁A\x82\xE0\x82\xB5\x82\xAD\x82͐e\x83E\x83B\x83\x93\x83h\x83E\x82݂̂ɑ\x97\x82\xE9\x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x83\x82\x81[\x83h\x81B
+ * \x83\x8A\x83A\x83\x8B\x83^\x83C\x83\x80\x83\x82\x81[\x83h\x82\xAA off \x82̎\x9E\x82ɗ\x98\x97p\x82\xB3\x82\xEA\x82\xE9\x81B
+ */
+static void SendBroadcastMessageToSelected(HWND HVTWin, HWND hWnd, int parent_only, char *buf, int buflen)
+{
+	int i;
+	int count;
+	HWND hd;
+	COPYDATASTRUCT cds;
+
+	ZeroMemory(&cds, sizeof(cds));
+	cds.dwData = IPC_BROADCAST_COMMAND;
+	cds.cbData = buflen;
+	cds.lpData = buf;
+
+	if (parent_only) {
+		// \x90e\x83E\x83B\x83\x93\x83h\x83E\x82݂̂\xC9 WM_COPYDATA \x83\x81\x83b\x83Z\x81[\x83W\x82𑗂\xE9
+		SendMessage(GetParent(hWnd), WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
+	}
+	else {
+		// \x83_\x83C\x83A\x83\x8D\x83O\x82őI\x91\xF0\x82\xB3\x82ꂽ\x83E\x83B\x83\x93\x83h\x83E\x82Ƀ\x81\x83b\x83Z\x81[\x83W\x82𑗂\xE9
+		count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
+		for (i = 0 ; i < count ; i++) {
+			// \x83\x8A\x83X\x83g\x83{\x83b\x83N\x83X\x82őI\x91\xF0\x82\xB3\x82\xEA\x82Ă\xA2\x82邩
+			if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
+				if ((hd = GetNthWin(i)) != NULL) {
+					// WM_COPYDATA\x82\xF0\x8Eg\x82\xC1\x82āA\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82\xF0\x8Ds\x82\xA4\x81B
+					SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
+				}
+			}
+		}
+	}
+}
+
+/*
+ * \x91S Tera Term \x82փ\x81\x83b\x83Z\x81[\x83W\x82𑗐M\x82\xB7\x82\xE9\x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x83\x82\x81[\x83h\x81B
+ * "sendbroadcast"\x83}\x83N\x83\x8D\x83R\x83}\x83\x93\x83h\x82\xA9\x82\xE7\x82̂ݗ\x98\x97p\x82\xB3\x82\xEA\x82\xE9\x81B
+ */
+void SendBroadcastMessage(HWND HVTWin, HWND hWnd, char *buf, int buflen)
+{
+	int i, count;
+	HWND hd;
+	COPYDATASTRUCT cds;
+
+	ZeroMemory(&cds, sizeof(cds));
+	cds.dwData = IPC_BROADCAST_COMMAND;
+	cds.cbData = buflen;
+	cds.lpData = buf;
+
+	count = GetRegisteredWindowCount();
+
+	// \x91S Tera Term \x82փ\x81\x83b\x83Z\x81[\x83W\x82𑗂\xE9\x81B
+	for (i = 0 ; i < count ; i++) {
+		if ((hd = GetNthWin(i)) == NULL) {
+			break;
+		}
+		// WM_COPYDATA\x82\xF0\x8Eg\x82\xC1\x82āA\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82\xF0\x8Ds\x82\xA4\x81B
+		SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
+	}
+}
+
+
+/*
+ * \x94C\x88ӂ\xCC Tera Term \x8CQ\x82փ\x81\x83b\x83Z\x81[\x83W\x82𑗐M\x82\xB7\x82\xE9\x83}\x83\x8B\x83`\x83L\x83\x83\x83X\x83g\x83\x82\x81[\x83h\x81B\x8C\xB5\x96\xA7\x82ɂ́A
+ * \x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x91\x97\x90M\x82\xF0\x8Ds\x82\xA2\x81A\x8E\xF3\x90M\x91\xA4\x82Ń\x81\x83b\x83Z\x81[\x83W\x82\xF0\x8E\xE6\x8ȆI\x91\xF0\x82\xB7\x82\xE9\x81B
+ * "sendmulticast"\x83}\x83N\x83\x8D\x83R\x83}\x83\x93\x83h\x82\xA9\x82\xE7\x82̂ݗ\x98\x97p\x82\xB3\x82\xEA\x82\xE9\x81B
+ */
+void SendMulticastMessage(HWND hVTWin_, HWND hWnd, char *name, char *buf, int buflen)
+{
+	int i, count;
+	HWND hd;
+	COPYDATASTRUCT cds;
+	char *msg = NULL;
+	int msglen, nlen;
+
+	/* \x91\x97\x90M\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x8D\\x92z\x82\xB7\x82\xE9\x81B
+	 *
+	 * msg
+	 * +------+--------------+--+
+	 * |name\0|buf           |\0|
+	 * +------+--------------+--+
+	 * <--------------------->
+	 * msglen = strlen(name) + 1 + buflen
+	 * buf\x82̒\xBC\x8C\xE3\x82ɂ\xCD \0 \x82͕t\x82\xA9\x82Ȃ\xA2\x81B
+	 */
+	nlen = strlen(name) + 1;
+	msglen = nlen + buflen;
+	if ((msg = (char *)malloc(msglen)) == NULL) {
+		return;
+	}
+	strcpy_s(msg, msglen, name);
+	memcpy_s(msg + nlen, msglen - nlen, buf, buflen);
+
+	ZeroMemory(&cds, sizeof(cds));
+	cds.dwData = IPC_MULTICAST_COMMAND;
+	cds.cbData = msglen;
+	cds.lpData = msg;
+
+	count = GetRegisteredWindowCount();
+
+	// \x82\xB7\x82ׂĂ\xCCTera Term\x82Ƀ\x81\x83b\x83Z\x81[\x83W\x82ƃf\x81[\x83^\x82𑗂\xE9
+	for (i = 0 ; i < count ; i++) {
+		if ((hd = GetNthWin(i)) == NULL) {
+			break;
+		}
+
+		// WM_COPYDATA\x82\xF0\x8Eg\x82\xC1\x82āA\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82\xF0\x8Ds\x82\xA4\x81B
+		SendMessage(hd, WM_COPYDATA, (WPARAM)hVTWin_, (LPARAM)&cds);
+	}
+
+	free(msg);
+}
+
+void SetMulticastName(char *name)
+{
+	strncpy_s(ts.MulticastName, sizeof(ts.MulticastName), name, _TRUNCATE);
+}
+
+static int CompareMulticastName(char *name)
+{
+	return strcmp(ts.MulticastName, name);
+}
+
+//
+// \x82\xB7\x82ׂẴ^\x81[\x83~\x83i\x83\x8B\x82֓\xAF\x88\xEA\x83R\x83}\x83\x93\x83h\x82𑗐M\x82\xB7\x82郂\x81[\x83h\x83\x8C\x83X\x83_\x83C\x83A\x83\x8D\x83O\x82̕\\x8E\xA6
+// (2005.1.22 yutaka)
+//
+static LRESULT CALLBACK BroadcastCommandDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
+{
+	static const DlgTextInfo TextInfos[] = {
+		{ 0, "DLG_BROADCAST_TITLE" },
+		{ IDC_HISTORY_CHECK, "DLG_BROADCAST_HISTORY" },
+		{ IDC_ENTERKEY_CHECK, "DLG_BROADCAST_ENTER" },
+		{ IDC_PARENT_ONLY, "DLG_BROADCAST_PARENTONLY" },
+		{ IDC_REALTIME_CHECK, "DLG_BROADCAST_REALTIME" },
+		{ IDOK, "DLG_BROADCAST_SUBMIT" },
+		{ IDCANCEL, "BTN_CLOSE" },
+	};
+	char buf[256 + 3];
+	UINT ret;
+	LRESULT checked;
+	LRESULT history;
+	char historyfile[MAX_PATH];
+	static HWND hwndBroadcast     = NULL; // Broadcast dropdown
+	static HWND hwndBroadcastEdit = NULL; // Edit control on Broadcast dropdown
+	// for resize
+	RECT rc_dlg, rc, rc_ok;
+	POINT p;
+	static int ok2right, cancel2right, cmdlist2ok, list2bottom, list2right;
+	// for update list
+	const int list_timer_id = 100;
+	const int list_timer_tick = 1000; // msec
+	static int prev_instances = 0;
+	// for status bar
+	static HWND hStatus = NULL;
+	static int init_width, init_height;
+
+	switch (msg) {
+		case WM_SHOWWINDOW:
+			if (wp) {  // show
+				// Tera Term window list
+				UpdateBroadcastWindowList(GetDlgItem(hWnd, IDC_LIST));
+				return TRUE;
+			}
+			break;
+
+		case WM_INITDIALOG:
+			// \x83\x89\x83W\x83I\x83{\x83^\x83\x93\x82̃f\x83t\x83H\x83\x8B\x83g\x82\xCD CR \x82ɂ\xB7\x82\xE9\x81B
+			SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_SETCHECK, BST_CHECKED, 0);
+			// \x83f\x83t\x83H\x83\x8B\x83g\x82Ń`\x83F\x83b\x83N\x83{\x83b\x83N\x83X\x82\xF0 checked \x8F\xF3\x91Ԃɂ\xB7\x82\xE9\x81B
+			SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
+			// history \x82𔽉f\x82\xB7\x82\xE9 (2007.3.3 maya)
+			if (ts.BroadcastCommandHistory) {
+				SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
+			}
+			GetDefaultFName(ts.HomeDir, BROADCAST_LOGFILE, historyfile, sizeof(historyfile));
+			ApplyBroadCastCommandHisotry(hWnd, historyfile);
+
+			// \x83G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x82\xA0\x82Ă\xE9
+			SetFocus(GetDlgItem(hWnd, IDC_COMMAND_EDIT));
+
+			// \x83T\x83u\x83N\x83\x89\x83X\x89\xBB\x82\xB3\x82\xB9\x82ă\x8A\x83A\x83\x8B\x83^\x83C\x83\x80\x83\x82\x81[\x83h\x82ɂ\xB7\x82\xE9 (2008.1.21 yutaka)
+			hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
+			hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
+			OrigBroadcastEditProc = (WNDPROC)GetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC);
+			SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
+			// \x83f\x83t\x83H\x83\x8B\x83g\x82\xCDon\x81B\x8Ec\x82\xE8\x82\xCDdisable\x81B
+			SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_SETCHECK, BST_CHECKED, 0);  // default on
+			EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
+			EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
+			EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
+			EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
+			EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
+			EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
+
+			// Tera Term window list
+			BroadcastWindowList = GetDlgItem(hWnd, IDC_LIST);
+			UpdateBroadcastWindowList(BroadcastWindowList);
+
+			// I18N
+			SetDlgTexts(hWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
+
+			// \x83_\x83C\x83A\x83\x8D\x83O\x82̏\x89\x8A\xFA\x83T\x83C\x83Y\x82\xF0\x95ۑ\xB6
+			GetWindowRect(hWnd, &rc_dlg);
+			init_width = rc_dlg.right - rc_dlg.left;
+			init_height = rc_dlg.bottom - rc_dlg.top;
+
+			// \x8C\xBB\x8D݃T\x83C\x83Y\x82\xA9\x82\xE7\x95K\x97v\x82Ȓl\x82\xF0\x8Cv\x8EZ
+			GetClientRect(hWnd, &rc_dlg);
+			p.x = rc_dlg.right;
+			p.y = rc_dlg.bottom;
+			ClientToScreen(hWnd, &p);
+
+			GetWindowRect(GetDlgItem(hWnd, IDOK), &rc_ok);
+			ok2right = p.x - rc_ok.left;
+
+			GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
+			cancel2right = p.x - rc.left;
+
+			GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
+			cmdlist2ok = rc_ok.left - rc.right;
+
+			GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
+			list2bottom = p.y - rc.bottom;
+			list2right = p.x - rc.right;
+
+			// \x83\x8A\x83T\x83C\x83Y\x83A\x83C\x83R\x83\x93\x82\xF0\x89E\x89\xBA\x82ɕ\\x8E\xA6\x82\xB3\x82\xB9\x82\xBD\x82\xA2\x82̂ŁA\x83X\x83e\x81[\x83^\x83X\x83o\x81[\x82\xF0\x95t\x82\xAF\x82\xE9\x81B
+			InitCommonControls();
+			hStatus = CreateStatusWindow(
+				WS_CHILD | WS_VISIBLE |
+				CCS_BOTTOM | SBARS_SIZEGRIP, NULL, hWnd, 1);
+
+			// \x83\x8A\x83X\x83g\x8DX\x90V\x83^\x83C\x83}\x81[\x82̊J\x8En
+			SetTimer(hWnd, list_timer_id, list_timer_tick, NULL);
+
+			return FALSE;
+
+		case WM_COMMAND:
+			switch (wp) {
+			case IDC_ENTERKEY_CHECK | (BN_CLICKED << 16):
+				// \x83`\x83F\x83b\x83N\x82̗L\x96\xB3\x82ɂ\xE6\x82\xE8\x81A\x83\x89\x83W\x83I\x83{\x83^\x83\x93\x82̗L\x8C\xF8\x81E\x96\xB3\x8C\xF8\x82\xF0\x8C\x88\x82߂\xE9\x81B
+				checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
+				if (checked & BST_CHECKED) { // \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xA0\x82\xE8
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
+
+				} else {
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
+				}
+				return TRUE;
+
+			case IDC_REALTIME_CHECK | (BN_CLICKED << 16):
+				checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
+				if (checked & BST_CHECKED) { // check\x82\xA0\x82\xE8
+					// new handler
+					hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
+					hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
+					OrigBroadcastEditProc = (WNDPROC)GetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC);
+					SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
+
+					EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
+					EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE);  // true
+				} else {
+					// restore old handler
+					SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
+
+					EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), TRUE);
+					EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE);  // true
+				}
+				return TRUE;
+			}
+
+			switch (LOWORD(wp)) {
+				case IDOK:
+					{
+						memset(buf, 0, sizeof(buf));
+
+						// realtime mode\x82̏ꍇ\x81AEnter key\x82̂ݑ\x97\x82\xE9\x81B
+						// cf. http://logmett.com/forum/viewtopic.php?f=8&t=1601
+						// (2011.3.14 hirata)
+						checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
+						if (checked & BST_CHECKED) { // check\x82\xA0\x82\xE8
+							strncpy_s(buf, sizeof(buf), "\n", _TRUNCATE);
+							SetDlgItemText(hWnd, IDC_COMMAND_EDIT, "");
+							goto skip;
+						}
+
+						ret = GetDlgItemText(hWnd, IDC_COMMAND_EDIT, buf, 256 - 1);
+						if (ret == 0) { // error
+							memset(buf, 0, sizeof(buf));
+						}
+
+						// \x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x83R\x83}\x83\x93\x83h\x82̗\x9A\x97\xF0\x82\xF0\x95ۑ\xB6 (2007.3.3 maya)
+						history = SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_GETCHECK, 0, 0);
+						if (history) {
+							GetDefaultFName(ts.HomeDir, BROADCAST_LOGFILE, historyfile, sizeof(historyfile));
+							if (LoadTTSET()) {
+								(*AddValueToList)(historyfile, buf, "BroadcastCommands", "Command",
+								                  ts.MaxBroadcatHistory);
+								FreeTTSET();
+							}
+							ApplyBroadCastCommandHisotry(hWnd, historyfile);
+							ts.BroadcastCommandHistory = TRUE;
+						}
+						else {
+							ts.BroadcastCommandHistory = FALSE;
+						}
+						checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
+						if (checked & BST_CHECKED) { // \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xA0\x82\xE8
+							if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CRLF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
+								strncat_s(buf, sizeof(buf), "\r\n", _TRUNCATE);
+
+							} else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_GETCHECK, 0, 0) & BST_CHECKED) {
+								strncat_s(buf, sizeof(buf), "\r", _TRUNCATE);
+
+							} else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_LF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
+								strncat_s(buf, sizeof(buf), "\n", _TRUNCATE);
+
+							} else {
+								strncat_s(buf, sizeof(buf), "\r", _TRUNCATE);
+
+							}
+						}
+
+skip:;
+						// 337: 2007/03/20 \x83`\x83F\x83b\x83N\x82\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x82\xE7\x90e\x83E\x83B\x83\x93\x83h\x83E\x82ɂ̂ݑ\x97\x90M
+						checked = SendMessage(GetDlgItem(hWnd, IDC_PARENT_ONLY), BM_GETCHECK, 0, 0);
+
+						SendBroadcastMessageToSelected(HVTWin, hWnd, checked, buf, strlen(buf));
+					}
+
+					// \x83\x82\x81[\x83h\x83\x8C\x83X\x83_\x83C\x83A\x83\x8D\x83O\x82͈\xEA\x93x\x90\xB6\x90\xAC\x82\xB3\x82\xEA\x82\xE9\x82ƁA\x83A\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x82\xAA\x8FI\x97\xB9\x82\xB7\x82\xE9\x82܂\xC5
+					// \x94j\x8A\xFC\x82\xB3\x82\xEA\x82Ȃ\xA2\x82̂ŁA\x88ȉ\xBA\x82́u\x83E\x83B\x83\x93\x83h\x83E\x83v\x83\x8D\x83V\x81[\x83W\x83\x83\x96߂\xB5\x81v\x82͕s\x97v\x82Ǝv\x82\xED\x82\xEA\x82\xE9\x81B(yutaka)
+#if 0
+					SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
+#endif
+
+					//EndDialog(hDlgWnd, IDOK);
+					return TRUE;
+
+				case IDCANCEL:
+					EndDialog(hWnd, 0);
+					//DestroyWindow(hWnd);
+
+					return TRUE;
+
+				case IDC_COMMAND_EDIT:
+					if (HIWORD(wp) == CBN_DROPDOWN) {
+						GetDefaultFName(ts.HomeDir, BROADCAST_LOGFILE, historyfile, sizeof(historyfile));
+						ApplyBroadCastCommandHisotry(hWnd, historyfile);
+					}
+					return FALSE;
+
+				case IDC_LIST:
+					// \x88\xEA\x94ʓI\x82ȃA\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x82Ɠ\xAF\x82\xB6\x91\x80\x8D슴\x82\xF0\x8E\x9D\x82\xBD\x82\xB9\x82邽\x82߁A
+					// \x81uSHIFT+\x83N\x83\x8A\x83b\x83N\x81v\x82ɂ\xE6\x82\xE9\x98A\x91\xB1\x93I\x82ȑI\x91\xF0\x82\xF0\x83T\x83|\x81[\x83g\x82\xB7\x82\xE9\x81B
+					// (2009.9.28 yutaka)
+					if (HIWORD(wp) == LBN_SELCHANGE && ShiftKey()) {
+						int i, cur, prev;
+
+						cur = ListBox_GetCurSel(BroadcastWindowList);
+						prev = -1;
+						for (i = cur - 1 ; i >= 0 ; i--) {
+							if (ListBox_GetSel(BroadcastWindowList, i)) {
+								prev = i;
+								break;
+							}
+						}
+						if (prev != -1) {
+							// \x82\xB7\x82łɑI\x91\xF0\x8Dς݂̉ӏ\x8A\x82\xAA\x82\xA0\x82\xEA\x82΁A\x82\xBB\x82\xB1\x82\xA9\x82\xE7\x98A\x91\xB1\x91I\x91\xF0\x82\xB7\x82\xE9\x81B
+							for (i = prev ; i < cur ; i++) {
+								ListBox_SetSel(BroadcastWindowList, TRUE, i);
+							}
+						}
+					}
+
+					return FALSE;
+
+				default:
+					return FALSE;
+			}
+			break;
+
+		case WM_CLOSE:
+			//DestroyWindow(hWnd);
+			EndDialog(hWnd, 0);
+			return TRUE;
+
+		case WM_SIZE:
+			{
+				// \x8DĔz\x92u
+				int dlg_w, dlg_h;
+				RECT rc_dlg;
+				RECT rc;
+				POINT p;
+
+				// \x90V\x82\xB5\x82\xA2\x83_\x83C\x83A\x83\x8D\x83O\x82̃T\x83C\x83Y\x82𓾂\xE9
+				GetClientRect(hWnd, &rc_dlg);
+				dlg_w = rc_dlg.right;
+				dlg_h = rc_dlg.bottom;
+
+				// OK button
+				GetWindowRect(GetDlgItem(hWnd, IDOK), &rc);
+				p.x = rc.left;
+				p.y = rc.top;
+				ScreenToClient(hWnd, &p);
+				SetWindowPos(GetDlgItem(hWnd, IDOK), 0,
+				             dlg_w - ok2right, p.y, 0, 0,
+				             SWP_NOSIZE | SWP_NOZORDER);
+
+				// Cancel button
+				GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
+				p.x = rc.left;
+				p.y = rc.top;
+				ScreenToClient(hWnd, &p);
+				SetWindowPos(GetDlgItem(hWnd, IDCANCEL), 0,
+				             dlg_w - cancel2right, p.y, 0, 0,
+				             SWP_NOSIZE | SWP_NOZORDER);
+
+				// Command Edit box
+				GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
+				p.x = rc.left;
+				p.y = rc.top;
+				ScreenToClient(hWnd, &p);
+				SetWindowPos(GetDlgItem(hWnd, IDC_COMMAND_EDIT), 0,
+				             0, 0, dlg_w - p.x - ok2right - cmdlist2ok, p.y,
+				             SWP_NOMOVE | SWP_NOZORDER);
+
+				// List Edit box
+				GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
+				p.x = rc.left;
+				p.y = rc.top;
+				ScreenToClient(hWnd, &p);
+				SetWindowPos(GetDlgItem(hWnd, IDC_LIST), 0,
+				             0, 0, dlg_w - p.x - list2right , dlg_h - p.y - list2bottom,
+				             SWP_NOMOVE | SWP_NOZORDER);
+
+				// status bar
+				SendMessage(hStatus , msg , wp , lp);
+			}
+			return TRUE;
+
+		case WM_GETMINMAXINFO:
+			{
+				// \x83_\x83C\x83A\x83\x8D\x83O\x82̏\x89\x8A\xFA\x83T\x83C\x83Y\x82\xE6\x82菬\x82\xB3\x82\xAD\x82ł\xAB\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9
+				LPMINMAXINFO lpmmi;
+				lpmmi = (LPMINMAXINFO)lp;
+				lpmmi->ptMinTrackSize.x = init_width;
+				lpmmi->ptMinTrackSize.y = init_height;
+			}
+			return FALSE;
+
+		case WM_TIMER:
+			{
+				int n;
+
+				if (wp != list_timer_id)
+					break;
+
+				n = GetRegisteredWindowCount();
+				if (n != prev_instances) {
+					prev_instances = n;
+					UpdateBroadcastWindowList(BroadcastWindowList);
+				}
+			}
+			return TRUE;
+
+		case WM_VKEYTOITEM:
+			// \x83\x8A\x83X\x83g\x83{\x83b\x83N\x83X\x82ŃL\x81[\x89\x9F\x89\xBA(CTRL+A)\x82\xB3\x82ꂽ\x82\xE7\x81A\x91S\x91I\x91\xF0\x81B
+			if ((HWND)lp == BroadcastWindowList) {
+				if (ControlKey() && LOWORD(wp) == 'A') {
+					int i, n;
+
+					//OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
+					n = GetRegisteredWindowCount();
+					for (i = 0 ; i < n ; i++) {
+						ListBox_SetSel(BroadcastWindowList, TRUE, i);
+					}
+				}
+			}
+			return TRUE;
+
+		default:
+			//OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
+			return FALSE;
+	}
+	return TRUE;
+}
+
+static HWND hDlgWnd = NULL;
+
+void BroadCastShowDialog(HINSTANCE hInst, HWND hWnd)
+{
+	RECT prc, rc;
+	LONG x, y;
+
+	if (hDlgWnd != NULL) {
+		goto activate;
+	}
+
+	hDlgWnd = TTCreateDialog(hInst, MAKEINTRESOURCE(IDD_BROADCAST_DIALOG),
+							 hWnd, (DLGPROC)BroadcastCommandDlgProc);
+
+	if (hDlgWnd == NULL) {
+		return;
+	}
+
+	// \x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x83E\x83B\x83\x93\x83h\x83E\x82̐^\x8F\xE3\x82ɔz\x92u\x82\xB7\x82\xE9 (2008.1.25 yutaka)
+	::GetWindowRect(hWnd, &prc);
+	::GetWindowRect(hDlgWnd, &rc);
+	x = prc.left;
+	y = prc.top - (rc.bottom - rc.top);
+	if (y < 0) {
+		y = 0;
+	}
+	::SetWindowPos(hDlgWnd, NULL, x, y,  0, 0, SWP_NOSIZE | SWP_NOZORDER);
+
+activate:;
+	::ShowWindow(hDlgWnd, SW_SHOW);
+}
+
+BOOL BroadCastReceive(COPYDATASTRUCT *cds)
+{
+	char *buf, *msg, *name;
+	int buflen, msglen, nlen;
+	int sending = 0;
+
+	msglen = cds->cbData;
+	msg = (char *)cds->lpData;
+	if (cds->dwData == IPC_BROADCAST_COMMAND) {
+		buf = msg;
+		buflen = msglen;
+		sending = 1;
+
+	} else if (cds->dwData == IPC_MULTICAST_COMMAND) {
+		name = msg;
+		nlen = strlen(name) + 1;
+		buf = msg + nlen;
+		buflen = msglen - nlen;
+
+		// \x83}\x83\x8B\x83`\x83L\x83\x83\x83X\x83g\x96\xBC\x82\xF0\x83`\x83F\x83b\x83N\x82\xB7\x82\xE9
+		if (CompareMulticastName(name) == 0) {  // \x93\xAF\x82\xB6
+			sending = 1;
+		}
+	}
+
+	if (sending) {
+		// \x92[\x96\x96\x82֕\xB6\x8E\x9A\x97\xF1\x82𑗂荞\x82\xDE
+		// DDE\x92ʐM\x82Ɏg\x82\xA4\x8A֐\x94\x82ɕύX\x81B(2006.2.7 yutaka)
+		CBStartSend(buf, buflen, FALSE);
+		// \x91\x97\x90M\x83f\x81[\x83^\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82͑\x97\x90M\x82\xB7\x82\xE9
+		if (TalkStatus == IdTalkCB) {
+			CBSend();
+		}
+	}
+	return 1;
+}

Added: trunk/teraterm/teraterm/broadcast.h
===================================================================
--- trunk/teraterm/teraterm/broadcast.h	                        (rev 0)
+++ trunk/teraterm/teraterm/broadcast.h	2020-07-03 14:42:55 UTC (rev 8823)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2020 TeraTerm Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// vtwin\x82\xA9\x82番\x97\xA3
+#pragma once
+
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void SendBroadcastMessage(HWND HVTWin, HWND hWnd, char *buf, int buflen);
+void SendMulticastMessage(HWND HVTWin, HWND hWnd, char *name, char *buf, int buflen);
+void SetMulticastName(char *name);
+BOOL BroadCastReceive(COPYDATASTRUCT *cds);
+void BroadCastShowDialog(HINSTANCE hInst, HWND hWnd);
+
+#ifdef __cplusplus
+}
+#endif

Modified: trunk/teraterm/teraterm/ttdde.c
===================================================================
--- trunk/teraterm/teraterm/ttdde.c	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/ttdde.c	2020-07-03 14:42:55 UTC (rev 8823)
@@ -45,9 +45,8 @@
 #include "commlib.h"
 #include "sendmem.h"
 #include "codeconv.h"
+#include "broadcast.h"
 
-#include "vtwin.h"
-
 #define ServiceName "TERATERM"
 #define ItemName "DATA"
 #define ItemName2 "PARAM"

Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v16.vcxproj	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj	2020-07-03 14:42:55 UTC (rev 8823)
@@ -138,6 +138,7 @@
     <ClCompile Include="..\common\ttlib.c" />
     <ClCompile Include="..\susie_plugin\libsusieplugin.cpp" />
     <ClCompile Include="addsetting.cpp" />
+    <ClCompile Include="broadcast.cpp" />
     <ClCompile Include="buffer.c" />
     <ClCompile Include="clipboar.c" />
     <ClCompile Include="coding_pp.cpp" />
@@ -174,6 +175,7 @@
     <ClCompile Include="../ttpdlg/ttdlg.c" />
     <ClInclude Include="../ttpdlg/ttdlg.h" />
     <ClInclude Include="..\susie_plugin\libsusieplugin.h" />
+    <ClInclude Include="broadcast.h" />
     <ClInclude Include="coding_pp.h" />
     <ClInclude Include="coding_pp_res.h" />
     <ClInclude Include="font_pp.h" />

Modified: trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters
===================================================================
--- trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/ttermpro.v16.vcxproj.filters	2020-07-03 14:42:55 UTC (rev 8823)
@@ -144,6 +144,9 @@
     <ClCompile Include="..\susie_plugin\libsusieplugin.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="broadcast.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <Image Include="..\..\cygterm\cygterm.ico">
@@ -366,5 +369,8 @@
     <ClInclude Include="..\susie_plugin\libsusieplugin.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="broadcast.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>
\ No newline at end of file

Modified: trunk/teraterm/teraterm/ttermpro.vcproj
===================================================================
--- trunk/teraterm/teraterm/ttermpro.vcproj	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/ttermpro.vcproj	2020-07-03 14:42:55 UTC (rev 8823)
@@ -209,6 +209,10 @@
 			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
 			>
 			<File
+				RelativePath=".\broadcast.cpp"
+				>
+			</File>
+			<File
 				RelativePath="filesys.cpp"
 				>
 			</File>
@@ -375,6 +379,10 @@
 			Filter="h;hpp;hxx;hm;inl"
 			>
 			<File
+				RelativePath=".\broadcast.h"
+				>
+			</File>
+			<File
 				RelativePath=".\buffer.h"
 				>
 			</File>

Modified: trunk/teraterm/teraterm/vtwin.cpp
===================================================================
--- trunk/teraterm/teraterm/vtwin.cpp	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/vtwin.cpp	2020-07-03 14:42:55 UTC (rev 8823)
@@ -96,6 +96,7 @@
 #include "sendmem.h"
 #include "sendfiledlg.h"
 #include "setting.h"
+#include "broadcast.h"
 
 #include "initguid.h"
 //#include "Usbiodef.h"
@@ -107,12 +108,6 @@
 // \x83E\x83B\x83\x93\x83h\x83E\x8Dő剻\x83{\x83^\x83\x93\x82\xF0\x97L\x8C\xF8\x82ɂ\xB7\x82\xE9 (2005.1.15 yutaka)
 #define WINDOW_MAXMIMUM_ENABLED 1
 
-// WM_COPYDATA\x82ɂ\xE6\x82\xE9\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82̎\xED\x95\xCA (2005.1.22 yutaka)
-#define IPC_BROADCAST_COMMAND 1      // \x91S\x92[\x96\x96\x82֑\x97\x90M
-#define IPC_MULTICAST_COMMAND 2      // \x94C\x88ӂ̒[\x96\x96\x8CQ\x82֑\x97\x90M
-
-#define BROADCAST_LOGFILE "broadcast.log"
-
 static BOOL TCPLocalEchoUsed = FALSE;
 static BOOL TCPCRSendUsed = FALSE;
 
@@ -5449,661 +5444,14 @@
 	CommResetSerial(&ts, &cv, TRUE);
 }
 
-void ApplyBroadCastCommandHisotry(HWND Dialog, char *historyfile)
-{
-	char EntName[13];
-	char Command[HostNameMaxLength+1];
-	int i = 1;
-
-	SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_RESETCONTENT, 0, 0);
-	do {
-		_snprintf_s(EntName, sizeof(EntName), _TRUNCATE, "Command%d", i);
-		GetPrivateProfileString("BroadcastCommands",EntName,"",
-		                        Command,sizeof(Command), historyfile);
-		if (strlen(Command) > 0) {
-			SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_ADDSTRING,
-			                   0, (LPARAM)Command);
-		}
-		i++;
-	} while ((i <= ts.MaxBroadcatHistory) && (strlen(Command)>0));
-
-	SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, EM_LIMITTEXT,
-	                   HostNameMaxLength-1, 0);
-
-	SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_SETCURSEL,0,0);
-}
-
-// \x83h\x83\x8D\x83b\x83v\x83_\x83E\x83\x93\x82̒\x86\x82̃G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82\xF0
-// \x83T\x83u\x83N\x83\x89\x83X\x89\xBB\x82\xB7\x82邽\x82߂̃E\x83C\x83\x93\x83h\x83E\x83v\x83\x8D\x83V\x81[\x83W\x83\x83
-static WNDPROC OrigBroadcastEditProc; // Original window procedure
-static HWND BroadcastWindowList;
-static LRESULT CALLBACK BroadcastEditProc(HWND dlg, UINT msg,
-                                          WPARAM wParam, LPARAM lParam)
-{
-	char buf[1024];
-	int len;
-
-	switch (msg) {
-		case WM_CREATE:
-			break;
-
-		case WM_DESTROY:
-			break;
-
-		case WM_LBUTTONUP:
-			// \x82\xB7\x82łɃe\x83L\x83X\x83g\x82\xAA\x93\xFC\x97͂\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x8Fꍇ\x82́A\x83J\x81[\x83\\x83\x8B\x82𖖔\xF6\x82ֈړ\xAE\x82\xB3\x82\xB9\x82\xE9\x81B
-			len = GetWindowText(dlg, buf, sizeof(buf));
-			SendMessage(dlg, EM_SETSEL, len, len);
-			SetFocus(dlg);
-			break;
-
-		case WM_LBUTTONDOWN:
-		case WM_RBUTTONDOWN:
-		case WM_RBUTTONUP:
-			SetFocus(dlg);
-			break;
-
-		case WM_KEYDOWN:
-		case WM_KEYUP:
-		case WM_SYSKEYDOWN:
-		case WM_SYSKEYUP:
-			{
-				int i;
-				HWND hd;
-				int count;
-
-				if (wParam == 0x0d) {  // Enter key
-					SetWindowText(dlg, "");
-					SendMessage(dlg, EM_SETSEL, 0, 0);
-				}
-
-				count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
-				for (i = 0 ; i < count ; i++) {
-					if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
-						hd = GetNthWin(i);
-						if (hd) {
-							PostMessage(hd, msg, wParam, lParam);
-						}
-					}
-				}
-			}
-			break;
-
-		case WM_CHAR:
-			// \x93\xFC\x97͂\xB5\x82\xBD\x95\xB6\x8E\x9A\x82\xAAIDC_COMMAND_EDIT\x82Ɏc\x82\xE7\x82Ȃ\xA2\x82悤\x82Ɏ̂Ă\xE9
-			return FALSE;
-
-		default:
-			return CallWindowProc(OrigBroadcastEditProc, dlg, msg, wParam, lParam);
-	}
-
-	return FALSE;
-}
-
-static void UpdateBroadcastWindowList(HWND hWnd)
-{
-	int i, count;
-	HWND hd;
-	TCHAR szWindowText[256];
-
-	SendMessage(hWnd, LB_RESETCONTENT, 0, 0);
-
-	count = GetRegisteredWindowCount();
-	for (i = 0 ; i < count ; i++) {
-		hd = GetNthWin(i);
-		if (hd == NULL) {
-			break;
-		}
-
-		GetWindowText(hd, szWindowText, 256);
-		SendMessage(hWnd, LB_INSERTSTRING, -1, (LPARAM)szWindowText);
-	}
-}
-
-/*
- * \x83_\x83C\x83A\x83\x8D\x83O\x82őI\x91\xF0\x82\xB3\x82ꂽ\x83E\x83B\x83\x93\x83h\x83E\x82̂݁A\x82\xE0\x82\xB5\x82\xAD\x82͐e\x83E\x83B\x83\x93\x83h\x83E\x82݂̂ɑ\x97\x82\xE9\x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x83\x82\x81[\x83h\x81B
- * \x83\x8A\x83A\x83\x8B\x83^\x83C\x83\x80\x83\x82\x81[\x83h\x82\xAA off \x82̎\x9E\x82ɗ\x98\x97p\x82\xB3\x82\xEA\x82\xE9\x81B
- */
-void SendBroadcastMessageToSelected(HWND HVTWin, HWND hWnd, int parent_only, char *buf, int buflen)
-{
-	int i;
-	int count;
-	HWND hd;
-	COPYDATASTRUCT cds;
-
-	ZeroMemory(&cds, sizeof(cds));
-	cds.dwData = IPC_BROADCAST_COMMAND;
-	cds.cbData = buflen;
-	cds.lpData = buf;
-
-	if (parent_only) {
-		// \x90e\x83E\x83B\x83\x93\x83h\x83E\x82݂̂\xC9 WM_COPYDATA \x83\x81\x83b\x83Z\x81[\x83W\x82𑗂\xE9
-		SendMessage(GetParent(hWnd), WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
-	}
-	else {
-		// \x83_\x83C\x83A\x83\x8D\x83O\x82őI\x91\xF0\x82\xB3\x82ꂽ\x83E\x83B\x83\x93\x83h\x83E\x82Ƀ\x81\x83b\x83Z\x81[\x83W\x82𑗂\xE9
-		count = SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
-		for (i = 0 ; i < count ; i++) {
-			// \x83\x8A\x83X\x83g\x83{\x83b\x83N\x83X\x82őI\x91\xF0\x82\xB3\x82\xEA\x82Ă\xA2\x82邩
-			if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
-				if ((hd = GetNthWin(i)) != NULL) {
-					// WM_COPYDATA\x82\xF0\x8Eg\x82\xC1\x82āA\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82\xF0\x8Ds\x82\xA4\x81B
-					SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
-				}
-			}
-		}
-	}
-}
-
-/*
- * \x91S Tera Term \x82փ\x81\x83b\x83Z\x81[\x83W\x82𑗐M\x82\xB7\x82\xE9\x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x83\x82\x81[\x83h\x81B
- * "sendbroadcast"\x83}\x83N\x83\x8D\x83R\x83}\x83\x93\x83h\x82\xA9\x82\xE7\x82̂ݗ\x98\x97p\x82\xB3\x82\xEA\x82\xE9\x81B
- */
-void SendBroadcastMessage(HWND HVTWin, HWND hWnd, char *buf, int buflen)
-{
-	int i, count;
-	HWND hd;
-	COPYDATASTRUCT cds;
-
-	ZeroMemory(&cds, sizeof(cds));
-	cds.dwData = IPC_BROADCAST_COMMAND;
-	cds.cbData = buflen;
-	cds.lpData = buf;
-
-	count = GetRegisteredWindowCount();
-
-	// \x91S Tera Term \x82փ\x81\x83b\x83Z\x81[\x83W\x82𑗂\xE9\x81B
-	for (i = 0 ; i < count ; i++) {
-		if ((hd = GetNthWin(i)) == NULL) {
-			break;
-		}
-		// WM_COPYDATA\x82\xF0\x8Eg\x82\xC1\x82āA\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82\xF0\x8Ds\x82\xA4\x81B
-		SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)&cds);
-	}
-}
-
-
-/*
- * \x94C\x88ӂ\xCC Tera Term \x8CQ\x82փ\x81\x83b\x83Z\x81[\x83W\x82𑗐M\x82\xB7\x82\xE9\x83}\x83\x8B\x83`\x83L\x83\x83\x83X\x83g\x83\x82\x81[\x83h\x81B\x8C\xB5\x96\xA7\x82ɂ́A
- * \x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x91\x97\x90M\x82\xF0\x8Ds\x82\xA2\x81A\x8E\xF3\x90M\x91\xA4\x82Ń\x81\x83b\x83Z\x81[\x83W\x82\xF0\x8E\xE6\x8ȆI\x91\xF0\x82\xB7\x82\xE9\x81B
- * "sendmulticast"\x83}\x83N\x83\x8D\x83R\x83}\x83\x93\x83h\x82\xA9\x82\xE7\x82̂ݗ\x98\x97p\x82\xB3\x82\xEA\x82\xE9\x81B
- */
-void SendMulticastMessage(HWND hVTWin_, HWND hWnd, char *name, char *buf, int buflen)
-{
-	int i, count;
-	HWND hd;
-	COPYDATASTRUCT cds;
-	char *msg = NULL;
-	int msglen, nlen;
-
-	/* \x91\x97\x90M\x83\x81\x83b\x83Z\x81[\x83W\x82\xF0\x8D\\x92z\x82\xB7\x82\xE9\x81B
-	 *
-	 * msg
-	 * +------+--------------+--+
-	 * |name\0|buf           |\0|
-	 * +------+--------------+--+
-	 * <--------------------->
-	 * msglen = strlen(name) + 1 + buflen
-	 * buf\x82̒\xBC\x8C\xE3\x82ɂ\xCD \0 \x82͕t\x82\xA9\x82Ȃ\xA2\x81B
-	 */
-	nlen = strlen(name) + 1;
-	msglen = nlen + buflen;
-	if ((msg = (char *)malloc(msglen)) == NULL) {
-		return;
-	}
-	strcpy_s(msg, msglen, name);
-	memcpy_s(msg + nlen, msglen - nlen, buf, buflen);
-
-	ZeroMemory(&cds, sizeof(cds));
-	cds.dwData = IPC_MULTICAST_COMMAND;
-	cds.cbData = msglen;
-	cds.lpData = msg;
-
-	count = GetRegisteredWindowCount();
-
-	// \x82\xB7\x82ׂĂ\xCCTera Term\x82Ƀ\x81\x83b\x83Z\x81[\x83W\x82ƃf\x81[\x83^\x82𑗂\xE9
-	for (i = 0 ; i < count ; i++) {
-		if ((hd = GetNthWin(i)) == NULL) {
-			break;
-		}
-
-		// WM_COPYDATA\x82\xF0\x8Eg\x82\xC1\x82āA\x83v\x83\x8D\x83Z\x83X\x8AԒʐM\x82\xF0\x8Ds\x82\xA4\x81B
-		SendMessage(hd, WM_COPYDATA, (WPARAM)hVTWin_, (LPARAM)&cds);
-	}
-
-	free(msg);
-}
-
-void SetMulticastName(char *name)
-{
-	strncpy_s(ts.MulticastName, sizeof(ts.MulticastName), name, _TRUNCATE);
-}
-
-static int CompareMulticastName(char *name)
-{
-	return strcmp(ts.MulticastName, name);
-}
-
-//
-// \x82\xB7\x82ׂẴ^\x81[\x83~\x83i\x83\x8B\x82֓\xAF\x88\xEA\x83R\x83}\x83\x93\x83h\x82𑗐M\x82\xB7\x82郂\x81[\x83h\x83\x8C\x83X\x83_\x83C\x83A\x83\x8D\x83O\x82̕\\x8E\xA6
-// (2005.1.22 yutaka)
-//
-static LRESULT CALLBACK BroadcastCommandDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
-{
-	static const DlgTextInfo TextInfos[] = {
-		{ 0, "DLG_BROADCAST_TITLE" },
-		{ IDC_HISTORY_CHECK, "DLG_BROADCAST_HISTORY" },
-		{ IDC_ENTERKEY_CHECK, "DLG_BROADCAST_ENTER" },
-		{ IDC_PARENT_ONLY, "DLG_BROADCAST_PARENTONLY" },
-		{ IDC_REALTIME_CHECK, "DLG_BROADCAST_REALTIME" },
-		{ IDOK, "DLG_BROADCAST_SUBMIT" },
-		{ IDCANCEL, "BTN_CLOSE" },
-	};
-	char buf[256 + 3];
-	UINT ret;
-	LRESULT checked;
-	LRESULT history;
-	char historyfile[MAX_PATH];
-	static HWND hwndBroadcast     = NULL; // Broadcast dropdown
-	static HWND hwndBroadcastEdit = NULL; // Edit control on Broadcast dropdown
-	// for resize
-	RECT rc_dlg, rc, rc_ok;
-	POINT p;
-	static int ok2right, cancel2right, cmdlist2ok, list2bottom, list2right;
-	// for update list
-	const int list_timer_id = 100;
-	const int list_timer_tick = 1000; // msec
-	static int prev_instances = 0;
-	// for status bar
-	static HWND hStatus = NULL;
-	static int init_width, init_height;
-
-	switch (msg) {
-		case WM_SHOWWINDOW:
-			if (wp) {  // show
-				// Tera Term window list
-				UpdateBroadcastWindowList(GetDlgItem(hWnd, IDC_LIST));
-				return TRUE;
-			}
-			break;
-
-		case WM_INITDIALOG:
-			// \x83\x89\x83W\x83I\x83{\x83^\x83\x93\x82̃f\x83t\x83H\x83\x8B\x83g\x82\xCD CR \x82ɂ\xB7\x82\xE9\x81B
-			SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_SETCHECK, BST_CHECKED, 0);
-			// \x83f\x83t\x83H\x83\x8B\x83g\x82Ń`\x83F\x83b\x83N\x83{\x83b\x83N\x83X\x82\xF0 checked \x8F\xF3\x91Ԃɂ\xB7\x82\xE9\x81B
-			SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
-			// history \x82𔽉f\x82\xB7\x82\xE9 (2007.3.3 maya)
-			if (ts.BroadcastCommandHistory) {
-				SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
-			}
-			GetDefaultFName(ts.HomeDir, BROADCAST_LOGFILE, historyfile, sizeof(historyfile));
-			ApplyBroadCastCommandHisotry(hWnd, historyfile);
-
-			// \x83G\x83f\x83B\x83b\x83g\x83R\x83\x93\x83g\x83\x8D\x81[\x83\x8B\x82Ƀt\x83H\x81[\x83J\x83X\x82\xF0\x82\xA0\x82Ă\xE9
-			SetFocus(GetDlgItem(hWnd, IDC_COMMAND_EDIT));
-
-			// \x83T\x83u\x83N\x83\x89\x83X\x89\xBB\x82\xB3\x82\xB9\x82ă\x8A\x83A\x83\x8B\x83^\x83C\x83\x80\x83\x82\x81[\x83h\x82ɂ\xB7\x82\xE9 (2008.1.21 yutaka)
-			hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
-			hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
-			OrigBroadcastEditProc = (WNDPROC)GetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC);
-			SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
-			// \x83f\x83t\x83H\x83\x8B\x83g\x82\xCDon\x81B\x8Ec\x82\xE8\x82\xCDdisable\x81B
-			SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_SETCHECK, BST_CHECKED, 0);  // default on
-			EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
-			EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
-			EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
-			EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
-			EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
-			EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
-
-			// Tera Term window list
-			BroadcastWindowList = GetDlgItem(hWnd, IDC_LIST);
-			UpdateBroadcastWindowList(BroadcastWindowList);
-
-			// I18N
-			SetDlgTexts(hWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
-
-			// \x83_\x83C\x83A\x83\x8D\x83O\x82̏\x89\x8A\xFA\x83T\x83C\x83Y\x82\xF0\x95ۑ\xB6
-			GetWindowRect(hWnd, &rc_dlg);
-			init_width = rc_dlg.right - rc_dlg.left;
-			init_height = rc_dlg.bottom - rc_dlg.top;
-
-			// \x8C\xBB\x8D݃T\x83C\x83Y\x82\xA9\x82\xE7\x95K\x97v\x82Ȓl\x82\xF0\x8Cv\x8EZ
-			GetClientRect(hWnd, &rc_dlg);
-			p.x = rc_dlg.right;
-			p.y = rc_dlg.bottom;
-			ClientToScreen(hWnd, &p);
-
-			GetWindowRect(GetDlgItem(hWnd, IDOK), &rc_ok);
-			ok2right = p.x - rc_ok.left;
-
-			GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
-			cancel2right = p.x - rc.left;
-
-			GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
-			cmdlist2ok = rc_ok.left - rc.right;
-
-			GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
-			list2bottom = p.y - rc.bottom;
-			list2right = p.x - rc.right;
-
-			// \x83\x8A\x83T\x83C\x83Y\x83A\x83C\x83R\x83\x93\x82\xF0\x89E\x89\xBA\x82ɕ\\x8E\xA6\x82\xB3\x82\xB9\x82\xBD\x82\xA2\x82̂ŁA\x83X\x83e\x81[\x83^\x83X\x83o\x81[\x82\xF0\x95t\x82\xAF\x82\xE9\x81B
-			InitCommonControls();
-			hStatus = CreateStatusWindow(
-				WS_CHILD | WS_VISIBLE |
-				CCS_BOTTOM | SBARS_SIZEGRIP, NULL, hWnd, 1);
-
-			// \x83\x8A\x83X\x83g\x8DX\x90V\x83^\x83C\x83}\x81[\x82̊J\x8En
-			SetTimer(hWnd, list_timer_id, list_timer_tick, NULL);
-
-			return FALSE;
-
-		case WM_COMMAND:
-			switch (wp) {
-			case IDC_ENTERKEY_CHECK | (BN_CLICKED << 16):
-				// \x83`\x83F\x83b\x83N\x82̗L\x96\xB3\x82ɂ\xE6\x82\xE8\x81A\x83\x89\x83W\x83I\x83{\x83^\x83\x93\x82̗L\x8C\xF8\x81E\x96\xB3\x8C\xF8\x82\xF0\x8C\x88\x82߂\xE9\x81B
-				checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
-				if (checked & BST_CHECKED) { // \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xA0\x82\xE8
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
-
-				} else {
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
-				}
-				return TRUE;
-
-			case IDC_REALTIME_CHECK | (BN_CLICKED << 16):
-				checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
-				if (checked & BST_CHECKED) { // check\x82\xA0\x82\xE8
-					// new handler
-					hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
-					hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
-					OrigBroadcastEditProc = (WNDPROC)GetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC);
-					SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
-
-					EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
-					EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE);  // true
-				} else {
-					// restore old handler
-					SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
-
-					EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), TRUE);
-					EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE);  // true
-				}
-				return TRUE;
-			}
-
-			switch (LOWORD(wp)) {
-				case IDOK:
-					{
-						memset(buf, 0, sizeof(buf));
-
-						// realtime mode\x82̏ꍇ\x81AEnter key\x82̂ݑ\x97\x82\xE9\x81B
-						// cf. http://logmett.com/forum/viewtopic.php?f=8&t=1601
-						// (2011.3.14 hirata)
-						checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
-						if (checked & BST_CHECKED) { // check\x82\xA0\x82\xE8
-							strncpy_s(buf, sizeof(buf), "\n", _TRUNCATE);
-							SetDlgItemText(hWnd, IDC_COMMAND_EDIT, "");
-							goto skip;
-						}
-
-						ret = GetDlgItemText(hWnd, IDC_COMMAND_EDIT, buf, 256 - 1);
-						if (ret == 0) { // error
-							memset(buf, 0, sizeof(buf));
-						}
-
-						// \x83u\x83\x8D\x81[\x83h\x83L\x83\x83\x83X\x83g\x83R\x83}\x83\x93\x83h\x82̗\x9A\x97\xF0\x82\xF0\x95ۑ\xB6 (2007.3.3 maya)
-						history = SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_GETCHECK, 0, 0);
-						if (history) {
-							GetDefaultFName(ts.HomeDir, BROADCAST_LOGFILE, historyfile, sizeof(historyfile));
-							if (LoadTTSET()) {
-								(*AddValueToList)(historyfile, buf, "BroadcastCommands", "Command",
-								                  ts.MaxBroadcatHistory);
-								FreeTTSET();
-							}
-							ApplyBroadCastCommandHisotry(hWnd, historyfile);
-							ts.BroadcastCommandHistory = TRUE;
-						}
-						else {
-							ts.BroadcastCommandHistory = FALSE;
-						}
-						checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
-						if (checked & BST_CHECKED) { // \x89\xFC\x8Ds\x83R\x81[\x83h\x82\xA0\x82\xE8
-							if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CRLF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
-								strncat_s(buf, sizeof(buf), "\r\n", _TRUNCATE);
-
-							} else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_GETCHECK, 0, 0) & BST_CHECKED) {
-								strncat_s(buf, sizeof(buf), "\r", _TRUNCATE);
-
-							} else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_LF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
-								strncat_s(buf, sizeof(buf), "\n", _TRUNCATE);
-
-							} else {
-								strncat_s(buf, sizeof(buf), "\r", _TRUNCATE);
-
-							}
-						}
-
-skip:;
-						// 337: 2007/03/20 \x83`\x83F\x83b\x83N\x82\xB3\x82\xEA\x82Ă\xA2\x82\xBD\x82\xE7\x90e\x83E\x83B\x83\x93\x83h\x83E\x82ɂ̂ݑ\x97\x90M
-						checked = SendMessage(GetDlgItem(hWnd, IDC_PARENT_ONLY), BM_GETCHECK, 0, 0);
-
-						SendBroadcastMessageToSelected(HVTWin, hWnd, checked, buf, strlen(buf));
-					}
-
-					// \x83\x82\x81[\x83h\x83\x8C\x83X\x83_\x83C\x83A\x83\x8D\x83O\x82͈\xEA\x93x\x90\xB6\x90\xAC\x82\xB3\x82\xEA\x82\xE9\x82ƁA\x83A\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x82\xAA\x8FI\x97\xB9\x82\xB7\x82\xE9\x82܂\xC5
-					// \x94j\x8A\xFC\x82\xB3\x82\xEA\x82Ȃ\xA2\x82̂ŁA\x88ȉ\xBA\x82́u\x83E\x83B\x83\x93\x83h\x83E\x83v\x83\x8D\x83V\x81[\x83W\x83\x83\x96߂\xB5\x81v\x82͕s\x97v\x82Ǝv\x82\xED\x82\xEA\x82\xE9\x81B(yutaka)
-#if 0
-					SetWindowLongPtr(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
-#endif
-
-					//EndDialog(hDlgWnd, IDOK);
-					return TRUE;
-
-				case IDCANCEL:
-					EndDialog(hWnd, 0);
-					//DestroyWindow(hWnd);
-
-					return TRUE;
-
-				case IDC_COMMAND_EDIT:
-					if (HIWORD(wp) == CBN_DROPDOWN) {
-						GetDefaultFName(ts.HomeDir, BROADCAST_LOGFILE, historyfile, sizeof(historyfile));
-						ApplyBroadCastCommandHisotry(hWnd, historyfile);
-					}
-					return FALSE;
-
-				case IDC_LIST:
-					// \x88\xEA\x94ʓI\x82ȃA\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x82Ɠ\xAF\x82\xB6\x91\x80\x8D슴\x82\xF0\x8E\x9D\x82\xBD\x82\xB9\x82邽\x82߁A
-					// \x81uSHIFT+\x83N\x83\x8A\x83b\x83N\x81v\x82ɂ\xE6\x82\xE9\x98A\x91\xB1\x93I\x82ȑI\x91\xF0\x82\xF0\x83T\x83|\x81[\x83g\x82\xB7\x82\xE9\x81B
-					// (2009.9.28 yutaka)
-					if (HIWORD(wp) == LBN_SELCHANGE && ShiftKey()) {
-						int i, cur, prev;
-
-						cur = ListBox_GetCurSel(BroadcastWindowList);
-						prev = -1;
-						for (i = cur - 1 ; i >= 0 ; i--) {
-							if (ListBox_GetSel(BroadcastWindowList, i)) {
-								prev = i;
-								break;
-							}
-						}
-						if (prev != -1) {
-							// \x82\xB7\x82łɑI\x91\xF0\x8Dς݂̉ӏ\x8A\x82\xAA\x82\xA0\x82\xEA\x82΁A\x82\xBB\x82\xB1\x82\xA9\x82\xE7\x98A\x91\xB1\x91I\x91\xF0\x82\xB7\x82\xE9\x81B
-							for (i = prev ; i < cur ; i++) {
-								ListBox_SetSel(BroadcastWindowList, TRUE, i);
-							}
-						}
-					}
-
-					return FALSE;
-
-				default:
-					return FALSE;
-			}
-			break;
-
-		case WM_CLOSE:
-			//DestroyWindow(hWnd);
-			EndDialog(hWnd, 0);
-			return TRUE;
-
-		case WM_SIZE:
-			{
-				// \x8DĔz\x92u
-				int dlg_w, dlg_h;
-				RECT rc_dlg;
-				RECT rc;
-				POINT p;
-
-				// \x90V\x82\xB5\x82\xA2\x83_\x83C\x83A\x83\x8D\x83O\x82̃T\x83C\x83Y\x82𓾂\xE9
-				GetClientRect(hWnd, &rc_dlg);
-				dlg_w = rc_dlg.right;
-				dlg_h = rc_dlg.bottom;
-
-				// OK button
-				GetWindowRect(GetDlgItem(hWnd, IDOK), &rc);
-				p.x = rc.left;
-				p.y = rc.top;
-				ScreenToClient(hWnd, &p);
-				SetWindowPos(GetDlgItem(hWnd, IDOK), 0,
-				             dlg_w - ok2right, p.y, 0, 0,
-				             SWP_NOSIZE | SWP_NOZORDER);
-
-				// Cancel button
-				GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
-				p.x = rc.left;
-				p.y = rc.top;
-				ScreenToClient(hWnd, &p);
-				SetWindowPos(GetDlgItem(hWnd, IDCANCEL), 0,
-				             dlg_w - cancel2right, p.y, 0, 0,
-				             SWP_NOSIZE | SWP_NOZORDER);
-
-				// Command Edit box
-				GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
-				p.x = rc.left;
-				p.y = rc.top;
-				ScreenToClient(hWnd, &p);
-				SetWindowPos(GetDlgItem(hWnd, IDC_COMMAND_EDIT), 0,
-				             0, 0, dlg_w - p.x - ok2right - cmdlist2ok, p.y,
-				             SWP_NOMOVE | SWP_NOZORDER);
-
-				// List Edit box
-				GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
-				p.x = rc.left;
-				p.y = rc.top;
-				ScreenToClient(hWnd, &p);
-				SetWindowPos(GetDlgItem(hWnd, IDC_LIST), 0,
-				             0, 0, dlg_w - p.x - list2right , dlg_h - p.y - list2bottom,
-				             SWP_NOMOVE | SWP_NOZORDER);
-
-				// status bar
-				SendMessage(hStatus , msg , wp , lp);
-			}
-			return TRUE;
-
-		case WM_GETMINMAXINFO:
-			{
-				// \x83_\x83C\x83A\x83\x8D\x83O\x82̏\x89\x8A\xFA\x83T\x83C\x83Y\x82\xE6\x82菬\x82\xB3\x82\xAD\x82ł\xAB\x82Ȃ\xA2\x82悤\x82ɂ\xB7\x82\xE9
-				LPMINMAXINFO lpmmi;
-				lpmmi = (LPMINMAXINFO)lp;
-				lpmmi->ptMinTrackSize.x = init_width;
-				lpmmi->ptMinTrackSize.y = init_height;
-			}
-			return FALSE;
-
-		case WM_TIMER:
-			{
-				int n;
-
-				if (wp != list_timer_id)
-					break;
-
-				n = GetRegisteredWindowCount();
-				if (n != prev_instances) {
-					prev_instances = n;
-					UpdateBroadcastWindowList(BroadcastWindowList);
-				}
-			}
-			return TRUE;
-
-		case WM_VKEYTOITEM:
-			// \x83\x8A\x83X\x83g\x83{\x83b\x83N\x83X\x82ŃL\x81[\x89\x9F\x89\xBA(CTRL+A)\x82\xB3\x82ꂽ\x82\xE7\x81A\x91S\x91I\x91\xF0\x81B
-			if ((HWND)lp == BroadcastWindowList) {
-				if (ControlKey() && LOWORD(wp) == 'A') {
-					int i, n;
-
-					//OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
-					n = GetRegisteredWindowCount();
-					for (i = 0 ; i < n ; i++) {
-						ListBox_SetSel(BroadcastWindowList, TRUE, i);
-					}
-				}
-			}
-			return TRUE;
-
-		default:
-			//OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
-			return FALSE;
-	}
-	return TRUE;
-}
-
 void CVTWindow::OnControlBroadcastCommand(void)
 {
-	// TODO: \x83\x82\x81[\x83h\x83\x8C\x83X\x83_\x83C\x83A\x83\x8D\x83O\x82̃n\x83\x93\x83h\x83\x8B\x82́A\x90e\x83v\x83\x8D\x83Z\x83X\x82\xAA DestroyWindow() API\x82Ŕj\x8A\xFC\x82\xB7\x82\xE9
-	// \x95K\x97v\x82\xAA\x82\xA0\x82邪\x81A\x82\xB1\x82\xB1\x82\xCDOS\x94C\x82\xB9\x82Ƃ\xB7\x82\xE9\x81B
-	static HWND hDlgWnd = NULL;
-	RECT prc, rc;
-	LONG x, y;
-
-	if (hDlgWnd != NULL) {
-		goto activate;
-	}
-
-	hDlgWnd = TTCreateDialog(m_hInst, MAKEINTRESOURCE(IDD_BROADCAST_DIALOG),
-							 HVTWin, (DLGPROC)BroadcastCommandDlgProc);
-
-	if (hDlgWnd == NULL) {
-		return;
-	}
-
-	// \x83_\x83C\x83A\x83\x8D\x83O\x82\xF0\x83E\x83B\x83\x93\x83h\x83E\x82̐^\x8F\xE3\x82ɔz\x92u\x82\xB7\x82\xE9 (2008.1.25 yutaka)
-	GetWindowRect(&prc);
-	::GetWindowRect(hDlgWnd, &rc);
-	x = prc.left;
-	y = prc.top - (rc.bottom - rc.top);
-	if (y < 0) {
-		y = 0;
-	}
-	::SetWindowPos(hDlgWnd, NULL, x, y,  0, 0, SWP_NOSIZE | SWP_NOZORDER);
-
-activate:;
-	::ShowWindow(hDlgWnd, SW_SHOW);
+	BroadCastShowDialog(m_hInst, HVTWin);
 }
 
 // WM_COPYDATA\x82̎\xF3\x90M
 LRESULT CVTWindow::OnReceiveIpcMessage(WPARAM wParam, LPARAM lParam)
 {
-	COPYDATASTRUCT *cds;
-	char *buf, *msg, *name;
-	int buflen, msglen, nlen;
-	int sending = 0;
-
 	if (!cv.Ready) {
 		return 0;
 	}
@@ -6127,43 +5475,9 @@
 		return 0;
 	}
 
-	cds = (COPYDATASTRUCT *)lParam;
-	msglen = cds->cbData;
-	msg = (char *)cds->lpData;
-	if (cds->dwData == IPC_BROADCAST_COMMAND) {
-		buf = msg;
-		buflen = msglen;
-		sending = 1;
+	COPYDATASTRUCT *cds = (COPYDATASTRUCT *)lParam;
+	BroadCastReceive(cds);
 
-	} else if (cds->dwData == IPC_MULTICAST_COMMAND) {
-		name = msg;
-		nlen = strlen(name) + 1;
-		buf = msg + nlen;
-		buflen = msglen - nlen;
-
-		// \x83}\x83\x8B\x83`\x83L\x83\x83\x83X\x83g\x96\xBC\x82\xF0\x83`\x83F\x83b\x83N\x82\xB7\x82\xE9
-		if (CompareMulticastName(name) == 0) {  // \x93\xAF\x82\xB6
-			sending = 1;
-		}
-	}
-
-	if (sending) {
-		// \x92[\x96\x96\x82֕\xB6\x8E\x9A\x97\xF1\x82𑗂荞\x82\xDE
-		// DDE\x92ʐM\x82Ɏg\x82\xA4\x8A֐\x94\x82ɕύX\x81B(2006.2.7 yutaka)
-		CBStartSend(buf, buflen, FALSE);
-		// \x91\x97\x90M\x83f\x81[\x83^\x82\xAA\x82\xA0\x82\xE9\x8Fꍇ\x82͑\x97\x90M\x82\xB7\x82\xE9
-		if (TalkStatus == IdTalkCB) {
-			CBSend();
-		}
-	}
-
-	// CBStartSend(), CBSend() \x82ł͑\x97\x90M\x97p\x83o\x83b\x83t\x83@\x82Ƀf\x81[\x83^\x82\xF0\x8F\x91\x82\xAB\x8D\x9E\x82ނ\xBE\x82\xAF\x82ŁA
-	// \x8E\xC0\x8Dۂ̑\x97\x90M\x82\xCD teraterm.cpp:OnIdle() \x82\xC5 CommSend() \x82\xAA\x8CĂ΂\xEA\x82鎖\x82\xC9
-	// \x82\xE6\x82\xC1\x82čs\x82\xED\x82\xEA\x82\xE9\x81B
-	// \x82\xB5\x82\xA9\x82\xB5\x94\xF1\x83A\x83N\x83e\x83B\x83u\x82ȃE\x83B\x83\x93\x83h\x83E\x82ł\xCD OnIdle() \x82\xAA\x8CĂ΂\xEA\x82Ȃ\xA2\x82̂ŁA
-	// \x8B\xF3\x82̃\x81\x83b\x83Z\x81[\x83W\x82𑗂\xC1\x82\xC4 OnIdle() \x82\xAA\x8CĂ΂\xEA\x82\xE9\x82悤\x82ɂ\xB7\x82\xE9\x81B
-	::PostMessage(m_hWnd, WM_NULL, 0, 0);
-
 	return 1; // \x91\x97\x90M\x82ł\xAB\x82\xBD\x8Fꍇ\x82\xCD1\x82\xF0\x95Ԃ\xB7
 }
 

Modified: trunk/teraterm/teraterm/vtwin.h
===================================================================
--- trunk/teraterm/teraterm/vtwin.h	2020-07-02 15:41:37 UTC (rev 8822)
+++ trunk/teraterm/teraterm/vtwin.h	2020-07-03 14:42:55 UTC (rev 8823)
@@ -241,15 +241,3 @@
 	void CodePopup(int client_x, int client_y);
 };
 #endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void SendBroadcastMessage(HWND HVTWin, HWND hWnd, char *buf, int buflen);
-void SendMulticastMessage(HWND HVTWin, HWND hWnd, char *name, char *buf, int buflen);
-void SetMulticastName(char *name);
-
-#ifdef __cplusplus
-}
-#endif


Ttssh2-commit メーリングリストの案内
Back to archive index