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 9744 - (hide annotations) (download) (as text)
Sun Feb 13 15:04:44 2022 UTC (2 years, 1 month ago) by nmaya
Original Path: trunk/teraterm/teraterm/broadcast.cpp
File MIME type: text/x-c++src
File size: 26293 byte(s)
My Documents の TERATERM.INI の参照を削除

ticket #36575, ttssh2-dev 234
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 nmaya 9744 wchar_t *fname = NULL;
102 zmatsuo 9501 awcscats(&fname, ts_->HomeDirW, L"\\", BROADCAST_LOGFILE, NULL);
103     return fname;
104     }
105    
106 zmatsuo 9432 static void ApplyBroadCastCommandHisotry(HWND Dialog, wchar_t *historyfile)
107 zmatsuo 8823 {
108 zmatsuo 9432 wchar_t EntName[13];
109     wchar_t Command[HostNameMaxLength+1];
110 zmatsuo 8823 int i = 1;
111    
112     SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_RESETCONTENT, 0, 0);
113     do {
114 zmatsuo 9432 _snwprintf_s(EntName, _countof(EntName), _TRUNCATE, L"Command%d", i);
115     GetPrivateProfileStringW(L"BroadcastCommands",EntName, L"",
116 zmatsuo 8827 Command,sizeof(Command), historyfile);
117 zmatsuo 9432 if (Command[0] != 0) {
118     SendDlgItemMessageW(Dialog, IDC_COMMAND_EDIT, CB_ADDSTRING,
119     0, (LPARAM)Command);
120 zmatsuo 8823 }
121     i++;
122 zmatsuo 9432 } while ((i <= ts.MaxBroadcatHistory) && (Command[0] != 0));
123 zmatsuo 8823
124     SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, EM_LIMITTEXT,
125     HostNameMaxLength-1, 0);
126    
127     SendDlgItemMessage(Dialog, IDC_COMMAND_EDIT, CB_SETCURSEL,0,0);
128     }
129    
130 zmatsuo 8827 BOOL IsUnicharSupport(HWND hwnd)
131     {
132     LRESULT r = SendMessage(hwnd, WM_UNICHAR, UNICODE_NOCHAR, 0);
133     return (BOOL)r;
134     }
135    
136 zmatsuo 8823 // �h���b�v�_�E���������G�f�B�b�g�R���g���[����
137     // �T�u�N���X�������������E�C���h�E�v���V�[�W��
138     static WNDPROC OrigBroadcastEditProc; // Original window procedure
139     static HWND BroadcastWindowList;
140     static LRESULT CALLBACK BroadcastEditProc(HWND dlg, UINT msg,
141     WPARAM wParam, LPARAM lParam)
142     {
143     char buf[1024];
144     int len;
145 zmatsuo 8827 static BOOL ime_mode = FALSE;
146 zmatsuo 8823
147     switch (msg) {
148     case WM_CREATE:
149 zmatsuo 8827 ime_mode = FALSE;
150 zmatsuo 8823 break;
151    
152     case WM_DESTROY:
153     break;
154    
155     case WM_LBUTTONUP:
156     // �������e�L�X�g�����������������������A�J�[�\���������������������B
157     len = GetWindowText(dlg, buf, sizeof(buf));
158     SendMessage(dlg, EM_SETSEL, len, len);
159     SetFocus(dlg);
160     break;
161    
162     case WM_LBUTTONDOWN:
163     case WM_RBUTTONDOWN:
164     case WM_RBUTTONUP:
165     SetFocus(dlg);
166     break;
167    
168     case WM_KEYDOWN:
169     case WM_KEYUP:
170     case WM_SYSKEYDOWN:
171     case WM_SYSKEYUP:
172 zmatsuo 8827 if (ime_mode == FALSE) {
173 zmatsuo 8823 int i;
174     HWND hd;
175     int count;
176    
177     if (wParam == 0x0d) { // Enter key
178     SetWindowText(dlg, "");
179     SendMessage(dlg, EM_SETSEL, 0, 0);
180     }
181    
182 zmatsuo 8826 count = (int)SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
183 zmatsuo 8823 for (i = 0 ; i < count ; i++) {
184     if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
185     hd = GetNthWin(i);
186     if (hd) {
187     PostMessage(hd, msg, wParam, lParam);
188     }
189     }
190     }
191 zmatsuo 8827 return FALSE;
192 zmatsuo 8823 }
193     break;
194    
195     case WM_CHAR:
196     // ��������������IDC_COMMAND_EDIT���c������������������
197 zmatsuo 8827 if (ime_mode == FALSE) {
198     return FALSE;
199     }
200     break;
201 zmatsuo 8823
202 zmatsuo 8827 case WM_IME_NOTIFY:
203     switch (wParam) {
204     case IMN_SETOPENSTATUS:
205     // IME��On/Off����������
206     ime_mode = GetIMEOpenStatus(dlg);
207     }
208     break;
209    
210     case WM_IME_COMPOSITION: {
211     if (CanUseIME()) {
212     size_t len;
213     const wchar_t *lpstr = GetConvStringW(dlg, lParam, &len);
214     if (lpstr != NULL) {
215     char32_t *strU32 = ToU32W(lpstr);
216 zmatsuo 9501 int count = (int)SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
217 zmatsuo 8827 for (int i = 0 ; i < count ; i++) {
218     if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
219     HWND hwnd = GetNthWin(i);
220     if (hwnd != NULL) {
221     BOOL support_unichar = IsUnicharSupport(hwnd);
222     if (!support_unichar) {
223     for (size_t j = 0; j < len; j++) {
224     ::PostMessageW(hwnd, WM_CHAR, lpstr[j], 1);
225     }
226     }
227     else {
228     const char32_t *p = strU32;
229     while (*p != 0) {
230     ::PostMessageW(hwnd, WM_UNICHAR, *p, 1);
231     p++;
232     }
233     }
234     }
235     }
236     }
237     free((void *)lpstr);
238     free(strU32);
239     return FALSE;
240     }
241     }
242     break;
243     }
244 zmatsuo 8823 default:
245 zmatsuo 8827 break;
246 zmatsuo 8823 }
247 zmatsuo 9324 return CallWindowProcW(OrigBroadcastEditProc, dlg, msg, wParam, lParam);
248 zmatsuo 8823 }
249    
250     static void UpdateBroadcastWindowList(HWND hWnd)
251     {
252     int i, count;
253     HWND hd;
254     TCHAR szWindowText[256];
255    
256     SendMessage(hWnd, LB_RESETCONTENT, 0, 0);
257    
258     count = GetRegisteredWindowCount();
259     for (i = 0 ; i < count ; i++) {
260     hd = GetNthWin(i);
261     if (hd == NULL) {
262     break;
263     }
264    
265     GetWindowText(hd, szWindowText, 256);
266     SendMessage(hWnd, LB_INSERTSTRING, -1, (LPARAM)szWindowText);
267     }
268     }
269    
270 zmatsuo 8826 static COPYDATASTRUCT *BuildBroadcastCDSW(const wchar_t *buf)
271     {
272     COPYDATASTRUCT *cds = (COPYDATASTRUCT *)malloc(sizeof(COPYDATASTRUCT));
273     size_t buflen = wcslen(buf);
274    
275     cds->dwData = IPC_BROADCAST_COMMAND;
276     cds->cbData = (DWORD)(buflen * sizeof(wchar_t)); // '\0' ����������
277     cds->lpData = (void *)buf;
278    
279     return cds;
280     }
281    
282     static COPYDATASTRUCT *BuildMulticastCDSW(const wchar_t *name, const wchar_t *buf)
283     {
284     size_t buflen = wcslen(buf);
285     size_t nlen = wcslen(name) + 1;
286     size_t msglen = nlen + buflen;
287     wchar_t *msg = (wchar_t *)malloc(msglen * sizeof(wchar_t));
288     if (msg == NULL) {
289     return NULL;
290     }
291     wcscpy_s(msg, msglen, name);
292     wmemcpy_s(msg + nlen, msglen - nlen, buf, buflen);
293    
294     COPYDATASTRUCT *cds = (COPYDATASTRUCT *)malloc(sizeof(COPYDATASTRUCT));
295     if (cds == NULL) {
296     free(msg);
297     return NULL;
298     }
299     cds->dwData = IPC_MULTICAST_COMMAND;
300     cds->cbData = (DWORD)(msglen * sizeof(wchar_t));
301     cds->lpData = msg;
302    
303     return cds;
304     }
305    
306 zmatsuo 8823 /*
307     * �_�C�A���O���I���������E�B���h�E�����A���������e�E�B���h�E�����������u���[�h�L���X�g���[�h�B
308     * ���A���^�C�����[�h�� off ���������p�������B
309     */
310 zmatsuo 8826 static void SendBroadcastMessageToSelected(HWND HVTWin, HWND hWnd, int parent_only, const wchar_t *buf)
311 zmatsuo 8823 {
312 zmatsuo 8826 COPYDATASTRUCT *cds = BuildBroadcastCDSW(buf);
313 zmatsuo 8823
314     if (parent_only) {
315     // �e�E�B���h�E������ WM_COPYDATA ���b�Z�[�W������
316 zmatsuo 8826 SendMessage(GetParent(hWnd), WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)cds);
317 zmatsuo 8823 }
318     else {
319     // �_�C�A���O���I���������E�B���h�E�����b�Z�[�W������
320 zmatsuo 8826 int count = (int)SendMessage(BroadcastWindowList, LB_GETCOUNT, 0, 0);
321     for (int i = 0 ; i < count ; i++) {
322 zmatsuo 8823 // ���X�g�{�b�N�X���I��������������
323     if (SendMessage(BroadcastWindowList, LB_GETSEL, i, 0)) {
324 zmatsuo 8826 HWND hd = GetNthWin(i);
325     if (hd != NULL) {
326 zmatsuo 8823 // WM_COPYDATA���g�����A�v���Z�X�����M���s���B
327 zmatsuo 8826 SendMessage(hd, WM_COPYDATA, (WPARAM)HVTWin, (LPARAM)cds);
328 zmatsuo 8823 }
329     }
330     }
331     }
332 zmatsuo 8826
333     free(cds);
334 zmatsuo 8823 }
335    
336 zmatsuo 8826 /**
337     * �S Tera Term ��COPYDATASTRUCT�����M����
338     * @param[in] hWnd ���M��
339     * @param[in] cds COPYDATASTRUCT
340 zmatsuo 8823 */
341 zmatsuo 8826 static void SendCDS(HWND hWnd, const COPYDATASTRUCT *cds)
342 zmatsuo 8823 {
343 zmatsuo 8826 int count = GetRegisteredWindowCount();
344     for (int i = 0 ; i < count ; i++) {
345     HWND hd = GetNthWin(i);
346     if (hd == NULL) {
347 zmatsuo 8823 break;
348     }
349     // WM_COPYDATA���g�����A�v���Z�X�����M���s���B
350 zmatsuo 8826 SendMessage(hd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)cds);
351 zmatsuo 8823 }
352     }
353    
354     /*
355 zmatsuo 8826 * �S Tera Term �����b�Z�[�W�����M�����u���[�h�L���X�g���[�h�B
356     * "sendbroadcast"�}�N���R�}���h�����������p�������B
357 zmatsuo 8823 */
358 zmatsuo 8826 void SendBroadcastMessage(HWND HVTWin, HWND hWnd, const wchar_t *buf)
359 zmatsuo 8823 {
360 zmatsuo 8826 COPYDATASTRUCT *cds = BuildBroadcastCDSW(buf);
361     SendCDS(HVTWin, cds);
362     free(cds);
363     }
364 zmatsuo 8823
365 zmatsuo 8826 static COPYDATASTRUCT *BuildMulticastCopyData(const char *name, const char *buf)
366     {
367     size_t buflen = strlen(buf);
368     size_t nlen = strlen(name) + 1;
369     size_t msglen = nlen + buflen;
370     char *msg = (char *)malloc(msglen);
371     if (msg == NULL) {
372     return NULL;
373 zmatsuo 8823 }
374     strcpy_s(msg, msglen, name);
375     memcpy_s(msg + nlen, msglen - nlen, buf, buflen);
376    
377 zmatsuo 8826 COPYDATASTRUCT *cds = (COPYDATASTRUCT *)malloc(sizeof(COPYDATASTRUCT));
378     if (cds == NULL) {
379     free(msg);
380     return NULL;
381 zmatsuo 8823 }
382 zmatsuo 8826 cds->dwData = IPC_MULTICAST_COMMAND;
383     cds->cbData = (DWORD)msglen;
384     cds->lpData = msg;
385 zmatsuo 8823
386 zmatsuo 8826 return cds;
387 zmatsuo 8823 }
388    
389 zmatsuo 8826 /*
390     * �C���� Tera Term �Q�����b�Z�[�W�����M�����}���`�L���X�g���[�h�B���������A
391     * �u���[�h�L���X�g���M���s���A���M�������b�Z�[�W�������I�������B
392     * "sendmulticast"�}�N���R�}���h�����������p�������B
393     */
394     void SendMulticastMessage(HWND HVTWin_, HWND hWnd, const wchar_t *name, const wchar_t *buf)
395 zmatsuo 8823 {
396 zmatsuo 8826 COPYDATASTRUCT *cdsW = BuildMulticastCDSW(name, buf);
397     SendCDS(HVTWin_, cdsW);
398     free(cdsW->lpData);
399     free(cdsW);
400 zmatsuo 8823 }
401    
402 zmatsuo 8826 void SetMulticastName(const wchar_t *name)
403 zmatsuo 8823 {
404 zmatsuo 8826 // TODO MulticastName �� wchar_t ��
405     char *nameA = ToCharW(name);
406     strncpy_s(ts.MulticastName, sizeof(ts.MulticastName), nameA, _TRUNCATE);
407     free(nameA);
408 zmatsuo 8823 }
409    
410 zmatsuo 8826 static int CompareMulticastName(const wchar_t *name)
411     {
412     // TODO MulticastName �� wchar_t ��
413     wchar_t *MulticastNameW = ToWcharA(ts.MulticastName);
414     int result = wcscmp(MulticastNameW, name);
415     free(MulticastNameW);
416     return result;
417     }
418    
419 zmatsuo 8823 //
420     // ���������^�[�~�i���������R�}���h�����M�������[�h���X�_�C�A���O���\��
421     // (2005.1.22 yutaka)
422     //
423 zmatsuo 8826 static INT_PTR CALLBACK BroadcastCommandDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
424 zmatsuo 8823 {
425     static const DlgTextInfo TextInfos[] = {
426     { 0, "DLG_BROADCAST_TITLE" },
427     { IDC_HISTORY_CHECK, "DLG_BROADCAST_HISTORY" },
428     { IDC_ENTERKEY_CHECK, "DLG_BROADCAST_ENTER" },
429     { IDC_PARENT_ONLY, "DLG_BROADCAST_PARENTONLY" },
430     { IDC_REALTIME_CHECK, "DLG_BROADCAST_REALTIME" },
431     { IDOK, "DLG_BROADCAST_SUBMIT" },
432     { IDCANCEL, "BTN_CLOSE" },
433     };
434     LRESULT checked;
435     LRESULT history;
436     static HWND hwndBroadcast = NULL; // Broadcast dropdown
437     static HWND hwndBroadcastEdit = NULL; // Edit control on Broadcast dropdown
438     // for resize
439     RECT rc_dlg, rc, rc_ok;
440     POINT p;
441     static int ok2right, cancel2right, cmdlist2ok, list2bottom, list2right;
442     // for update list
443     const int list_timer_id = 100;
444     const int list_timer_tick = 1000; // msec
445     static int prev_instances = 0;
446     // for status bar
447     static HWND hStatus = NULL;
448     static int init_width, init_height;
449    
450     switch (msg) {
451     case WM_SHOWWINDOW:
452     if (wp) { // show
453     // Tera Term window list
454     UpdateBroadcastWindowList(GetDlgItem(hWnd, IDC_LIST));
455     return TRUE;
456     }
457     break;
458    
459 zmatsuo 9432 case WM_INITDIALOG: {
460 zmatsuo 8823 // ���W�I�{�^�����f�t�H���g�� CR �������B
461     SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_SETCHECK, BST_CHECKED, 0);
462     // �f�t�H���g���`�F�b�N�{�b�N�X�� checked �����������B
463     SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
464     // history �����f���� (2007.3.3 maya)
465     if (ts.BroadcastCommandHistory) {
466     SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_SETCHECK, BST_CHECKED, 0);
467     }
468 zmatsuo 9501 wchar_t *historyfile = GetHistoryFileName(&ts);
469 zmatsuo 8823 ApplyBroadCastCommandHisotry(hWnd, historyfile);
470 zmatsuo 9432 free(historyfile);
471 zmatsuo 8823
472     // �G�f�B�b�g�R���g���[�����t�H�[�J�X��������
473     SetFocus(GetDlgItem(hWnd, IDC_COMMAND_EDIT));
474    
475     // �T�u�N���X�����������A���^�C�����[�h������ (2008.1.21 yutaka)
476     hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
477     hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
478 zmatsuo 9324 OrigBroadcastEditProc = (WNDPROC)SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
479 zmatsuo 8823 // �f�t�H���g��on�B�c����disable�B
480     SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_SETCHECK, BST_CHECKED, 0); // default on
481     EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
482     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
483     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
484     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
485     EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
486     EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
487    
488     // Tera Term window list
489     BroadcastWindowList = GetDlgItem(hWnd, IDC_LIST);
490     UpdateBroadcastWindowList(BroadcastWindowList);
491    
492     // I18N
493 zmatsuo 9350 SetDlgTextsW(hWnd, TextInfos, _countof(TextInfos), ts.UILanguageFileW);
494 zmatsuo 8823
495     // �_�C�A���O�������T�C�Y������
496     GetWindowRect(hWnd, &rc_dlg);
497     init_width = rc_dlg.right - rc_dlg.left;
498     init_height = rc_dlg.bottom - rc_dlg.top;
499    
500     // �����T�C�Y�����K�v���l���v�Z
501     GetClientRect(hWnd, &rc_dlg);
502     p.x = rc_dlg.right;
503     p.y = rc_dlg.bottom;
504     ClientToScreen(hWnd, &p);
505    
506     GetWindowRect(GetDlgItem(hWnd, IDOK), &rc_ok);
507     ok2right = p.x - rc_ok.left;
508    
509     GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
510     cancel2right = p.x - rc.left;
511    
512     GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
513     cmdlist2ok = rc_ok.left - rc.right;
514    
515     GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
516     list2bottom = p.y - rc.bottom;
517     list2right = p.x - rc.right;
518    
519     // ���T�C�Y�A�C�R�����E�����\���������������A�X�e�[�^�X�o�[���t�����B
520     InitCommonControls();
521     hStatus = CreateStatusWindow(
522     WS_CHILD | WS_VISIBLE |
523     CCS_BOTTOM | SBARS_SIZEGRIP, NULL, hWnd, 1);
524    
525     // ���X�g�X�V�^�C�}�[���J�n
526     SetTimer(hWnd, list_timer_id, list_timer_tick, NULL);
527    
528     return FALSE;
529 zmatsuo 9432 }
530 zmatsuo 8823
531     case WM_COMMAND:
532     switch (wp) {
533     case IDC_ENTERKEY_CHECK | (BN_CLICKED << 16):
534     // �`�F�b�N���L���������A���W�I�{�^�����L���E�������������B
535     checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
536     if (checked & BST_CHECKED) { // ���s�R�[�h����
537     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
538     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
539     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
540    
541     } else {
542     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
543     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
544     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
545     }
546     return TRUE;
547    
548     case IDC_REALTIME_CHECK | (BN_CLICKED << 16):
549     checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
550     if (checked & BST_CHECKED) { // check����
551     // new handler
552     hwndBroadcast = GetDlgItem(hWnd, IDC_COMMAND_EDIT);
553     hwndBroadcastEdit = GetWindow(hwndBroadcast, GW_CHILD);
554 zmatsuo 9324 OrigBroadcastEditProc = (WNDPROC)SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)BroadcastEditProc);
555 zmatsuo 8823
556     EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), FALSE);
557     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), FALSE);
558     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), FALSE);
559     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), FALSE);
560     EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), FALSE);
561     EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), FALSE);
562     EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE); // true
563     } else {
564     // restore old handler
565 zmatsuo 9324 SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
566 zmatsuo 8823
567     EnableWindow(GetDlgItem(hWnd, IDC_HISTORY_CHECK), TRUE);
568     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CRLF), TRUE);
569     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_CR), TRUE);
570     EnableWindow(GetDlgItem(hWnd, IDC_RADIO_LF), TRUE);
571     EnableWindow(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), TRUE);
572     EnableWindow(GetDlgItem(hWnd, IDC_PARENT_ONLY), TRUE);
573     EnableWindow(GetDlgItem(hWnd, IDC_LIST), TRUE); // true
574     }
575     return TRUE;
576     }
577    
578     switch (LOWORD(wp)) {
579     case IDOK:
580     {
581 zmatsuo 8826 wchar_t buf[256 + 3];
582     //memset(buf, 0, sizeof(buf));
583 zmatsuo 8823
584     // realtime mode�������AEnter key���������B
585     // cf. http://logmett.com/forum/viewtopic.php?f=8&t=1601
586     // (2011.3.14 hirata)
587     checked = SendMessage(GetDlgItem(hWnd, IDC_REALTIME_CHECK), BM_GETCHECK, 0, 0);
588     if (checked & BST_CHECKED) { // check����
589 zmatsuo 8826 wcsncpy_s(buf, _countof(buf), L"\n", _TRUNCATE);
590     SetDlgItemTextA(hWnd, IDC_COMMAND_EDIT, "");
591 zmatsuo 8823 }
592 zmatsuo 8826 else {
593 zmatsuo 9324 UINT ret = GetDlgItemTextW(hWnd, IDC_COMMAND_EDIT, buf, 256 - 1);
594 zmatsuo 8826 if (ret == 0) { // error
595     memset(buf, 0, sizeof(buf));
596     }
597 zmatsuo 8823
598 zmatsuo 8826 // �u���[�h�L���X�g�R�}���h������������ (2007.3.3 maya)
599     history = SendMessage(GetDlgItem(hWnd, IDC_HISTORY_CHECK), BM_GETCHECK, 0, 0);
600     if (history) {
601 zmatsuo 9501 wchar_t *historyfile = GetHistoryFileName(&ts);
602 zmatsuo 8826 if (LoadTTSET()) {
603 zmatsuo 9432 (*AddValueToList)(historyfile, buf, L"BroadcastCommands", L"Command",
604 zmatsuo 8826 ts.MaxBroadcatHistory);
605     FreeTTSET();
606     }
607     ApplyBroadCastCommandHisotry(hWnd, historyfile);
608 zmatsuo 9432 free(historyfile);
609 zmatsuo 8826 ts.BroadcastCommandHistory = TRUE;
610 zmatsuo 8823 }
611 zmatsuo 8826 else {
612     ts.BroadcastCommandHistory = FALSE;
613     }
614     checked = SendMessage(GetDlgItem(hWnd, IDC_ENTERKEY_CHECK), BM_GETCHECK, 0, 0);
615     if (checked & BST_CHECKED) { // ���s�R�[�h����
616     if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CRLF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
617     wcsncat_s(buf, _countof(buf), L"\r\n", _TRUNCATE);
618 zmatsuo 8823
619 zmatsuo 8826 } else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_CR), BM_GETCHECK, 0, 0) & BST_CHECKED) {
620     wcsncat_s(buf, _countof(buf), L"\r", _TRUNCATE);
621 zmatsuo 8823
622 zmatsuo 8826 } else if (SendMessage(GetDlgItem(hWnd, IDC_RADIO_LF), BM_GETCHECK, 0, 0) & BST_CHECKED) {
623     wcsncat_s(buf, _countof(buf), L"\n", _TRUNCATE);
624 zmatsuo 8823
625 zmatsuo 8826 } else {
626     wcsncat_s(buf, _countof(buf), L"\r", _TRUNCATE);
627 zmatsuo 8823
628 zmatsuo 8826 }
629 zmatsuo 8823 }
630     }
631    
632     // 337: 2007/03/20 �`�F�b�N�������������e�E�B���h�E���������M
633     checked = SendMessage(GetDlgItem(hWnd, IDC_PARENT_ONLY), BM_GETCHECK, 0, 0);
634    
635 zmatsuo 8826 SendBroadcastMessageToSelected(HVTWin, hWnd, (int)checked, buf);
636 zmatsuo 8823 }
637    
638     // ���[�h���X�_�C�A���O�����x�������������A�A�v���P�[�V�������I����������
639     // �j���������������A�������u�E�B���h�E�v���V�[�W�������v���s�v���v�������B(yutaka)
640     #if 0
641 zmatsuo 8826 _SetWindowLongPtrW(hwndBroadcastEdit, GWLP_WNDPROC, (LONG_PTR)OrigBroadcastEditProc);
642 zmatsuo 8823 #endif
643    
644     //EndDialog(hDlgWnd, IDOK);
645     return TRUE;
646    
647     case IDCANCEL:
648     EndDialog(hWnd, 0);
649     //DestroyWindow(hWnd);
650    
651     return TRUE;
652    
653     case IDC_COMMAND_EDIT:
654     if (HIWORD(wp) == CBN_DROPDOWN) {
655 zmatsuo 9501 wchar_t *historyfile = GetHistoryFileName(&ts);
656 zmatsuo 8823 ApplyBroadCastCommandHisotry(hWnd, historyfile);
657 zmatsuo 9432 free(historyfile);
658 zmatsuo 8823 }
659     return FALSE;
660    
661     case IDC_LIST:
662     // �����I���A�v���P�[�V�������������������������������A
663     // �uSHIFT+�N���b�N�v�������A���I���I�����T�|�[�g�����B
664     // (2009.9.28 yutaka)
665     if (HIWORD(wp) == LBN_SELCHANGE && ShiftKey()) {
666     int i, cur, prev;
667    
668     cur = ListBox_GetCurSel(BroadcastWindowList);
669     prev = -1;
670     for (i = cur - 1 ; i >= 0 ; i--) {
671     if (ListBox_GetSel(BroadcastWindowList, i)) {
672     prev = i;
673     break;
674     }
675     }
676     if (prev != -1) {
677     // �������I���������������������A���������A���I�������B
678     for (i = prev ; i < cur ; i++) {
679     ListBox_SetSel(BroadcastWindowList, TRUE, i);
680     }
681     }
682     }
683    
684     return FALSE;
685    
686     default:
687     return FALSE;
688     }
689     break;
690    
691     case WM_CLOSE:
692     //DestroyWindow(hWnd);
693     EndDialog(hWnd, 0);
694     return TRUE;
695    
696     case WM_SIZE:
697     {
698     // ���z�u
699     int dlg_w, dlg_h;
700     RECT rc_dlg;
701     RECT rc;
702     POINT p;
703    
704     // �V�����_�C�A���O���T�C�Y������
705     GetClientRect(hWnd, &rc_dlg);
706     dlg_w = rc_dlg.right;
707     dlg_h = rc_dlg.bottom;
708    
709     // OK button
710     GetWindowRect(GetDlgItem(hWnd, IDOK), &rc);
711     p.x = rc.left;
712     p.y = rc.top;
713     ScreenToClient(hWnd, &p);
714     SetWindowPos(GetDlgItem(hWnd, IDOK), 0,
715     dlg_w - ok2right, p.y, 0, 0,
716     SWP_NOSIZE | SWP_NOZORDER);
717    
718     // Cancel button
719     GetWindowRect(GetDlgItem(hWnd, IDCANCEL), &rc);
720     p.x = rc.left;
721     p.y = rc.top;
722     ScreenToClient(hWnd, &p);
723     SetWindowPos(GetDlgItem(hWnd, IDCANCEL), 0,
724     dlg_w - cancel2right, p.y, 0, 0,
725     SWP_NOSIZE | SWP_NOZORDER);
726    
727     // Command Edit box
728     GetWindowRect(GetDlgItem(hWnd, IDC_COMMAND_EDIT), &rc);
729     p.x = rc.left;
730     p.y = rc.top;
731     ScreenToClient(hWnd, &p);
732     SetWindowPos(GetDlgItem(hWnd, IDC_COMMAND_EDIT), 0,
733     0, 0, dlg_w - p.x - ok2right - cmdlist2ok, p.y,
734     SWP_NOMOVE | SWP_NOZORDER);
735    
736     // List Edit box
737     GetWindowRect(GetDlgItem(hWnd, IDC_LIST), &rc);
738     p.x = rc.left;
739     p.y = rc.top;
740     ScreenToClient(hWnd, &p);
741     SetWindowPos(GetDlgItem(hWnd, IDC_LIST), 0,
742     0, 0, dlg_w - p.x - list2right , dlg_h - p.y - list2bottom,
743     SWP_NOMOVE | SWP_NOZORDER);
744    
745     // status bar
746     SendMessage(hStatus , msg , wp , lp);
747     }
748     return TRUE;
749    
750     case WM_GETMINMAXINFO:
751     {
752     // �_�C�A���O�������T�C�Y����������������������������
753     LPMINMAXINFO lpmmi;
754     lpmmi = (LPMINMAXINFO)lp;
755     lpmmi->ptMinTrackSize.x = init_width;
756     lpmmi->ptMinTrackSize.y = init_height;
757     }
758     return FALSE;
759    
760     case WM_TIMER:
761     {
762     int n;
763    
764     if (wp != list_timer_id)
765     break;
766    
767     n = GetRegisteredWindowCount();
768     if (n != prev_instances) {
769     prev_instances = n;
770     UpdateBroadcastWindowList(BroadcastWindowList);
771     }
772     }
773     return TRUE;
774    
775     case WM_VKEYTOITEM:
776     // ���X�g�{�b�N�X���L�[����(CTRL+A)���������A�S�I���B
777     if ((HWND)lp == BroadcastWindowList) {
778     if (ControlKey() && LOWORD(wp) == 'A') {
779     int i, n;
780    
781     //OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
782     n = GetRegisteredWindowCount();
783     for (i = 0 ; i < n ; i++) {
784     ListBox_SetSel(BroadcastWindowList, TRUE, i);
785     }
786     }
787     }
788     return TRUE;
789    
790     default:
791     //OutputDebugPrintf("msg %x wp %x lp %x\n", msg, wp, lp);
792     return FALSE;
793     }
794     return TRUE;
795     }
796    
797     static HWND hDlgWnd = NULL;
798    
799     void BroadCastShowDialog(HINSTANCE hInst, HWND hWnd)
800     {
801     RECT prc, rc;
802     LONG x, y;
803    
804     if (hDlgWnd != NULL) {
805     goto activate;
806     }
807    
808 zmatsuo 8826 SetDialogFont(ts.DialogFontName, ts.DialogFontPoint, ts.DialogFontCharSet,
809     ts.UILanguageFile, "Tera Term", "DLG_SYSTEM_FONT");
810    
811     // CreateDialogW() �����������_�C�A���O���A
812     // �G�f�B�b�g�{�b�N�X��IME���������������������������� (20/05/27,Windows10 64bit)
813     // �y�[�X�g��ok
814 zmatsuo 8823 hDlgWnd = TTCreateDialog(hInst, MAKEINTRESOURCE(IDD_BROADCAST_DIALOG),
815 zmatsuo 8826 hWnd, BroadcastCommandDlgProc);
816 zmatsuo 8823
817     if (hDlgWnd == NULL) {
818     return;
819     }
820    
821     // �_�C�A���O���E�B���h�E���^�����z�u���� (2008.1.25 yutaka)
822     ::GetWindowRect(hWnd, &prc);
823     ::GetWindowRect(hDlgWnd, &rc);
824     x = prc.left;
825     y = prc.top - (rc.bottom - rc.top);
826     if (y < 0) {
827     y = 0;
828     }
829     ::SetWindowPos(hDlgWnd, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
830    
831     activate:;
832     ::ShowWindow(hDlgWnd, SW_SHOW);
833     }
834    
835 zmatsuo 8826 BOOL BroadCastReceive(const COPYDATASTRUCT *cds)
836 zmatsuo 8823 {
837 zmatsuo 8826 wchar_t *strW_ptr;
838     size_t strW_len = 0;
839 zmatsuo 8823
840 zmatsuo 8826 switch (cds->dwData) {
841     case IPC_BROADCAST_COMMAND: {
842     strW_len = cds->cbData / sizeof(wchar_t);
843     strW_ptr = (wchar_t *)malloc((strW_len + 1) * sizeof(wchar_t));
844     wmemcpy_s(strW_ptr, strW_len, (wchar_t *)cds->lpData, strW_len);
845     strW_ptr[strW_len] = 0; // �O����
846     break;
847     }
848     case IPC_MULTICAST_COMMAND: {
849     wchar_t *name = (wchar_t *)cds->lpData;
850 zmatsuo 8823
851     // �}���`�L���X�g�����`�F�b�N����
852 zmatsuo 8826 if (CompareMulticastName(name) != 0) {
853     // ���O����������������������������
854     return TRUE;
855 zmatsuo 8823 }
856 zmatsuo 8826
857     // �}���`�L���X�g��������������������
858     size_t nlen = wcslen(name);
859     strW_len = cds->cbData / sizeof(wchar_t) - nlen - 1; // -1 = name �� '\0'
860     strW_ptr = (wchar_t *)malloc((strW_len + 1) * sizeof(wchar_t));
861     wmemcpy_s(strW_ptr, strW_len, (wchar_t *)cds->lpData + nlen + 1, strW_len);
862     strW_ptr[strW_len] = 0; // �O����
863     break;
864 zmatsuo 8823 }
865    
866 zmatsuo 8826 default:
867     // �m���������b�Z�[�W������
868     return TRUE;
869 zmatsuo 8823 }
870 zmatsuo 8826
871     // �[��������������������
872     SendMem *sm = SendMemTextW(strW_ptr, strW_len);
873     if (sm != NULL) {
874     SendMemInitEcho(sm, FALSE);
875     SendMemInitDelay(sm, SENDMEM_DELAYTYPE_PER_LINE, 10, 0);
876     SendMemStart(sm);
877     }
878    
879     return TRUE;
880 zmatsuo 8823 }

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