Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/teraterm/clipboar.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8408 - (hide annotations) (download) (as text)
Mon Nov 25 12:57:48 2019 UTC (4 years, 4 months ago) by zmatsuo
File MIME type: text/x-csrc
File size: 24912 byte(s)
setdlgposの位置指定でダイアログがディスプレイからはみ出さないようにした

- ダイアログが必ずディスプレイ内に表示されるようにする [Ttssh2-devel 4385]
- MoveWindowToDisplay()@ttlib.c を作成
  - ディスプレイからはみ出す場合、ウィンドウをディスプレイ内に移動する
  - clipboard確認ダイアログのディスプレイ内に移動するコード関数化
- マクロのダイアログを表示する際 MoveWindowToDisplay() をコール
  - マクロコマンドsetdlgpos でディスプレイ外を指定されてもディスプレイ内に表示
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3     * (C) 2006-2017 TeraTerm Project
4     * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17 doda 6806 *
18 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 doda 6806 */
29 maya 3227
30     /* TERATERM.EXE, Clipboard routines */
31     #include "teraterm.h"
32     #include "tttypes.h"
33     #include "vtdisp.h"
34 doda 7140 #include "vtterm.h"
35 maya 3227 #include <string.h>
36     #include <stdlib.h>
37     #include <stdio.h>
38 yutakapon 3635 #include <commctrl.h>
39 maya 3227
40     #include "ttwinman.h"
41     #include "ttcommon.h"
42 doda 4769 #include "ttlib.h"
43 zmatsuo 7509 #include "dlglib.h"
44 maya 3227
45     #include "clipboar.h"
46     #include "tt_res.h"
47    
48     // for clipboard copy
49     static HGLOBAL CBCopyHandle = NULL;
50     static PCHAR CBCopyPtr = NULL;
51 maya 5071 static HGLOBAL CBCopyWideHandle = NULL;
52     static LPWSTR CBCopyWidePtr = NULL;
53 maya 3227
54     // for clipboard paste
55     static HGLOBAL CBMemHandle = NULL;
56     static PCHAR CBMemPtr = NULL;
57     static LONG CBMemPtr2 = 0;
58     static BYTE CBByte;
59     static BOOL CBRetrySend;
60     static BOOL CBRetryEcho;
61     static BOOL CBSendCR;
62 doda 3974 static BOOL CBEchoOnly;
63 doda 5259 static BOOL CBInsertDelay = FALSE;
64 maya 3227
65 doda 6456 static LRESULT CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp);
66    
67 maya 3227 PCHAR CBOpen(LONG MemSize)
68     {
69 maya 3393 if (MemSize==0) {
70     return (NULL);
71     }
72     if (CBCopyHandle!=NULL) {
73     return (NULL);
74     }
75     CBCopyPtr = NULL;
76     CBCopyHandle = GlobalAlloc(GMEM_MOVEABLE, MemSize);
77     if (CBCopyHandle == NULL) {
78     MessageBeep(0);
79     }
80     else {
81     CBCopyPtr = GlobalLock(CBCopyHandle);
82     if (CBCopyPtr == NULL) {
83     GlobalFree(CBCopyHandle);
84     CBCopyHandle = NULL;
85     MessageBeep(0);
86     }
87     }
88     return (CBCopyPtr);
89 maya 3227 }
90    
91     void CBClose()
92     {
93 maya 3393 BOOL Empty;
94 maya 5071 int WideCharLength;
95    
96 maya 3393 if (CBCopyHandle==NULL) {
97     return;
98     }
99 maya 3227
100 maya 5071 WideCharLength = MultiByteToWideChar(CP_ACP, 0, CBCopyPtr, -1, NULL, 0);
101     CBCopyWideHandle = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * WideCharLength);
102     if (CBCopyWideHandle) {
103     CBCopyWidePtr = (LPWSTR)GlobalLock(CBCopyWideHandle);
104     MultiByteToWideChar(CP_ACP, 0, CBCopyPtr, -1, CBCopyWidePtr, WideCharLength);
105     GlobalUnlock(CBCopyWideHandle);
106     }
107    
108 maya 3393 Empty = FALSE;
109     if (CBCopyPtr!=NULL) {
110     Empty = (CBCopyPtr[0]==0);
111     }
112 maya 3227
113 maya 3393 GlobalUnlock(CBCopyHandle);
114     CBCopyPtr = NULL;
115 maya 3227
116 maya 3393 if (OpenClipboard(HVTWin)) {
117     EmptyClipboard();
118     if (! Empty) {
119     SetClipboardData(CF_TEXT, CBCopyHandle);
120 maya 5071 if (CBCopyWidePtr) {
121     SetClipboardData(CF_UNICODETEXT, CBCopyWideHandle);
122     CBCopyWidePtr = NULL;
123     }
124 maya 3393 }
125     CloseClipboard();
126     }
127     CBCopyHandle = NULL;
128 maya 5071 CBCopyWideHandle = NULL;
129 maya 3227 }
130    
131 doda 6440 void CBStartSend(PCHAR DataPtr, int DataSize, BOOL EchoOnly)
132 maya 3227 {
133 doda 6440 if (! cv.Ready) {
134     return;
135     }
136     if (TalkStatus!=IdTalkKeyb) {
137     return;
138     }
139    
140     CBEchoOnly = EchoOnly;
141    
142 doda 6452 if (CBMemHandle) {
143     GlobalFree(CBMemHandle);
144     }
145 doda 6440 CBMemHandle = NULL;
146     CBMemPtr = NULL;
147     CBMemPtr2 = 0;
148    
149     CBInsertDelay = FALSE;
150    
151     CBRetrySend = FALSE;
152     CBRetryEcho = FALSE;
153     CBSendCR = FALSE;
154    
155 doda 6535 if ((CBMemHandle = GlobalAlloc(GHND, DataSize+1)) != NULL) {
156 doda 6440 if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
157     memcpy(CBMemPtr, DataPtr, DataSize);
158 doda 6535 // WM_COPYDATA ���������������f�[�^�� NUL Terminate ���������������� NUL ���t������
159     CBMemPtr[DataSize] = 0;
160 doda 6440 GlobalUnlock(CBMemHandle);
161     CBMemPtr=NULL;
162     TalkStatus=IdTalkCB;
163     }
164     }
165    
166     if (TalkStatus != IdTalkCB) {
167     CBEndPaste();
168     }
169     }
170    
171 doda 6455 // �N���b�v�{�[�h�o�b�t�@������������ CR / LF ����������������
172     BOOL TrimTrailingNL(BOOL AddCR, BOOL Bracketed) {
173     PCHAR tail;
174 doda 6594 if (ts.PasteFlag & CPF_TRIM_TRAILING_NL) {
175 doda 6455 for (tail = CBMemPtr+strlen(CBMemPtr)-1; tail >= CBMemPtr; tail--) {
176     if (*tail != '\r' && *tail != '\n') {
177     break;
178     }
179     *tail = '\0';
180     }
181     }
182    
183     return TRUE;
184     }
185    
186 doda 6595 // ���s�� CR+LF �����K������
187     BOOL NormalizeLineBreak(BOOL AddCR, BOOL Bracketed) {
188     char *p, *p2;
189     unsigned int len, need_len, alloc_len;
190     HGLOBAL TmpHandle;
191    
192     if (!(ts.PasteFlag & CPF_NORMALIZE_LINEBREAK)) {
193     return TRUE;
194     }
195    
196     p = CBMemPtr;
197    
198     // �\���t���f�[�^������(len)�A���������K�������f�[�^������(need_len)���J�E���g
199     for (len=0, need_len=0, p=CBMemPtr; *p != '\0'; p++, len++, need_len++) {
200     if (*p == CR) {
201     need_len++;
202     if (*(p+1) == LF) {
203     len++;
204     p++;
205     }
206     }
207     else if (*p == LF) {
208     need_len++;
209     }
210     }
211    
212     // ���K�������f�[�^�������������� => ���K�����K�v����
213     if (need_len == len) {
214     return TRUE;
215     }
216    
217     // AddCR / Bracketed ���������������o�b�t�@���v�Z��������
218     // ������������������������������������
219     alloc_len = need_len + 1;
220     if (AddCR) {
221     alloc_len++;
222     }
223     if (Bracketed) {
224     // ������
225     alloc_len += 12;
226     }
227    
228     // �o�b�t�@�T�C�Y�����K�������K�v�������l�����������������o�b�t�@���m��������
229     if (GlobalSize(CBMemHandle) < alloc_len) {
230     GlobalUnlock(CBMemHandle);
231     CBMemPtr = NULL;
232     if ((TmpHandle = GlobalReAlloc(CBMemHandle, alloc_len, 0)) == NULL) {
233     // �������������������s
234     CBMemPtr = GlobalLock(CBMemHandle);
235    
236     // �������������K���������\���t������������
237     return TRUE;
238     }
239     CBMemHandle = TmpHandle;
240     CBMemPtr = GlobalLock(CBMemHandle);
241     }
242    
243     p = CBMemPtr + len - 1;
244     p2 = CBMemPtr + need_len;
245     *p2-- = '\0';
246    
247     while (len > 0 && p < p2) {
248     if (*p == LF) {
249     *p2-- = *p--;
250     if (--len == 0) {
251     *p2 = CR;
252     break;
253     }
254     if (*p != CR) {
255     *p2-- = CR;
256     if (p2 <= p) {
257     break;
258     }
259     else {
260     continue;
261     }
262     }
263     }
264     else if (*p == CR) {
265     *p2-- = LF;
266     if (p == p2)
267     break;
268     }
269     *p2-- = *p--;
270     len--;
271     }
272    
273     return TRUE;
274     }
275    
276 doda 6456 // �t�@�C�������`���������������Atext���������������������B
277     BOOL search_dict(char *filename, char *text)
278     {
279     BOOL ret = FALSE;
280     FILE *fp = NULL;
281     char buf[256];
282     int len;
283    
284     if (filename == NULL || filename[0] == '\0')
285     return FALSE;
286    
287     if ((fp = fopen(filename, "r")) == NULL)
288     return FALSE;
289    
290     // TODO: ���s��256byte�������������������l��
291     while (fgets(buf, sizeof(buf), fp) != NULL) {
292     len = strlen(buf);
293     if (len <= 1) {
294     continue;
295     }
296     if (buf[len - 1] == '\n') {
297     buf[len - 1] = '\0';
298     }
299     if (strstr(text, buf)) { // hit
300     ret = 1;
301     break;
302     }
303     }
304    
305     fclose(fp);
306    
307     return (ret);
308     }
309    
310     /*
311     * �N���b�v�{�[�h�����e���m�F���A�\���t�����s�����m�F�_�C�A���O���o���B
312     *
313     * �����l:
314     * TRUE -> ���������A�\���t�������{
315     * FALSE -> �\���t�����~
316     */
317 doda 6459 BOOL CheckClipboardContent(HWND HWin, BOOL AddCR, BOOL Bracketed)
318 doda 6456 {
319     int pos;
320     int ret = IDOK;
321     BOOL confirm = FALSE;
322    
323 doda 6594 if ((ts.PasteFlag & CPF_CONFIRM_CHANGEPASTE) == 0) {
324 doda 6456 return TRUE;
325     }
326    
327     /*
328     * ConfirmChangePasteCR ����������
329     * �����������������������B
330     *
331     * ChangePasteCR !ChangePasteCR
332     * AddCR !AddCR AddCR !AddCR
333     * ���s���� o o x(2) o
334     * ���s���� o(1) x x x
335     *
336     * ChangePasteCR �� AddCR �������m�F���s����(1���m�F����)���������������A
337     * !ChangePasteCR �������l�������AAddCR ���������� CR ����������������
338     * �m�F���s������������ 2 �����������m�F���s�p���������v�\�������������B
339     * 2 ����������������������?
340     */
341    
342     if (AddCR) {
343 doda 6594 if (ts.PasteFlag & CPF_CONFIRM_CHANGEPASTE_CR) {
344 doda 6456 confirm = TRUE;
345     }
346     }
347     else {
348     pos = strcspn(CBMemPtr, "\r\n"); // ���s����������������
349     if (CBMemPtr[pos] != '\0') {
350     confirm = TRUE;
351     }
352     }
353    
354     // �������T�[�`����
355     if (!confirm && search_dict(ts.ConfirmChangePasteStringFile, CBMemPtr)) {
356     confirm = TRUE;
357     }
358    
359     if (confirm) {
360 zmatsuo 7509 ret = TTDialogBox(hInst, MAKEINTRESOURCE(IDD_CLIPBOARD_DIALOG),
361     HWin, (DLGPROC)OnClipboardDlgProc);
362 doda 6456 /*
363     * ���O���_�C�A���O�����e���N���b�v�{�[�h�����������������������A�K�v?
364     */
365     }
366    
367     if (ret == IDOK) {
368     return TRUE;
369     }
370     else {
371     return FALSE;
372     }
373     }
374    
375 doda 6440 void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed)
376     {
377 maya 3393 UINT Cf;
378 doda 6449 PCHAR TmpPtr;
379     LPWSTR TmpPtrW;
380     HGLOBAL TmpHandle;
381 doda 6453 unsigned int StrLen = 0, BuffLen = 0;
382 maya 3227
383 maya 3393 if (! cv.Ready) {
384     return;
385     }
386     if (TalkStatus!=IdTalkKeyb) {
387     return;
388     }
389 maya 3227
390 doda 6440 if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
391     Cf = CF_UNICODETEXT;
392 maya 3393 }
393 doda 6440 else if (IsClipboardFormatAvailable(CF_TEXT)) {
394     Cf = CF_TEXT;
395     }
396     else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
397     Cf = CF_OEMTEXT;
398     }
399     else {
400     return;
401     }
402 maya 3227
403 doda 3974 CBEchoOnly = FALSE;
404    
405 doda 6452 if (CBMemHandle) {
406     GlobalFree(CBMemHandle);
407     }
408 maya 3393 CBMemHandle = NULL;
409     CBMemPtr = NULL;
410     CBMemPtr2 = 0;
411 doda 5259
412 doda 6449 if (ts.PasteDelayPerLine > 0) {
413     CBInsertDelay = TRUE;
414     }
415     else {
416     CBInsertDelay = FALSE;
417     }
418    
419 doda 6440 CBRetrySend = FALSE;
420     CBRetryEcho = FALSE;
421     CBSendCR = FALSE;
422 maya 5071
423 doda 6440 if (OpenClipboard(HWin)) {
424 doda 6449 if ((TmpHandle = GetClipboardData(Cf)) != NULL) {
425     if (Cf == CF_UNICODETEXT) {
426     TmpPtrW = (LPWSTR)GlobalLock(TmpHandle);
427     BuffLen = WideCharToMultiByte(CP_ACP, 0, TmpPtrW, -1, 0, 0, NULL, NULL);
428     }
429     else {
430     TmpPtr = (PCHAR)GlobalLock(TmpHandle);
431     BuffLen = strlen(TmpPtr) + 1;
432     }
433 maya 5071
434 doda 6449 if (Bracketed) {
435 doda 6453 BuffLen += BracketStartLen + BracketEndLen;
436 doda 6449 }
437 maya 5071
438 doda 6449 if (AddCR) {
439     BuffLen++;
440     }
441    
442     if ((CBMemHandle = GlobalAlloc(GHND, BuffLen)) != NULL) {
443     if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
444     if (Cf == CF_UNICODETEXT) {
445 doda 6453 WideCharToMultiByte(CP_ACP, 0, TmpPtrW, -1, CBMemPtr, BuffLen, NULL, NULL);
446 doda 6449 }
447     else {
448 doda 6453 strncpy_s(CBMemPtr, BuffLen, TmpPtr, _TRUNCATE);
449 doda 6449 }
450    
451     TalkStatus = IdTalkCB;
452 maya 5071 }
453     }
454 doda 6449 GlobalUnlock(TmpHandle);
455 maya 3393 }
456 doda 6449 CloseClipboard();
457 maya 3393 }
458 doda 6440
459 doda 6453 // �\���t�����������������o���������� IdTalkCB ������
460    
461 maya 3393 if (TalkStatus != IdTalkCB) {
462 doda 6453 // �������s�����������������\���t�������f����
463 maya 3393 CBEndPaste();
464 doda 6453 return;
465 maya 3393 }
466 doda 6453
467     // �\���t���O���N���b�v�{�[�h�����e���m�F/���H�������������������s��
468    
469 doda 6455 if (!TrimTrailingNL(AddCR, Bracketed)) {
470     CBEndPaste();
471     return;
472     }
473    
474 doda 6595 if (!NormalizeLineBreak(AddCR, Bracketed)) {
475     CBEndPaste();
476     return;
477     }
478    
479 doda 6459 if (!CheckClipboardContent(HWin, AddCR, Bracketed)) {
480 doda 6456 CBEndPaste();
481     return;
482     }
483    
484 doda 6453 // AddCR / Bracket �p�����������������m�F�A�������������m��
485     StrLen = strlen(CBMemPtr);
486     BuffLen = StrLen + 1; // strlen + NUL
487     if (AddCR) {
488     BuffLen++;
489     }
490     if (Bracketed) {
491     BuffLen += BracketStartLen + BracketEndLen;
492     }
493    
494     if (GlobalSize(CBMemHandle) < BuffLen) {
495     GlobalUnlock(CBMemHandle);
496     CBMemPtr = NULL;
497     if ((TmpHandle = GlobalReAlloc(CBMemHandle, BuffLen, 0)) == NULL) {
498     /*
499     * �s�������m�����s�������� CR/Bracket �������\���t�����s���������A
500     * ���������\���t�����������~����(CBEndPaste()������)�������B
501     */
502     // CBEndPaste();
503     return;
504     }
505     CBMemHandle = TmpHandle;
506     CBMemPtr = GlobalLock(CBMemHandle);
507     }
508    
509     if (AddCR) {
510     CBMemPtr[StrLen++] = '\r';
511 doda 6593 CBMemPtr[StrLen++] = 0;
512 doda 6453 }
513    
514     if (Bracketed) {
515     BuffLen = GlobalSize(CBMemHandle);
516     memmove_s(CBMemPtr+BracketStartLen, BuffLen-BracketStartLen, CBMemPtr, StrLen);
517     memcpy_s(CBMemPtr, BuffLen, BracketStart, BracketStartLen);
518     strncat_s(CBMemPtr, BuffLen, BracketEnd, _TRUNCATE);
519     }
520    
521     GlobalUnlock(CBMemHandle);
522     CBMemPtr = NULL;
523 maya 3227 }
524    
525 doda 4769 void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer)
526     {
527     HANDLE tmpHandle = NULL;
528     char *tmpPtr = NULL;
529 doda 6448 int len, header_len, footer_len, b64_len;
530 maya 5071 UINT Cf;
531     LPWSTR tmpPtrWide = NULL;
532 doda 4769
533     if (! cv.Ready) {
534     return;
535     }
536     if (TalkStatus!=IdTalkKeyb) {
537     return;
538     }
539    
540     CBEchoOnly = FALSE;
541    
542 doda 6452 if (CBMemHandle) {
543     GlobalFree(CBMemHandle);
544     }
545 doda 4769 CBMemHandle = NULL;
546     CBMemPtr = NULL;
547     CBMemPtr2 = 0;
548    
549 doda 5259 if (ts.PasteDelayPerLine > 0) {
550     CBInsertDelay = TRUE;
551     }
552     else {
553     CBInsertDelay = FALSE;
554     }
555    
556 doda 6449 CBRetrySend = FALSE;
557     CBRetryEcho = FALSE;
558     CBSendCR = FALSE;
559    
560 maya 5071 if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(HWin)) {
561     Cf = CF_UNICODETEXT;
562     if ((tmpHandle = GetClipboardData(CF_UNICODETEXT)) == NULL) {
563     CloseClipboard();
564     }
565     }
566     else if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(HWin)) {
567     Cf = CF_TEXT;
568 doda 4769 if ((tmpHandle = GetClipboardData(CF_TEXT)) == NULL) {
569     CloseClipboard();
570     }
571     }
572     else if (IsClipboardFormatAvailable(CF_OEMTEXT) && OpenClipboard(HWin)) {
573 maya 5071 Cf = CF_OEMTEXT;
574 doda 4769 if ((tmpHandle = GetClipboardData(CF_OEMTEXT)) == NULL) {
575     CloseClipboard();
576     }
577     }
578    
579 doda 6448 if (tmpHandle) {
580     if (Cf == CF_UNICODETEXT) {
581 maya 5071 if ((tmpPtrWide = GlobalLock(tmpHandle)) != NULL) {
582 doda 6448 len = WideCharToMultiByte(CP_ACP, 0, tmpPtrWide, -1, 0, 0, NULL, NULL);
583     if ((tmpPtr = (char *)calloc(sizeof(char), len)) != NULL) {
584     WideCharToMultiByte(CP_ACP, 0, tmpPtrWide, -1, tmpPtr, len, NULL, NULL);
585 maya 5071 }
586 doda 6448 // WideCharToMultiByte �������������������� \0 ����������
587     // \0 ���G���R�[�h������������������ 1 ������
588     len--;
589 doda 6461 GlobalUnlock(tmpHandle);
590 maya 5071 }
591     }
592 doda 6448 else {
593 maya 5071 if ((tmpPtr = GlobalLock(tmpHandle)) != NULL) {
594     len = strlen(tmpPtr);
595 doda 6448 }
596     }
597    
598     if (tmpPtr) {
599     header_len = strlen(header);
600     footer_len = strlen(footer);
601    
602     b64_len = (len + 2) / 3 * 4 + header_len + footer_len + 1;
603    
604     if ((CBMemHandle = GlobalAlloc(GHND, b64_len)) != NULL) {
605     if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
606     if (header_len > 0) {
607     strncpy_s(CBMemPtr, b64_len, header, _TRUNCATE);
608 doda 4769 }
609 doda 6448 b64encode(CBMemPtr + header_len, b64_len - header_len, tmpPtr, len);
610     if (footer_len > 0) {
611     strncat_s(CBMemPtr, b64_len, footer, _TRUNCATE);
612     }
613     TalkStatus=IdTalkCB;
614     GlobalUnlock(CBMemPtr);
615     CBMemPtr = NULL;
616 doda 4769 }
617 doda 6448 }
618    
619     if (Cf == CF_UNICODETEXT) {
620     free(tmpPtr);
621     }
622     else {
623 doda 6461 GlobalUnlock(tmpHandle);
624 doda 4769 }
625     }
626 doda 6448 CloseClipboard();
627 doda 4769 }
628    
629     if (TalkStatus != IdTalkCB) {
630     CBEndPaste();
631     }
632     }
633    
634 maya 3227 // �����������N���b�v�{�[�h������DDE�f�[�^���[�������������B
635     //
636     // CBMemHandle�n���h�����O���[�o�������������A�����������I�������������A
637     // �����N���b�v�{�[�h������DDE�f�[�^�������������������������i�j�����������\�������j�B
638     // �����A�f�[�^���� null-terminate �����������������O�����������������A�������f�[�^����
639     // �����������B
640     // (2006.11.6 yutaka)
641     void CBSend()
642     {
643 maya 3393 int c;
644     BOOL EndFlag;
645 doda 3688 static DWORD lastcr;
646     DWORD now;
647 maya 3227
648 maya 3393 if (CBMemHandle==NULL) {
649     return;
650     }
651 maya 3227
652 doda 3974 if (CBEchoOnly) {
653     CBEcho();
654     return;
655     }
656    
657 doda 5259 if (CBInsertDelay) {
658     now = GetTickCount();
659     if (now - lastcr < (DWORD)ts.PasteDelayPerLine) {
660     return;
661     }
662 doda 3688 }
663    
664 maya 3393 if (CBRetrySend) {
665     CBRetryEcho = (ts.LocalEcho>0);
666     c = CommTextOut(&cv,(PCHAR)&CBByte,1);
667     CBRetrySend = (c==0);
668     if (CBRetrySend) {
669     return;
670     }
671     }
672 maya 3227
673 maya 3393 if (CBRetryEcho) {
674     c = CommTextEcho(&cv,(PCHAR)&CBByte,1);
675     CBRetryEcho = (c==0);
676     if (CBRetryEcho) {
677     return;
678     }
679     }
680 maya 3227
681 maya 4009 CBMemPtr = GlobalLock(CBMemHandle);
682     if (CBMemPtr==NULL) {
683 maya 3393 return;
684     }
685 maya 3227
686 maya 3393 do {
687     if (CBSendCR && (CBMemPtr[CBMemPtr2]==0x0a)) {
688     CBMemPtr2++;
689     // added PasteDelayPerLine (2009.4.12 maya)
690 doda 5259 if (CBInsertDelay) {
691 doda 3690 lastcr = now;
692     CBSendCR = FALSE;
693     SetTimer(HVTWin, IdPasteDelayTimer, ts.PasteDelayPerLine, NULL);
694     break;
695     }
696 maya 3393 }
697    
698     EndFlag = (CBMemPtr[CBMemPtr2]==0);
699 doda 6449 if (! EndFlag) {
700 maya 3393 CBByte = CBMemPtr[CBMemPtr2];
701     CBMemPtr2++;
702 maya 3227 // Decoding characters which are encoded by MACRO
703     // to support NUL character sending
704     //
705     // [encoded character] --> [decoded character]
706     // 01 01 --> 00
707     // 01 02 --> 01
708 maya 3393 if (CBByte==0x01) { /* 0x01 from MACRO */
709     CBByte = CBMemPtr[CBMemPtr2];
710     CBMemPtr2++;
711     CBByte = CBByte - 1; // character just after 0x01
712     }
713     }
714     else {
715     CBEndPaste();
716     return;
717     }
718 maya 3227
719 maya 3393 if (! EndFlag) {
720     c = CommTextOut(&cv,(PCHAR)&CBByte,1);
721     CBSendCR = (CBByte==0x0D);
722     CBRetrySend = (c==0);
723     if ((! CBRetrySend) &&
724     (ts.LocalEcho>0)) {
725     c = CommTextEcho(&cv,(PCHAR)&CBByte,1);
726     CBRetryEcho = (c==0);
727     }
728     }
729     else {
730     c=0;
731     }
732     }
733     while (c>0);
734 maya 3227
735 maya 4009 if (CBMemPtr!=NULL) {
736 maya 3393 GlobalUnlock(CBMemHandle);
737     CBMemPtr=NULL;
738     }
739 maya 3227 }
740    
741 doda 3974 void CBEcho()
742     {
743     if (CBMemHandle==NULL) {
744     return;
745     }
746    
747     if (CBRetryEcho && CommTextEcho(&cv,(PCHAR)&CBByte,1) == 0) {
748     return;
749     }
750    
751     if ((CBMemPtr = GlobalLock(CBMemHandle)) == NULL) {
752     return;
753     }
754    
755     do {
756     if (CBSendCR && (CBMemPtr[CBMemPtr2]==0x0a)) {
757     CBMemPtr2++;
758     }
759    
760     if (CBMemPtr[CBMemPtr2] == 0) {
761     CBRetryEcho = FALSE;
762     CBEndPaste();
763     return;
764     }
765    
766     CBByte = CBMemPtr[CBMemPtr2];
767     CBMemPtr2++;
768    
769     // Decoding characters which are encoded by MACRO
770     // to support NUL character sending
771     //
772     // [encoded character] --> [decoded character]
773     // 01 01 --> 00
774     // 01 02 --> 01
775     if (CBByte==0x01) { /* 0x01 from MACRO */
776     CBByte = CBMemPtr[CBMemPtr2];
777     CBMemPtr2++;
778     CBByte = CBByte - 1; // character just after 0x01
779     }
780    
781     CBSendCR = (CBByte==0x0D);
782    
783     } while (CommTextEcho(&cv,(PCHAR)&CBByte,1) > 0);
784    
785     CBRetryEcho = TRUE;
786    
787     if (CBMemHandle != NULL) {
788     GlobalUnlock(CBMemHandle);
789     CBMemPtr=NULL;
790     }
791     }
792    
793 maya 3227 void CBEndPaste()
794     {
795 maya 3393 TalkStatus = IdTalkKeyb;
796 maya 3227
797 maya 3393 if (CBMemHandle!=NULL) {
798     if (CBMemPtr!=NULL) {
799     GlobalUnlock(CBMemHandle);
800     }
801 doda 6449 GlobalFree(CBMemHandle);
802 maya 3393 }
803 maya 3227
804 maya 3393 CBMemHandle = NULL;
805     CBMemPtr = NULL;
806     CBMemPtr2 = 0;
807 doda 3974 CBEchoOnly = FALSE;
808 doda 5259 CBInsertDelay = FALSE;
809 maya 3227 }
810    
811 doda 6418 BOOL CBSetClipboard(HWND owner, HGLOBAL hMem)
812     {
813     char *buf;
814     int wide_len;
815     HGLOBAL wide_hMem;
816 zmatsuo 7509 LPWSTR wide_buf = 0;
817 maya 3227
818 doda 6418 if (OpenClipboard(owner) == 0)
819     return FALSE;
820    
821     buf = GlobalLock(hMem);
822    
823     wide_len = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
824     wide_hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len);
825     if (wide_hMem) {
826     wide_buf = (LPWSTR)GlobalLock(wide_hMem);
827     MultiByteToWideChar(CP_ACP, 0, buf, -1, wide_buf, wide_len);
828     GlobalUnlock(wide_hMem);
829     }
830    
831     GlobalUnlock(hMem);
832    
833     EmptyClipboard();
834     SetClipboardData(CF_TEXT, hMem);
835     if (wide_buf) {
836     SetClipboardData(CF_UNICODETEXT, wide_hMem);
837     }
838     CloseClipboard();
839    
840     return TRUE;
841     }
842    
843     HGLOBAL CBAllocClipboardMem(char *text)
844     {
845     HGLOBAL hMem;
846     char *buf;
847     int len;
848    
849     len = strlen(text);
850    
851     hMem = GlobalAlloc(GMEM_MOVEABLE, len+1);
852     if (hMem) {
853     buf = GlobalLock(hMem);
854     strncpy_s(buf, len+1, text, _TRUNCATE);
855     GlobalUnlock(hMem);
856     }
857    
858     return hMem;
859     }
860    
861 maya 3227 static LRESULT CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
862     {
863 zmatsuo 7509 static const DlgTextInfo TextInfos[] = {
864     { 0, "DLG_CLIPBOARD_TITLE" },
865     { IDCANCEL, "BTN_CANCEL" },
866     { IDOK, "BTN_OK" },
867     };
868 maya 3227 POINT p;
869 zmatsuo 8408 RECT rc_dlg;
870 maya 3902 static int ok2right, edit2ok, edit2bottom;
871     RECT rc_edit, rc_ok, rc_cancel;
872 yutakapon 3635 // for status bar
873     static HWND hStatus = NULL;
874 zmatsuo 7509 static int init_width, init_height;
875 maya 3227
876     switch (msg) {
877     case WM_INITDIALOG:
878 zmatsuo 7509 SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
879 maya 3227
880 zmatsuo 7509 SetDlgItemTextA(hDlgWnd, IDC_EDIT, CBMemPtr);
881 maya 3227
882 doda 6459 if (ActiveWin == IdVT) { // VT Window
883     /*
884     * Caret off ���� GetCaretPos() �����m���������������������A
885     * vtdisp.c �������������������l�����v�Z����
886     */
887     DispConvScreenToWin(CursorX, CursorY, &p.x, &p.y);
888     }
889     else if (!GetCaretPos(&p)) { // Tek Window
890     /*
891     * Tek Window �������������l�������������|������ GetCaretPos() ���g��
892     * GetCaretPos() ���G���[���������������O������ 0, 0 ������������
893     */
894     p.x = 0;
895     p.y = 0;
896     }
897 maya 3227
898 doda 6460 // x, y �������� 0 �������e�E�B���h�E���������������������������A
899     // �������h������ x �� 1 ������
900     if (p.x == 0 && p.y == 0) {
901     p.x = 1;
902     }
903    
904 doda 6459 ClientToScreen(GetParent(hDlgWnd), &p);
905 maya 3227 SetWindowPos(hDlgWnd, NULL, p.x, p.y,
906     0, 0, SWP_NOSIZE | SWP_NOZORDER);
907 zmatsuo 8408 MoveWindowToDisplay(hDlgWnd);
908 maya 3227
909 maya 3641 // �_�C�A���O�������T�C�Y������
910     GetWindowRect(hDlgWnd, &rc_dlg);
911     init_width = rc_dlg.right - rc_dlg.left;
912     init_height = rc_dlg.bottom - rc_dlg.top;
913    
914 maya 3227 // �����T�C�Y�����K�v���l���v�Z
915     GetClientRect(hDlgWnd, &rc_dlg);
916     GetWindowRect(GetDlgItem(hDlgWnd, IDC_EDIT), &rc_edit);
917     GetWindowRect(GetDlgItem(hDlgWnd, IDOK), &rc_ok);
918    
919     p.x = rc_dlg.right;
920     p.y = rc_dlg.bottom;
921     ClientToScreen(hDlgWnd, &p);
922     ok2right = p.x - rc_ok.left;
923 maya 3902 edit2bottom = p.y - rc_edit.bottom;
924 maya 3227 edit2ok = rc_ok.left - rc_edit.right;
925    
926     // �T�C�Y������
927     SetWindowPos(hDlgWnd, NULL, 0, 0,
928     ts.PasteDialogSize.cx, ts.PasteDialogSize.cy,
929     SWP_NOZORDER | SWP_NOMOVE);
930    
931 yutakapon 3635 // ���T�C�Y�A�C�R�����E�����\���������������A�X�e�[�^�X�o�[���t�����B
932     InitCommonControls();
933     hStatus = CreateStatusWindow(
934     WS_CHILD | WS_VISIBLE |
935     CCS_BOTTOM | SBARS_SIZEGRIP, NULL, hDlgWnd, 1);
936    
937 maya 3227 return TRUE;
938    
939     case WM_COMMAND:
940     switch (LOWORD(wp)) {
941     case IDOK:
942     {
943 zmatsuo 7509 unsigned len = SendMessageA(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXTLENGTH, 0, 0);
944 maya 3227 HGLOBAL hMem;
945 doda 6456 INT_PTR result = IDCANCEL;
946 maya 3227
947 doda 6456 if (CBMemHandle == NULL) {
948     CBMemHandle = GlobalAlloc(GHND, len+1);
949     }
950     else if (GlobalSize(CBMemHandle) <= len) {
951     if (CBMemPtr) {
952     GlobalUnlock(CBMemHandle);
953     CBMemPtr = NULL;
954     }
955     hMem = GlobalReAlloc(CBMemHandle, len+1, 0);
956     if (hMem) {
957     CBMemHandle = hMem;
958     CBMemPtr = GlobalLock(CBMemHandle);
959     }
960     else {
961     /*
962     * ���������m�����������������������������������B
963     *
964     * �_�C�A���O�������������s�������������l������
965     * �L�����Z�������������������������A����������������
966     * �s���������v�����������A���������������������e��
967     * �\���t���������e���B
968     *
969     * ���������������S�����|���A���������J�������\���t����
970     * �s�������������������B
971     */
972     GlobalFree(CBMemHandle);
973     CBMemHandle = NULL;
974     }
975     }
976 doda 6417
977 doda 6456 if (CBMemHandle) {
978     if (CBMemPtr == NULL) {
979     CBMemPtr = GlobalLock(CBMemHandle);
980 maya 5071 }
981 zmatsuo 7509 GetDlgItemTextA(hDlgWnd, IDC_EDIT, CBMemPtr, GlobalSize(CBMemHandle));
982 doda 6456 result = IDOK;
983 maya 3902 }
984 maya 3227
985 yutakapon 3635 DestroyWindow(hStatus);
986 zmatsuo 7509 TTEndDialog(hDlgWnd, result);
987 maya 3227 }
988     break;
989    
990     case IDCANCEL:
991 yutakapon 3635 DestroyWindow(hStatus);
992 zmatsuo 7509 TTEndDialog(hDlgWnd, IDCANCEL);
993 maya 3227 break;
994    
995     default:
996     return FALSE;
997     }
998    
999     case WM_SIZE:
1000     {
1001     // ���z�u
1002     POINT p;
1003     int dlg_w, dlg_h;
1004    
1005     GetClientRect(hDlgWnd, &rc_dlg);
1006     dlg_w = rc_dlg.right;
1007     dlg_h = rc_dlg.bottom;
1008    
1009     GetWindowRect(GetDlgItem(hDlgWnd, IDC_EDIT), &rc_edit);
1010     GetWindowRect(GetDlgItem(hDlgWnd, IDOK), &rc_ok);
1011     GetWindowRect(GetDlgItem(hDlgWnd, IDCANCEL), &rc_cancel);
1012    
1013     // OK
1014     p.x = rc_ok.left;
1015     p.y = rc_ok.top;
1016     ScreenToClient(hDlgWnd, &p);
1017     SetWindowPos(GetDlgItem(hDlgWnd, IDOK), 0,
1018     dlg_w - ok2right, p.y, 0, 0,
1019     SWP_NOSIZE | SWP_NOZORDER);
1020    
1021     // CANCEL
1022     p.x = rc_cancel.left;
1023     p.y = rc_cancel.top;
1024     ScreenToClient(hDlgWnd, &p);
1025     SetWindowPos(GetDlgItem(hDlgWnd, IDCANCEL), 0,
1026     dlg_w - ok2right, p.y, 0, 0,
1027     SWP_NOSIZE | SWP_NOZORDER);
1028    
1029     // EDIT
1030     p.x = rc_edit.left;
1031     p.y = rc_edit.top;
1032     ScreenToClient(hDlgWnd, &p);
1033     SetWindowPos(GetDlgItem(hDlgWnd, IDC_EDIT), 0,
1034 maya 3902 0, 0, dlg_w - p.x - edit2ok - ok2right, dlg_h - p.y - edit2bottom,
1035 maya 3227 SWP_NOMOVE | SWP_NOZORDER);
1036    
1037     // �T�C�Y������
1038     GetWindowRect(hDlgWnd, &rc_dlg);
1039     ts.PasteDialogSize.cx = rc_dlg.right - rc_dlg.left;
1040     ts.PasteDialogSize.cy = rc_dlg.bottom - rc_dlg.top;
1041 yutakapon 3635
1042     // status bar
1043     SendMessage(hStatus , msg , wp , lp);
1044 maya 3227 }
1045     return TRUE;
1046    
1047 maya 3641 case WM_GETMINMAXINFO:
1048     {
1049     // �_�C�A���O�������T�C�Y����������������������������
1050     LPMINMAXINFO lpmmi;
1051     lpmmi = (LPMINMAXINFO)lp;
1052     lpmmi->ptMinTrackSize.x = init_width;
1053     lpmmi->ptMinTrackSize.y = init_height;
1054     }
1055     return FALSE;
1056    
1057 maya 3227 default:
1058     return FALSE;
1059     }
1060     return TRUE;
1061     }

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