Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/broadcast.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9501 - (hide annotations) (download) (as text)
Wed Oct 27 12:48:49 2021 UTC (2 years, 5 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/broadcast.cpp
File MIME type: text/x-c++src
File size: 26669 byte(s)
設定ファイルを置くフォルダを変更

- フォルダ
  - %APPDATA%\teraterm5 (%USERPROFILE%\AppData\Roaming\teraterm5)
- ファイル
  - TERATERM.INI
  - KEYBOARD.CFG
  - broadcast.log
- 使用していない GetDefaultFName() を削除
  - GetDefaultFNameW() に置き換えた
- フォルダに関する関数を整理
  - GetHomeDirW() を修正
    - 設定ファイルを置くフォルダを返す
    - ttypes.HomeDirW と同一
	- 従来は ttermpro.exe などが置いてあるフォルダを返していた
  - GetLogDirW() を追加
    - ログなどを置くフォルダを返す
    - ttypes.LogDirW と同一
  - GetExeDirW() を追加
    - ttermpro.exe などが存在するフォルダを返す
    - ttypes.LogDirW と同一
1 zmatsuo 8823 /*
2 nmaya 9048 * Copyright (C) 2020- TeraTerm Project
3 zmatsuo 8823 * All rights reserved.
4     *
5     * Redistribution and use in source and binary forms, with or without
6     * modification, are permitted provided that the following conditions
7     * are met:
8     *
9     * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     * 2. Redistributions in binary form must reproduce the above copyright
12     * notice, this list of conditions and the following disclaimer in the
13     * documentation and/or other materials provided with the distribution.
14     * 3. The name of the author may not be used to endorse or promote products
15     * derived from this software without specific prior written permission.
16     *
17     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29     // vtwin��������
30    
31     #include "teraterm.h"
32     #include "tttypes.h"
33     #include "ttcommon.h"
34     #include "ttwinman.h"
35 zmatsuo 9501 #include "compat_win.h"
36     #include "asprintf.h"
37 zmatsuo 8823
38     #include <stdio.h>
39     #define _CRTDBG_MAP_ALLOC
40     #include <stdlib.h>
41     #include <crtdbg.h>
42     #include <string.h>
43     #include <windowsx.h>
44     #include <commctrl.h>
45 zmatsuo 8826 #include <wchar.h> // for wmemcpy_s()
46 zmatsuo 8823
47     #include "ttsetup.h"
48     #include "keyboard.h" // for ShiftKey() ControlKey()
49     #include "ttlib.h"
50     #include "dlglib.h"
51     #include "tt_res.h"
52 zmatsuo 8826 #include "codeconv.h"
53     #include "sendmem.h"
54 zmatsuo 8827 //#include "clipboar.h" // TODO ����
55     #include "ttime.h"
56 zmatsuo 8823
57     #include "broadcast.h"
58    
59    
60     // WM_COPYDATA�������v���Z�X�����M������ (2005.1.22 yutaka)
61 zmatsuo 8826 #define IPC_BROADCAST_COMMAND 1 // �S�[�������M
62     #define IPC_MULTICAST_COMMAND 2 // �C�����[���Q�����M
63 zmatsuo 8823
64 zmatsuo 8826 /*
65     * COPYDATASTRUCT
66     *
67     * dwData
68     * IPC_BROADCAST_COMMAND
69     * lpData
70     * +--------------+--+
71     * |string |\0|
72     * +--------------+--+
73     * <-------------->
74     * cbData
75     * strlen(string) + 1
76     * (wcslen(string) + 1) * sizeof(wchar_t)
77     * buf���������� \0 ���t������
78     *
79     * dwData
80     * IPC_MULTICAST_COMMAND
81     * lpData
82     * +------+--------------+--+
83     * |name\0|string |\0|
84     * +------+--------------+--+
85     * <--------------------->
86     * cbData
87     * strlen(string) + 1 + strlen(string)
88     * (wcslen(name) + 1 + wcslen(string)) * sizeof(wchar_t)
89     * buf���������� \0 ���t������
90     */
91    
92 zmatsuo 9432 #define BROADCAST_LOGFILE L"broadcast.log"
93 zmatsuo 8823
94 zmatsuo 9501 /**
95     * ���������������t�@�C����(�t���p�X)������
96     * @return �t�@�C����
97     * �s�v���������� free() ��������
98     */
99     static wchar_t *GetHistoryFileName(TTTSet *ts_)
100     {
101     wchar_t *fname;
102    
103     // My Documents �� file ���������������A�������D�������g�p����
104     // TODO ��������������������������������
105     #if 1
106     HRESULT hr = _SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &fname);
107     awcscats(&fname, L"\\", BROADCAST_LOGFILE, NULL);
108     DWORD r = GetFileAttributesW(fname);
109     if (r != INVALID_FILE_ATTRIBUTES) {
110     return fname;
111     }
112     free(fname);
113     #endif
114    
115     fname = NULL;
116     awcscats(&fname, ts_->HomeDirW, L"\\", BROADCAST_LOGFILE, NULL);
117     return fname;
118     }
119    
120 zmatsuo 9432 static void ApplyBroadCastCommandHisotry(HWND Dialog, wchar_t *historyfile)
121 zmatsuo 8823 {
122 zmatsuo 9432 wchar_t EntName[13];
123     wchar_t Command[HostNameMaxLength+1];
124 zmatsuo 8823 int i = 1;
125    
126     SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_RESETCONTENT, 0, 0);
127     do {
128 zmatsuo 9432 _snwprintf_s(EntName, _countof(EntName), _TRUNCATE, L"Command%d", i);
129     GetPrivateProfileStringW(L"BroadcastCommands",EntName, L"",
130 zmatsuo 8827 Command,sizeof(Command), historyfile);
131 zmatsuo 9432 if (Command[0] != 0) {
132     SendDlgItemMessageW(Dialog, IDC_COMMAND_EDIT, CB_ADDSTRING,
133     0, (LPARAM)Command);
134 zmatsuo 8823 }
135     i++;
136 zmatsuo 9432 } while ((i <= ts.MaxBroadcatHistory) && (Command[0] != 0));
137 zmatsuo 8823
138     SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, EM_LIMITTEXT,
139     HostNameMaxLength-1, 0);
140    
141     SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_SETCURSEL,0,0);
142     }
143    
144 zmatsuo 8827 BOOL IsUnicharSupport(HWND hwnd)
145     {
146     LRESULT r = SendMessage(hwnd, WM_UNICHAR, UNICODE_NOCHAR, 0);
147     return (BOOL)r;
148     }
149    
150 zmatsuo 8823 // �h���b�v�_�E���������G�f�B�b�g�R���g���[����
151     // �T�u�N���X�������������E�C���h�E�v���V�[�W��
152     static WNDPROC OrigBroadcastEditProc; // Original window procedure
153     static HWND BroadcastWindowList;
154     static LRESULT CALLBACK BroadcastEditProc(HWND dlg, UINT msg,
155     WPARAM wParam, LPARAM lParam)
156     {
157     char buf[1024];
158     int len;
159 zmatsuo 8827 static BOOL ime_mode = FALSE;
160 zmatsuo 8823
161     switch (msg) {
162     case WM_CREATE:
163 zmatsuo 8827 ime_mode = FALSE;
164 zmatsuo 8823 break;
165    
166     case WM_DESTROY:
167     break;
168    
169     case WM_LBUTTONUP:
170     // �������e�L�X�g�����������������������A�J�[�\���������������������B
171     len = GetWindowText(dlg, buf, sizeof(buf));
172     SendMessage(dlg, EM_SETSEL, len, len);
173     SetFocus(dlg);
174     break;
175    
176     case WM_LBUTTONDOWN:
177     case WM_RBUTTONDOWN:
178     case WM_RBUTTONUP:
179     SetFocus(dlg);
180     break;
181    
182     case WM_KEYDOWN:
183     case WM_KEYUP:
184     case WM_SYSKEYDOWN:
185     case WM_SYSKEYUP:
186 zmatsuo 8827 if (ime_mode == FALSE) {
187 zmatsuo 8823 int i;
188     HWND hd;
189     int count;
190    
191     if (wParam == 0x0d) { // Enter key
192     SetWindowText(dlg, "");
193     SendMessage(dlg, EM_SETSEL, 0, 0);
194     }
195    
196 zmatsuo 8826 count = (int)SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
197 zmatsuo 8823 for (i = 0 ; i < count ; i++) {
198     if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
199     hd = GetNthWin(i);
200     if (hd) {
201     PostMessage(hd, msg, wParam, lParam);
202     }
203     }
204     }
205 zmatsuo 8827 return FALSE;
206 zmatsuo 8823 }
207     break;
208    
209     case WM_CHAR:
210     // ��������������IDC_COMMAND_EDIT���c������������������
211 zmatsuo 8827 if (ime_mode == FALSE) {
212     return FALSE;
213     }
214     break;
215 zmatsuo 8823
216 zmatsuo 8827 case WM_IME_NOTIFY:
217     switch (wParam) {
218     case IMN_SETOPENSTATUS:
219     // IME��On/Off����������
220     ime_mode = GetIMEOpenStatus(dlg);
221     }
222     break;
223    
224     case WM_IME_COMPOSITION: {
225     if (CanUseIME()) {
226     size_t len;
227     const wchar_t *lpstr = GetConvStringW(dlg, lParam, &len);
228     if (lpstr != NULL) {
229     char32_t *strU32 = ToU32W(lpstr);
230 zmatsuo 9501 int count = (int)SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
231 zmatsuo 8827 for (int i = 0 ; i < count ; i++) {
232     if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
233     HWND hwnd = GetNthWin(i);
234     if (hwnd != NULL) {
235     BOOL support_unichar = IsUnicharSupport(hwnd);
236     if (!support_unichar) {
237     for (size_t j = 0; j < len; j++) {
238     ::PostMessageW(hwnd, WM_CHAR, lpstr[j], 1);
239     }
240     }
241     else {
242     const char32_t *p = strU32;
243     while (*p != 0) {
244     ::PostMessageW(hwnd, WM_UNICHAR, *p, 1);
245     p++;
246     }
247     }
248     }
249     }
250     }
251     free((void *)lpstr);
252     free(strU32);
253     return FALSE;
254     }
255     }
256     break;
257     }
258 zmatsuo 8823 default:
259 zmatsuo 8827 break;
260 zmatsuo 8823 }
261 zmatsuo 9324 return CallWindowProcW(OrigBroadcastEditProc, dlg, msg, wParam, lParam);
262 zmatsuo 8823 }
263    
264     static void UpdateBroadcastWindowList(HWND hWnd)
265     {
266     int i, count;
267     HWND hd;
268     TCHAR szWindowText[256];
269    
270     SendMessage(hWnd, LB_RESETCONTENT, 0, 0);
271    
272     count = GetRegisteredWindowCount();
273     for (i = 0 ; i < count ; i++) {
274     hd = GetNthWin(i);
275     if (hd == NULL) {
276     break;
277     }
278    
279     GetWindowText(hd, szWindowText, 256);
280     SendMessage(hWnd, LB_INSERTSTRING, -1, (LPARAM)szWindowText);
281     }
282     }
283    
284 zmatsuo 8826 static COPYDATASTRUCT *BuildBroadcastCDSW(const wchar_t *buf)
285     {
286     COPYDATASTRUCT *cds = (COPYDATASTRUCT *)malloc(sizeof(COPYDATASTRUCT));
287     size_t buflen = wcslen(buf);
288    
289     cds->dwData = IPC_BROADCAST_COMMAND;
290     cds->cbData = (DWORD)(buflen * sizeof(wchar_t)); // '\0' ����������
291     cds->lpData = (void *)buf;
292    
293     return cds;
294     }
295    
296     static COPYDATASTRUCT *BuildMulticastCDSW(const wchar_t *name, const wchar_t *buf)
297     {
298     size_t buflen = wcslen(buf);
299     size_t nlen = wcslen(name) + 1;
300     size_t msglen = nlen + buflen;
301     wchar_t *msg = (wchar_t *)malloc(msglen * sizeof(wchar_t));
302     if (msg == NULL) {
303     return NULL;
304     }
305     wcscpy_s(msg, msglen, name);
306     wmemcpy_s(msg + nlen, msglen - nlen, buf, buflen);
307    
308     COPYDATASTRUCT *cds = (COPYDATASTRUCT *)malloc(sizeof(COPYDATASTRUCT));
309     if (cds == NULL) {
310     free(msg);
311     return NULL;
312     }
313     cds->dwData = IPC_MULTICAST_COMMAND;
314     cds->cbData = (DWORD)(msglen * sizeof(wchar_t));
315     cds->lpData = msg;
316    
317     return cds;
318     }
319    
320 zmatsuo 8823 /*
321     * �_�C�A���O���I���������E�B���h�E�����A���������e�E�B���h�E�����������u���[�h�L���X�g���[�h�B
322     * ���A���^�C�����[�h�� off ���������p�������B
323     */
324 zmatsuo 8826 static void SendBroadcastMessageToSelected(HWND HVTWin, HWND hWnd, int parent_only, const wchar_t *buf)
325 zmatsuo 8823 {
326 zmatsuo 8826 COPYDATASTRUCT *cds = BuildBroadcastCDSW(buf);
327 zmatsuo 8823
328     if (parent_only) {
329     // �e�E�B���h�E������ WM_COPYDATA ���b�Z�[�W������
330 zmatsuo 8826 SendMessage(GetParent(hWnd), WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)cds);
331 zmatsuo 8823 }
332     else {
333     // �_�C�A���O���I���������E�B���h�E�����b�Z�[�W������
334 zmatsuo 8826 int count = (int)SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
335     for (int i = 0 ; i < count ; i++) {
336 zmatsuo 8823 // ���X�g�{�b�N�X���I��������������
337     if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
338 zmatsuo 8826 HWND hd = GetNthWin(i);
339     if (hd != NULL) {
340 zmatsuo 8823 // WM_COPYDATA���g�����A�v���Z�X�����M���s���B
341 zmatsuo 8826 SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)cds);
342 zmatsuo 8823 }
343     }
344     }
345     }
346 zmatsuo 8826
347     free(cds);
348 zmatsuo 8823 }
349    
350 zmatsuo 8826 /**
351     * �S Tera Term ��COPYDATASTRUCT�����M����
352     * @param[in] hWnd ���M��
353     * @param[in] cds COPYDATASTRUCT
354 zmatsuo 8823 */
355 zmatsuo 8826 static void SendCDS(HWND hWnd, const COPYDATASTRUCT *cds)
356 zmatsuo 8823 {
357 zmatsuo 8826 int count = GetRegisteredWindowCount();
358     for (int i = 0 ; i < count ; i++) {
359     HWND hd = GetNthWin(i);
360     if (hd == NULL) {
361 zmatsuo 8823 break;
362     }
363     // WM_COPYDATA���g�����A�v���Z�X�����M���s���B
364 zmatsuo 8826 SendMessage(hd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)cds);
365 zmatsuo 8823 }
366     }
367    
368     /*
369 zmatsuo 8826 * �S Tera Term �����b�Z�[�W�����M�����u���[�h�L���X�g���[�h�B
370     * "sendbroadcast"�}�N���R�}���h�����������p�������B
371 zmatsuo 8823 */
372 zmatsuo 8826 void SendBroadcastMessage(HWND HVTWin, HWND hWnd, const wchar_t *buf)
373 zmatsuo 8823 {
374 zmatsuo 8826 COPYDATASTRUCT *cds = BuildBroadcastCDSW(buf);
375     SendCDS(HVTWin, cds);
376     free(cds);
377     }
378 zmatsuo 8823
379 zmatsuo 8826 static COPYDATASTRUCT *BuildMulticastCopyData(const char *name, const char *buf)
380     {
381     size_t buflen = strlen(buf);
382     size_t nlen = strlen(name) + 1;
383     size_t msglen = nlen + buflen;
384     char *msg = (char *)malloc(msglen);
385     if (msg == NULL) {
386     return NULL;
387 zmatsuo 8823 }
388     strcpy_s(msg, msglen, name);
389     memcpy_s(msg + nlen, msglen - nlen, buf, buflen);
390    
391 zmatsuo 8826 COPYDATASTRUCT *cds = (COPYDATASTRUCT *)malloc(sizeof(COPYDATASTRUCT));
392     if (cds == NULL) {
393     free(msg);
394     return NULL;
395 zmatsuo 8823 }
396 zmatsuo 8826 cds->dwData = IPC_MULTICAST_COMMAND;
397     cds->cbData = (DWORD)msglen;
398     cds->lpData = msg;
399 zmatsuo 8823
400 zmatsuo 8826 return cds;
401 zmatsuo 8823 }
402    
403 zmatsuo 8826 /*
404     * �C���� Tera Term �Q�����b�Z�[�W�����M�����}���`�L���X�g���[�h�B���������A
405     * �u���[�h�L���X�g���M���s���A���M�������b�Z�[�W�������I�������B
406     * "sendmulticast"�}�N���R�}���h�����������p�������B
407     */
408     void SendMulticastMessage(HWND HVTWin_, HWND hWnd, const wchar_t *name, const wchar_t *buf)
409 zmatsuo 8823 {
410 zmatsuo 8826 COPYDATASTRUCT *cdsW = BuildMulticastCDSW(name, buf);
411     SendCDS(HVTWin_, cdsW);
412     free(cdsW->lpData);
413     free(cdsW);
414 zmatsuo 8823 }
415    
416 zmatsuo 8826 void SetMulticastName(const wchar_t *name)
417 zmatsuo 8823 {
418 zmatsuo 8826 // TODO MulticastName �� wchar_t ��
419     char *nameA = ToCharW(name);
420     strncpy_s(ts.MulticastName, sizeof(ts.MulticastName), nameA, _TRUNCATE);
421     free(nameA);
422 zmatsuo 8823 }
423    
424 zmatsuo 8826 static int CompareMulticastName(const wchar_t *name)
425     {
426     // TODO MulticastName �� wchar_t ��
427     wchar_t *MulticastNameW = ToWcharA(ts.MulticastName);
428     int result = wcscmp(MulticastNameW, name);
429     free(MulticastNameW);
430     return result;
431     }
432    
433 zmatsuo 8823 //
434     // ���������^�[�~�i���������R�}���h�����M�������[�h���X�_�C�A���O���\��
435     // (2005.1.22 yutaka)
436     //
437 zmatsuo 8826 static INT_PTR CALLBACK BroadcastCommandDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
438 zmatsuo 8823 {
439     static const DlgTextInfo TextInfos[] = {
440     { 0, "DLG_BROADCAST_TITLE" },
441     { IDC_HISTORY_CHECK, "DLG_BROADCAST_HISTORY" },
442     { IDC_ENTERKEY_CHECK, "DLG_BROADCAST_ENTER" },
443     { IDC_PARENT_ONLY, "DLG_BROADCAST_PARENTONLY" },
444     { IDC_REALTIME_CHECK, "DLG_BROADCAST_REALTIME" },
445     { IDOK, "DLG_BROADCAST_SUBMIT" },
446     { IDCANCEL, "BTN_CLOSE" },
447     };
448     LRESULT checked;
449     LRESULT history;
450     static HWND hwndBroadcast = NULL; // Broadcast dropdown
451     static HWND hwndBroadcastEdit = NULL; // Edit control on Broadcast dropdown
452     // for resize
453     RECT rc_dlg, rc, rc_ok;
454     POINT p;
455     static int ok2right, cancel2right, cmdlist2ok, list2bottom, list2right;
456     // for update list
457     const int list_timer_id = 100;
458     const int list_timer_tick = 1000; // msec
459     static int prev_instances = 0;
460     // for status bar
461     static HWND hStatus = NULL;
462     static int init_width, init_height;
463    
464     switch (msg) {
465     case WM_SHOWWINDOW:
466     if (wp) { // show
467     // Tera Term window list
468     UpdateBroadcastWindowList(GetDlgItem(hWnd, IDC_LIST));
469     return TRUE;
470     }
471     break;
472    
473 zmatsuo 9432 case WM_INITDIALOG: {
474 zmatsuo 8823 // ���W�I�{�^�����f�t�H���g�� CR �������B
475     SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_SETCHECK, BST_CHECKED, 0);
476     // �f�t�H���g���`�F�b�N�{�b�N�X�� checked �����������B
477     SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
478     // history �����f���� (2007.3.3 maya)
479     if (ts.BroadcastCommandHistory) {
480     SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
481     }
482 zmatsuo 9501 wchar_t *historyfile = GetHistoryFileName(&ts);
483 zmatsuo 8823 ApplyBroadCastCommandHisotry(hWnd, historyfile);
484 zmatsuo 9432 free(historyfile);
485 zmatsuo 8823
486     // �G�f�B�b�g�R���g���[�����t�H�[�J�X��������
487     SetFocus(GetDlgItem(hWnd, IDC_COMMAND_EDIT));
488    
489     // �T�u�N���X�����������A���^�C�����[�h������ (2008.1.21 yutaka)
490     hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
491     hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
492 zmatsuo 9324 OrigBroadcastEditProc = (WNDPROC)SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
493 zmatsuo 8823 // �f�t�H���g��on�B�c����disable�B
494     SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_SETCHECK, BST_CHECKED, 0); // default on
495     EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
496     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
497     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
498     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
499     EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
500     EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
501    
502     // Tera Term window list
503     BroadcastWindowList = GetDlgItem(hWnd, IDC_LIST);
504     UpdateBroadcastWindowList(BroadcastWindowList);
505    
506     // I18N
507 zmatsuo 9350 SetDlgTextsW(hWnd, TextInfos, _countof(TextInfos), ts.UILanguageFileW);
508 zmatsuo 8823
509     // �_�C�A���O�������T�C�Y������
510     GetWindowRect(hWnd, &rc_dlg);
511     init_width = rc_dlg.right - rc_dlg.left;
512     init_height = rc_dlg.bottom - rc_dlg.top;
513    
514     // �����T�C�Y�����K�v���l���v�Z
515     GetClientRect(hWnd, &rc_dlg);
516     p.x = rc_dlg.right;
517     p.y = rc_dlg.bottom;
518     ClientToScreen(hWnd, &p);
519    
520     GetWindowRect(GetDlgItem(hWnd, IDOK), &rc_ok);
521     ok2right = p.x - rc_ok.left;
522    
523     GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
524     cancel2right = p.x - rc.left;
525    
526     GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
527     cmdlist2ok = rc_ok.left - rc.right;
528    
529     GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
530     list2bottom = p.y - rc.bottom;
531     list2right = p.x - rc.right;
532    
533     // ���T�C�Y�A�C�R�����E�����\���������������A�X�e�[�^�X�o�[���t�����B
534     InitCommonControls();
535     hStatus = CreateStatusWindow(
536     WS_CHILD | WS_VISIBLE |
537     CCS_BOTTOM | SBARS_SIZEGRIP, NULL, hWnd, 1);
538    
539     // ���X�g�X�V�^�C�}�[���J�n
540     SetTimer(hWnd, list_timer_id, list_timer_tick, NULL);
541    
542     return FALSE;
543 zmatsuo 9432 }
544 zmatsuo 8823
545     case WM_COMMAND:
546     switch (wp) {
547     case IDC_ENTERKEY_CHECK | (BN_CLICKED << 16):
548     // �`�F�b�N���L���������A���W�I�{�^�����L���E�������������B
549     checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
550     if (checked & BST_CHECKED) { // ���s�R�[�h����
551     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
552     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
553     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
554    
555     } else {
556     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
557     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
558     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
559     }
560     return TRUE;
561    
562     case IDC_REALTIME_CHECK | (BN_CLICKED << 16):
563     checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
564     if (checked & BST_CHECKED) { // check����
565     // new handler
566     hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
567     hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
568 zmatsuo 9324 OrigBroadcastEditProc = (WNDPROC)SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
569 zmatsuo 8823
570     EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
571     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
572     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
573     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
574     EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
575     EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
576     EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE); // true
577     } else {
578     // restore old handler
579 zmatsuo 9324 SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
580 zmatsuo 8823
581     EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), TRUE);
582     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
583     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
584     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
585     EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), TRUE);
586     EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), TRUE);
587     EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE); // true
588     }
589     return TRUE;
590     }
591    
592     switch (LOWORD(wp)) {
593     case IDOK:
594     {
595 zmatsuo 8826 wchar_t buf[256 + 3];
596     //memset(buf, 0, sizeof(buf));
597 zmatsuo 8823
598     // realtime mode�������AEnter key���������B
599     // cf. http://logmett.com/forum/viewtopic.php?f=8&t=1601
600     // (2011.3.14 hirata)
601     checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
602     if (checked & BST_CHECKED) { // check����
603 zmatsuo 8826 wcsncpy_s(buf, _countof(buf), L"\n", _TRUNCATE);
604     SetDlgItemTextA(hWnd, IDC_COMMAND_EDIT, "");
605 zmatsuo 8823 }
606 zmatsuo 8826 else {
607 zmatsuo 9324 UINT ret = GetDlgItemTextW(hWnd, IDC_COMMAND_EDIT, buf, 256 - 1);
608 zmatsuo 8826 if (ret == 0) { // error
609     memset(buf, 0, sizeof(buf));
610     }
611 zmatsuo 8823
612 zmatsuo 8826 // �u���[�h�L���X�g�R�}���h������������ (2007.3.3 maya)
613     history = SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_GETCHECK, 0, 0);
614     if (history) {
615 zmatsuo 9501 wchar_t *historyfile = GetHistoryFileName(&ts);
616 zmatsuo 8826 if (LoadTTSET()) {
617 zmatsuo 9432 (*AddValueToList)(historyfile, buf, L"BroadcastCommands", L"Command",
618 zmatsuo 8826 ts.MaxBroadcatHistory);
619     FreeTTSET();
620     }
621     ApplyBroadCastCommandHisotry(hWnd, historyfile);
622 zmatsuo 9432 free(historyfile);
623 zmatsuo 8826 ts.BroadcastCommandHistory = TRUE;
624 zmatsuo 8823 }
625 zmatsuo 8826 else {
626     ts.BroadcastCommandHistory = FALSE;
627     }
628     checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
629     if (checked & BST_CHECKED) { // ���s�R�[�h����
630     if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CRLF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
631     wcsncat_s(buf, _countof(buf), L"\r\n", _TRUNCATE);
632 zmatsuo 8823
633 zmatsuo 8826 } else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_GETCHECK, 0, 0) & BST_CHECKED) {
634     wcsncat_s(buf, _countof(buf), L"\r", _TRUNCATE);
635 zmatsuo 8823
636 zmatsuo 8826 } else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_LF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
637     wcsncat_s(buf, _countof(buf), L"\n", _TRUNCATE);
638 zmatsuo 8823
639 zmatsuo 8826 } else {
640     wcsncat_s(buf, _countof(buf), L"\r", _TRUNCATE);
641 zmatsuo 8823
642 zmatsuo 8826 }
643 zmatsuo 8823 }
644     }
645    
646     // 337: 2007/03/20 �`�F�b�N�������������e�E�B���h�E���������M
647     checked = SendMessage(GetDlgItem(hWnd, IDC_PARENT_ONLY), BM_GETCHECK, 0, 0);
648    
649 zmatsuo 8826 SendBroadcastMessageToSelected(HVTWin, hWnd, (int)checked, buf);
650 zmatsuo 8823 }
651    
652     // ���[�h���X�_�C�A���O�����x�������������A�A�v���P�[�V�������I����������
653     // �j���������������A�������u�E�B���h�E�v���V�[�W�������v���s�v���v�������B(yutaka)
654     #if 0
655 zmatsuo 8826 _SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
656 zmatsuo 8823 #endif
657    
658     //EndDialog(hDlgWnd, IDOK);
659     return TRUE;
660    
661     case IDCANCEL:
662     EndDialog(hWnd, 0);
663     //DestroyWindow(hWnd);
664    
665     return TRUE;
666    
667     case IDC_COMMAND_EDIT:
668     if (HIWORD(wp) == CBN_DROPDOWN) {
669 zmatsuo 9501 wchar_t *historyfile = GetHistoryFileName(&ts);
670 zmatsuo 8823 ApplyBroadCastCommandHisotry(hWnd, historyfile);
671 zmatsuo 9432 free(historyfile);
672 zmatsuo 8823 }
673     return FALSE;
674    
675     case IDC_LIST:
676     // �����I���A�v���P�[�V�������������������������������A
677     // �uSHIFT+�N���b�N�v�������A���I���I�����T�|�[�g�����B
678     // (2009.9.28 yutaka)
679     if (HIWORD(wp) == LBN_SELCHANGE && ShiftKey()) {
680     int i, cur, prev;
681    
682     cur = ListBox_GetCurSel(BroadcastWindowList);
683     prev = -1;
684     for (i = cur - 1 ; i >= 0 ; i--) {
685     if (ListBox_GetSel(BroadcastWindowList, i)) {
686     prev = i;
687     break;
688     }
689     }
690     if (prev != -1) {
691     // �������I���������������������A���������A���I�������B
692     for (i = prev ; i < cur ; i++) {
693     ListBox_SetSel(BroadcastWindowList, TRUE, i);
694     }
695     }
696     }
697    
698     return FALSE;
699    
700     default:
701     return FALSE;
702     }
703     break;
704    
705     case WM_CLOSE:
706     //DestroyWindow(hWnd);
707     EndDialog(hWnd, 0);
708     return TRUE;
709    
710     case WM_SIZE:
711     {
712     // ���z�u
713     int dlg_w, dlg_h;
714     RECT rc_dlg;
715     RECT rc;
716     POINT p;
717    
718     // �V�����_�C�A���O���T�C�Y������
719     GetClientRect(hWnd, &rc_dlg);
720     dlg_w = rc_dlg.right;
721     dlg_h = rc_dlg.bottom;
722    
723     // OK button
724     GetWindowRect(GetDlgItem(hWnd, IDOK), &rc);
725     p.x = rc.left;
726     p.y = rc.top;
727     ScreenToClient(hWnd, &p);
728     SetWindowPos(GetDlgItem(hWnd, IDOK), 0,
729     dlg_w - ok2right, p.y, 0, 0,
730     SWP_NOSIZE | SWP_NOZORDER);
731    
732     // Cancel button
733     GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
734     p.x = rc.left;
735     p.y = rc.top;
736     ScreenToClient(hWnd, &p);
737     SetWindowPos(GetDlgItem(hWnd, IDCANCEL), 0,
738     dlg_w - cancel2right, p.y, 0, 0,
739     SWP_NOSIZE | SWP_NOZORDER);
740    
741     // Command Edit box
742     GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
743     p.x = rc.left;
744     p.y = rc.top;
745     ScreenToClient(hWnd, &p);
746     SetWindowPos(GetDlgItem(hWnd, IDC_COMMAND_EDIT), 0,
747     0, 0, dlg_w - p.x - ok2right - cmdlist2ok, p.y,
748     SWP_NOMOVE | SWP_NOZORDER);
749    
750     // List Edit box
751     GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
752     p.x = rc.left;
753     p.y = rc.top;
754     ScreenToClient(hWnd, &p);
755     SetWindowPos(GetDlgItem(hWnd, IDC_LIST), 0,
756     0, 0, dlg_w - p.x - list2right , dlg_h - p.y - list2bottom,
757     SWP_NOMOVE | SWP_NOZORDER);
758    
759     // status bar
760     SendMessage(hStatus , msg , wp , lp);
761     }
762     return TRUE;
763    
764     case WM_GETMINMAXINFO:
765     {
766     // �_�C�A���O�������T�C�Y����������������������������
767     LPMINMAXINFO lpmmi;
768     lpmmi = (LPMINMAXINFO)lp;
769     lpmmi->ptMinTrackSize.x = init_width;
770     lpmmi->ptMinTrackSize.y = init_height;
771     }
772     return FALSE;
773    
774     case WM_TIMER:
775     {
776     int n;
777    
778     if (wp != list_timer_id)
779     break;
780    
781     n = GetRegisteredWindowCount();
782     if (n != prev_instances) {
783     prev_instances = n;
784     UpdateBroadcastWindowList(BroadcastWindowList);
785     }
786     }
787     return TRUE;
788    
789     case WM_VKEYTOITEM:
790     // ���X�g�{�b�N�X���L�[����(CTRL+A)���������A�S�I���B
791     if ((HWND)lp == BroadcastWindowList) {
792     if (ControlKey() && LOWORD(wp) == 'A') {
793     int i, n;
794    
795     //OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
796     n = GetRegisteredWindowCount();
797     for (i = 0 ; i < n ; i++) {
798     ListBox_SetSel(BroadcastWindowList, TRUE, i);
799     }
800     }
801     }
802     return TRUE;
803    
804     default:
805     //OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
806     return FALSE;
807     }
808     return TRUE;
809     }
810    
811     static HWND hDlgWnd = NULL;
812    
813     void BroadCastShowDialog(HINSTANCE hInst, HWND hWnd)
814     {
815     RECT prc, rc;
816     LONG x, y;
817    
818     if (hDlgWnd != NULL) {
819     goto activate;
820     }
821    
822 zmatsuo 8826 SetDialogFont(ts.DialogFontName, ts.DialogFontPoint, ts.DialogFontCharSet,
823     ts.UILanguageFile, "Tera Term", "DLG_SYSTEM_FONT");
824    
825     // CreateDialogW() �����������_�C�A���O���A
826     // �G�f�B�b�g�{�b�N�X��IME���������������������������� (20/05/27,Windows10 64bit)
827     // �y�[�X�g��ok
828 zmatsuo 8823 hDlgWnd = TTCreateDialog(hInst, MAKEINTRESOURCE(IDD_BROADCAST_DIALOG),
829 zmatsuo 8826 hWnd, BroadcastCommandDlgProc);
830 zmatsuo 8823
831     if (hDlgWnd == NULL) {
832     return;
833     }
834    
835     // �_�C�A���O���E�B���h�E���^�����z�u���� (2008.1.25 yutaka)
836     ::GetWindowRect(hWnd, &prc);
837     ::GetWindowRect(hDlgWnd, &rc);
838     x = prc.left;
839     y = prc.top - (rc.bottom - rc.top);
840     if (y < 0) {
841     y = 0;
842     }
843     ::SetWindowPos(hDlgWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
844    
845     activate:;
846     ::ShowWindow(hDlgWnd, SW_SHOW);
847     }
848    
849 zmatsuo 8826 BOOL BroadCastReceive(const COPYDATASTRUCT *cds)
850 zmatsuo 8823 {
851 zmatsuo 8826 wchar_t *strW_ptr;
852     size_t strW_len = 0;
853 zmatsuo 8823
854 zmatsuo 8826 switch (cds->dwData) {
855     case IPC_BROADCAST_COMMAND: {
856     strW_len = cds->cbData / sizeof(wchar_t);
857     strW_ptr = (wchar_t *)malloc((strW_len + 1) * sizeof(wchar_t));
858     wmemcpy_s(strW_ptr, strW_len, (wchar_t *)cds->lpData, strW_len);
859     strW_ptr[strW_len] = 0; // �O����
860     break;
861     }
862     case IPC_MULTICAST_COMMAND: {
863     wchar_t *name = (wchar_t *)cds->lpData;
864 zmatsuo 8823
865     // �}���`�L���X�g�����`�F�b�N����
866 zmatsuo 8826 if (CompareMulticastName(name) != 0) {
867     // ���O����������������������������
868     return TRUE;
869 zmatsuo 8823 }
870 zmatsuo 8826
871     // �}���`�L���X�g��������������������
872     size_t nlen = wcslen(name);
873     strW_len = cds->cbData / sizeof(wchar_t) - nlen - 1; // -1 = name �� '\0'
874     strW_ptr = (wchar_t *)malloc((strW_len + 1) * sizeof(wchar_t));
875     wmemcpy_s(strW_ptr, strW_len, (wchar_t *)cds->lpData + nlen + 1, strW_len);
876     strW_ptr[strW_len] = 0; // �O����
877     break;
878 zmatsuo 8823 }
879    
880 zmatsuo 8826 default:
881     // �m���������b�Z�[�W������
882     return TRUE;
883 zmatsuo 8823 }
884 zmatsuo 8826
885     // �[��������������������
886     SendMem *sm = SendMemTextW(strW_ptr, strW_len);
887     if (sm != NULL) {
888     SendMemInitEcho(sm, FALSE);
889     SendMemInitDelay(sm, SENDMEM_DELAYTYPE_PER_LINE, 10, 0);
890     SendMemStart(sm);
891     }
892    
893     return TRUE;
894 zmatsuo 8823 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26