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 10488 - (hide annotations) (download) (as text)
Sat Jan 14 15:33:43 2023 UTC (14 months, 3 weeks ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/broadcast.cpp
File MIME type: text/x-c++src
File size: 26226 byte(s)
ブロードキャストコマンドの履歴のコマンド長上限をなくした

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

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