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 6535 - (hide annotations) (download) (as text)
Mon Nov 14 23:59:24 2016 UTC (7 years, 4 months ago) by doda
File MIME type: text/x-csrc
File size: 23903 byte(s)
ブロードキャストコマンドコマンドでゴミが付加される問題を修正 #36784

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

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