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 \x82f\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\x82A\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 \x82f\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\x82A\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