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 8588 - (hide annotations) (download) (as text)
Wed Mar 11 15:36:57 2020 UTC (4 years, 1 month ago) by zmatsuo
File MIME type: text/x-csrc
File size: 36215 byte(s)
Merge branch 'sendmem_sendsize' into trunk

- sendfiledlg.cpp の SetI18nDropDownList() を削除
- SetI18nDropDownList() を SetI18nList() に変更
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 zmatsuo 8459 * (C) 2006-2020 TeraTerm Project
4 doda 6806 * 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 doda 8445 #define _CRTDBG_MAP_ALLOC
40     #include <crtdbg.h>
41     #include <wchar.h>
42 maya 3227
43     #include "ttwinman.h"
44     #include "ttcommon.h"
45 doda 4769 #include "ttlib.h"
46 zmatsuo 7509 #include "dlglib.h"
47 doda 8445 #include "codeconv.h"
48 maya 3227
49     #include "clipboar.h"
50     #include "tt_res.h"
51 zmatsuo 8586 #include "fileread.h"
52 doda 8445 #include "unicode_test.h"
53     #include "sendmem.h"
54     #include "clipboarddlg.h"
55 maya 3227
56     // for clipboard copy
57     static HGLOBAL CBCopyHandle = NULL;
58     static PCHAR CBCopyPtr = NULL;
59 maya 5071 static HGLOBAL CBCopyWideHandle = NULL;
60     static LPWSTR CBCopyWidePtr = NULL;
61 maya 3227
62     // for clipboard paste
63     static HGLOBAL CBMemHandle = NULL;
64     static PCHAR CBMemPtr = NULL;
65     static LONG CBMemPtr2 = 0;
66     static BYTE CBByte;
67     static BOOL CBRetrySend;
68     static BOOL CBRetryEcho;
69     static BOOL CBSendCR;
70 doda 3974 static BOOL CBEchoOnly;
71 doda 5259 static BOOL CBInsertDelay = FALSE;
72 maya 3227
73 doda 8445 static const wchar_t BracketStartW[] = L"\033[200~";
74     static const wchar_t BracketEndW[] = L"\033[201~";
75 doda 6456
76 doda 8445 static void CBEcho(void);
77     #if !UNICODE_INTERNAL_BUFF
78     static INT_PTR CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp);
79     #endif
80    
81     #if !UNICODE_INTERNAL_BUFF
82 maya 3227 PCHAR CBOpen(LONG MemSize)
83     {
84 maya 3393 if (MemSize==0) {
85     return (NULL);
86     }
87     if (CBCopyHandle!=NULL) {
88     return (NULL);
89     }
90     CBCopyPtr = NULL;
91     CBCopyHandle = GlobalAlloc(GMEM_MOVEABLE, MemSize);
92     if (CBCopyHandle == NULL) {
93     MessageBeep(0);
94     }
95     else {
96     CBCopyPtr = GlobalLock(CBCopyHandle);
97     if (CBCopyPtr == NULL) {
98     GlobalFree(CBCopyHandle);
99     CBCopyHandle = NULL;
100     MessageBeep(0);
101     }
102     }
103     return (CBCopyPtr);
104 maya 3227 }
105    
106     void CBClose()
107     {
108 maya 3393 BOOL Empty;
109 maya 5071 int WideCharLength;
110    
111 maya 3393 if (CBCopyHandle==NULL) {
112     return;
113     }
114 maya 3227
115 maya 5071 WideCharLength = MultiByteToWideChar(CP_ACP, 0, CBCopyPtr, -1, NULL, 0);
116     CBCopyWideHandle = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * WideCharLength);
117     if (CBCopyWideHandle) {
118     CBCopyWidePtr = (LPWSTR)GlobalLock(CBCopyWideHandle);
119     MultiByteToWideChar(CP_ACP, 0, CBCopyPtr, -1, CBCopyWidePtr, WideCharLength);
120     GlobalUnlock(CBCopyWideHandle);
121     }
122    
123 maya 3393 Empty = FALSE;
124     if (CBCopyPtr!=NULL) {
125     Empty = (CBCopyPtr[0]==0);
126     }
127 maya 3227
128 maya 3393 GlobalUnlock(CBCopyHandle);
129     CBCopyPtr = NULL;
130 maya 3227
131 maya 3393 if (OpenClipboard(HVTWin)) {
132     EmptyClipboard();
133     if (! Empty) {
134     SetClipboardData(CF_TEXT, CBCopyHandle);
135 maya 5071 if (CBCopyWidePtr) {
136     SetClipboardData(CF_UNICODETEXT, CBCopyWideHandle);
137     CBCopyWidePtr = NULL;
138     }
139 maya 3393 }
140     CloseClipboard();
141     }
142     CBCopyHandle = NULL;
143 maya 5071 CBCopyWideHandle = NULL;
144 maya 3227 }
145 doda 8445 #endif
146 maya 3227
147 doda 8445 /**
148     * ���������M
149     * ���������������g�p����������
150     * - DDE(TTL)
151     * - �u���[�h�L���X�g
152     */
153 doda 6440 void CBStartSend(PCHAR DataPtr, int DataSize, BOOL EchoOnly)
154 maya 3227 {
155 doda 6440 if (! cv.Ready) {
156     return;
157     }
158     if (TalkStatus!=IdTalkKeyb) {
159     return;
160     }
161    
162     CBEchoOnly = EchoOnly;
163    
164 doda 6452 if (CBMemHandle) {
165     GlobalFree(CBMemHandle);
166     }
167 doda 6440 CBMemHandle = NULL;
168     CBMemPtr = NULL;
169     CBMemPtr2 = 0;
170    
171     CBInsertDelay = FALSE;
172    
173     CBRetrySend = FALSE;
174     CBRetryEcho = FALSE;
175     CBSendCR = FALSE;
176    
177 doda 6535 if ((CBMemHandle = GlobalAlloc(GHND, DataSize+1)) != NULL) {
178 doda 6440 if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
179     memcpy(CBMemPtr, DataPtr, DataSize);
180 doda 6535 // WM_COPYDATA ���������������f�[�^�� NUL Terminate ���������������� NUL ���t������
181     CBMemPtr[DataSize] = 0;
182 doda 6440 GlobalUnlock(CBMemHandle);
183     CBMemPtr=NULL;
184     TalkStatus=IdTalkCB;
185     }
186     }
187     if (TalkStatus != IdTalkCB) {
188     CBEndPaste();
189     }
190     }
191    
192 doda 8445 #if !UNICODE_INTERNAL_BUFF
193 doda 6455 // �N���b�v�{�[�h�o�b�t�@������������ CR / LF ����������������
194 doda 8445 static BOOL TrimTrailingNL(BOOL AddCR, BOOL Bracketed)
195     {
196 doda 6455 PCHAR tail;
197 doda 6594 if (ts.PasteFlag & CPF_TRIM_TRAILING_NL) {
198 doda 6455 for (tail = CBMemPtr+strlen(CBMemPtr)-1; tail >= CBMemPtr; tail--) {
199     if (*tail != '\r' && *tail != '\n') {
200     break;
201     }
202     *tail = '\0';
203     }
204     }
205    
206     return TRUE;
207     }
208 doda 8445 #endif
209 doda 6455
210 doda 8445 static void TrimTrailingNLW(wchar_t *src)
211     {
212     wchar_t *tail = src + wcslen(src) - 1;
213     while(tail >= src) {
214     if (*tail != L'\r' && *tail != L'\n') {
215     break;
216     }
217     *tail = L'\0';
218     tail--;
219     }
220     }
221    
222 doda 6595 // ���s�� CR+LF �����K������
223 doda 8445 static BOOL NormalizeLineBreak(BOOL AddCR, BOOL Bracketed) {
224 doda 6595 char *p, *p2;
225     unsigned int len, need_len, alloc_len;
226     HGLOBAL TmpHandle;
227    
228     p = CBMemPtr;
229    
230     // �\���t���f�[�^������(len)�A���������K�������f�[�^������(need_len)���J�E���g
231     for (len=0, need_len=0, p=CBMemPtr; *p != '\0'; p++, len++, need_len++) {
232     if (*p == CR) {
233     need_len++;
234     if (*(p+1) == LF) {
235     len++;
236     p++;
237     }
238     }
239     else if (*p == LF) {
240     need_len++;
241     }
242     }
243    
244     // ���K�������f�[�^�������������� => ���K�����K�v����
245     if (need_len == len) {
246     return TRUE;
247     }
248    
249     // AddCR / Bracketed ���������������o�b�t�@���v�Z��������
250     // ������������������������������������
251     alloc_len = need_len + 1;
252     if (AddCR) {
253     alloc_len++;
254     }
255     if (Bracketed) {
256     // ������
257     alloc_len += 12;
258     }
259    
260     // �o�b�t�@�T�C�Y�����K�������K�v�������l�����������������o�b�t�@���m��������
261     if (GlobalSize(CBMemHandle) < alloc_len) {
262     GlobalUnlock(CBMemHandle);
263     CBMemPtr = NULL;
264     if ((TmpHandle = GlobalReAlloc(CBMemHandle, alloc_len, 0)) == NULL) {
265     // �������������������s
266     CBMemPtr = GlobalLock(CBMemHandle);
267    
268     // �������������K���������\���t������������
269     return TRUE;
270     }
271     CBMemHandle = TmpHandle;
272     CBMemPtr = GlobalLock(CBMemHandle);
273     }
274    
275     p = CBMemPtr + len - 1;
276     p2 = CBMemPtr + need_len;
277     *p2-- = '\0';
278    
279     while (len > 0 && p < p2) {
280     if (*p == LF) {
281     *p2-- = *p--;
282     if (--len == 0) {
283     *p2 = CR;
284     break;
285     }
286     if (*p != CR) {
287     *p2-- = CR;
288     if (p2 <= p) {
289     break;
290     }
291     else {
292     continue;
293     }
294     }
295     }
296     else if (*p == CR) {
297     *p2-- = LF;
298     if (p == p2)
299     break;
300     }
301     *p2-- = *p--;
302     len--;
303     }
304    
305     return TRUE;
306     }
307    
308 doda 8445 static wchar_t *NormalizeLineBreakW(const wchar_t *src_)
309     {
310     const wchar_t *src = src_;
311     wchar_t *dest_top;
312     wchar_t *dest;
313     size_t len, need_len, alloc_len;
314    
315     // �\���t���f�[�^������(len)�A���������K�������f�[�^������(need_len)���J�E���g
316     for (len=0, need_len=0, src=src_; *src != '\0'; src++, len++, need_len++) {
317     if (*src == CR) {
318     need_len++;
319     if (*(src+1) == LF) {
320     len++;
321     src++;
322     }
323     }
324     else if (*src == LF) {
325     need_len++;
326     }
327     }
328    
329     // ���K�������f�[�^�������������� => ���K�����K�v����
330     if (need_len == len) {
331     dest = _wcsdup(src_);
332     return dest;
333     }
334     alloc_len = need_len + 1;
335    
336     dest_top = (wchar_t *)malloc(sizeof(wchar_t) * alloc_len);
337    
338     src = src_ + len - 1;
339     dest = dest_top + need_len;
340     *dest-- = '\0';
341     len = need_len;
342    
343     while (len > 0 && dest_top <= dest) {
344     if (*src == LF) {
345     *dest-- = *src--;
346     if (--len == 0) {
347     *dest = CR;
348     break;
349     }
350     if (*src != CR) {
351     *dest-- = CR;
352     if (dest <= dest_top) {
353     break;
354     }
355     else {
356     continue;
357     }
358     }
359     }
360     else if (*src == CR) {
361     *dest-- = LF;
362     if (src == dest)
363     break;
364     }
365     *dest-- = *src--;
366     len--;
367     }
368    
369     return dest_top;
370     }
371    
372 doda 6456 // �t�@�C�������`���������������Atext���������������������B
373 doda 8445 static BOOL search_dict(char *filename, char *text)
374 doda 6456 {
375     BOOL ret = FALSE;
376     FILE *fp = NULL;
377     char buf[256];
378 doda 8445 size_t len;
379 doda 6456
380     if (filename == NULL || filename[0] == '\0')
381     return FALSE;
382    
383     if ((fp = fopen(filename, "r")) == NULL)
384     return FALSE;
385    
386     // TODO: ���s��256byte�������������������l��
387     while (fgets(buf, sizeof(buf), fp) != NULL) {
388     len = strlen(buf);
389     if (len <= 1) {
390     continue;
391     }
392     if (buf[len - 1] == '\n') {
393     buf[len - 1] = '\0';
394     }
395     if (strstr(text, buf)) { // hit
396     ret = 1;
397     break;
398     }
399     }
400    
401     fclose(fp);
402    
403     return (ret);
404     }
405    
406 doda 8445 /**
407     * �t�@�C�������`���������������Atext���������������������B
408     * ���������� TRUE������
409     */
410     static BOOL search_dictW(char *filename, const wchar_t *text)
411     {
412     BOOL result = FALSE;
413     const wchar_t *buf_top = LoadFileWA(filename, NULL);
414     const wchar_t *buf = buf_top;
415     if (buf == NULL) {
416     return FALSE;
417     }
418    
419     for(;;) {
420     const wchar_t *line_end;
421     size_t len;
422     wchar_t *search_str;
423     if (*buf == 0) {
424     break;
425     }
426     if (*buf == '\r' || *buf == '\n') {
427     buf++;
428     continue;
429     }
430     line_end = wcspbrk(buf, L"\r\n");
431     if (line_end == NULL) {
432     // ���s������
433     len = wcslen(buf);
434     if (len == 0) {
435     // �I��
436     break;
437     }
438     } else {
439     len = line_end - buf;
440     }
441     search_str = (wchar_t *)malloc(sizeof(wchar_t) * (len+1));
442     if (search_str == NULL)
443     continue;
444     memcpy(search_str, buf, sizeof(wchar_t) * len);
445     search_str[len] = 0;
446     buf += len;
447     result = (wcsstr(text, search_str) != NULL);
448     free(search_str);
449     if (result) {
450     result = TRUE;
451     break;
452     }
453     }
454     free((void *)buf_top);
455     return result;
456     }
457    
458 doda 6456 /*
459     * �N���b�v�{�[�h�����e���m�F���A�\���t�����s�����m�F�_�C�A���O���o���B
460     *
461     * �����l:
462     * TRUE -> ���������A�\���t�������{
463     * FALSE -> �\���t�����~
464     */
465 doda 8445 #if !UNICODE_INTERNAL_BUFF
466     static BOOL CheckClipboardContent(HWND HWin, BOOL AddCR, BOOL Bracketed)
467 doda 6456 {
468 doda 8445 INT_PTR ret = IDOK;
469 doda 6456 BOOL confirm = FALSE;
470    
471 doda 6594 if ((ts.PasteFlag & CPF_CONFIRM_CHANGEPASTE) == 0) {
472 doda 6456 return TRUE;
473     }
474    
475     /*
476     * ConfirmChangePasteCR ����������
477     * �����������������������B
478     *
479     * ChangePasteCR !ChangePasteCR
480     * AddCR !AddCR AddCR !AddCR
481     * ���s���� o o x(2) o
482     * ���s���� o(1) x x x
483     *
484     * ChangePasteCR �� AddCR �������m�F���s����(1���m�F����)���������������A
485     * !ChangePasteCR �������l�������AAddCR ���������� CR ����������������
486     * �m�F���s������������ 2 �����������m�F���s�p���������v�\�������������B
487     * 2 ����������������������?
488     */
489    
490     if (AddCR) {
491 doda 6594 if (ts.PasteFlag & CPF_CONFIRM_CHANGEPASTE_CR) {
492 doda 6456 confirm = TRUE;
493     }
494     }
495     else {
496 doda 8445 size_t pos = strcspn(CBMemPtr, "\r\n"); // ���s����������������
497 doda 6456 if (CBMemPtr[pos] != '\0') {
498     confirm = TRUE;
499     }
500     }
501    
502     // �������T�[�`����
503     if (!confirm && search_dict(ts.ConfirmChangePasteStringFile, CBMemPtr)) {
504     confirm = TRUE;
505     }
506    
507     if (confirm) {
508 zmatsuo 7509 ret = TTDialogBox(hInst, MAKEINTRESOURCE(IDD_CLIPBOARD_DIALOG),
509 doda 8445 HWin, OnClipboardDlgProc);
510 doda 6456 /*
511     * ���O���_�C�A���O�����e���N���b�v�{�[�h�����������������������A�K�v?
512     */
513     }
514    
515     if (ret == IDOK) {
516     return TRUE;
517     }
518     else {
519     return FALSE;
520     }
521     }
522 doda 8445 #endif
523 doda 6456
524 doda 8445 /*
525     * �N���b�v�{�[�h�����e���m�F���A�\���t�����s�����m�F�_�C�A���O���o���B
526     *
527     * �����l:
528     * TRUE -> ���������A�\���t�������{
529     * FALSE -> �\���t�����~
530     */
531     static BOOL CheckClipboardContentW(HWND HWin, const wchar_t *str_w, BOOL AddCR, wchar_t **out_str_w)
532     {
533     INT_PTR ret;
534     BOOL confirm = FALSE;
535    
536     *out_str_w = NULL;
537     if ((ts.PasteFlag & CPF_CONFIRM_CHANGEPASTE) == 0) {
538     return TRUE;
539     }
540    
541     if (AddCR) {
542     if (ts.PasteFlag & CPF_CONFIRM_CHANGEPASTE_CR) {
543     confirm = TRUE;
544     }
545     }
546     else {
547     size_t pos = wcscspn(str_w, L"\r\n"); // ���s����������������
548     if (str_w[pos] != '\0') {
549     confirm = TRUE;
550     }
551     }
552    
553     // �������T�[�`����
554     if (!confirm && search_dictW(ts.ConfirmChangePasteStringFile, str_w)) {
555     confirm = TRUE;
556     }
557    
558     ret = IDOK;
559     if (confirm) {
560     clipboarddlgdata dlg_data;
561     dlg_data.strW_ptr = str_w;
562     dlg_data.UILanguageFile = ts.UILanguageFile;
563     ret = clipboarddlg(hInst, HWin, &dlg_data);
564     *out_str_w = dlg_data.strW_edited_ptr;
565     }
566    
567     if (ret == IDOK) {
568     return TRUE;
569     }
570     else {
571     return FALSE;
572     }
573     }
574    
575     #if !UNICODE_INTERNAL_BUFF
576 doda 6440 void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed)
577     {
578 maya 3393 UINT Cf;
579 doda 6449 PCHAR TmpPtr;
580     LPWSTR TmpPtrW;
581     HGLOBAL TmpHandle;
582 doda 8445 size_t StrLen = 0, BuffLen = 0;
583 maya 3227
584 maya 3393 if (! cv.Ready) {
585     return;
586     }
587     if (TalkStatus!=IdTalkKeyb) {
588     return;
589     }
590 maya 3227
591 doda 6440 if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
592     Cf = CF_UNICODETEXT;
593 maya 3393 }
594 doda 6440 else if (IsClipboardFormatAvailable(CF_TEXT)) {
595     Cf = CF_TEXT;
596     }
597     else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
598     Cf = CF_OEMTEXT;
599     }
600     else {
601     return;
602     }
603 maya 3227
604 doda 3974 CBEchoOnly = FALSE;
605    
606 doda 6452 if (CBMemHandle) {
607     GlobalFree(CBMemHandle);
608     }
609 maya 3393 CBMemHandle = NULL;
610     CBMemPtr = NULL;
611     CBMemPtr2 = 0;
612 doda 5259
613 doda 6449 if (ts.PasteDelayPerLine > 0) {
614     CBInsertDelay = TRUE;
615     }
616     else {
617     CBInsertDelay = FALSE;
618     }
619    
620 doda 6440 CBRetrySend = FALSE;
621     CBRetryEcho = FALSE;
622     CBSendCR = FALSE;
623 maya 5071
624 doda 6440 if (OpenClipboard(HWin)) {
625 doda 6449 if ((TmpHandle = GetClipboardData(Cf)) != NULL) {
626     if (Cf == CF_UNICODETEXT) {
627     TmpPtrW = (LPWSTR)GlobalLock(TmpHandle);
628     BuffLen = WideCharToMultiByte(CP_ACP, 0, TmpPtrW, -1, 0, 0, NULL, NULL);
629     }
630     else {
631     TmpPtr = (PCHAR)GlobalLock(TmpHandle);
632     BuffLen = strlen(TmpPtr) + 1;
633     }
634 maya 5071
635 doda 6449 if (Bracketed) {
636 doda 6453 BuffLen += BracketStartLen + BracketEndLen;
637 doda 6449 }
638 maya 5071
639 doda 6449 if (AddCR) {
640     BuffLen++;
641     }
642    
643     if ((CBMemHandle = GlobalAlloc(GHND, BuffLen)) != NULL) {
644     if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
645     if (Cf == CF_UNICODETEXT) {
646 doda 8445 WideCharToMultiByte(CP_ACP, 0, TmpPtrW, -1, CBMemPtr, (int)BuffLen, NULL, NULL);
647 doda 6449 }
648     else {
649 doda 6453 strncpy_s(CBMemPtr, BuffLen, TmpPtr, _TRUNCATE);
650 doda 6449 }
651    
652     TalkStatus = IdTalkCB;
653 maya 5071 }
654     }
655 doda 6449 GlobalUnlock(TmpHandle);
656 maya 3393 }
657 doda 6449 CloseClipboard();
658 maya 3393 }
659 doda 6440
660 doda 6453 // �\���t�����������������o���������� IdTalkCB ������
661    
662 maya 3393 if (TalkStatus != IdTalkCB) {
663 doda 6453 // �������s�����������������\���t�������f����
664 maya 3393 CBEndPaste();
665 doda 6453 return;
666 maya 3393 }
667 doda 6453
668     // �\���t���O���N���b�v�{�[�h�����e���m�F/���H�������������������s��
669    
670 doda 6455 if (!TrimTrailingNL(AddCR, Bracketed)) {
671     CBEndPaste();
672     return;
673     }
674    
675 doda 6595 if (!NormalizeLineBreak(AddCR, Bracketed)) {
676     CBEndPaste();
677     return;
678     }
679    
680 doda 6459 if (!CheckClipboardContent(HWin, AddCR, Bracketed)) {
681 doda 6456 CBEndPaste();
682     return;
683     }
684    
685 doda 6453 // AddCR / Bracket �p�����������������m�F�A�������������m��
686     StrLen = strlen(CBMemPtr);
687     BuffLen = StrLen + 1; // strlen + NUL
688     if (AddCR) {
689     BuffLen++;
690     }
691     if (Bracketed) {
692     BuffLen += BracketStartLen + BracketEndLen;
693     }
694    
695     if (GlobalSize(CBMemHandle) < BuffLen) {
696     GlobalUnlock(CBMemHandle);
697     CBMemPtr = NULL;
698     if ((TmpHandle = GlobalReAlloc(CBMemHandle, BuffLen, 0)) == NULL) {
699     /*
700     * �s�������m�����s�������� CR/Bracket �������\���t�����s���������A
701     * ���������\���t�����������~����(CBEndPaste()������)�������B
702     */
703     // CBEndPaste();
704     return;
705     }
706     CBMemHandle = TmpHandle;
707     CBMemPtr = GlobalLock(CBMemHandle);
708     }
709    
710     if (AddCR) {
711     CBMemPtr[StrLen++] = '\r';
712 doda 6593 CBMemPtr[StrLen++] = 0;
713 doda 6453 }
714    
715     if (Bracketed) {
716     BuffLen = GlobalSize(CBMemHandle);
717     memmove_s(CBMemPtr+BracketStartLen, BuffLen-BracketStartLen, CBMemPtr, StrLen);
718     memcpy_s(CBMemPtr, BuffLen, BracketStart, BracketStartLen);
719     strncat_s(CBMemPtr, BuffLen, BracketEnd, _TRUNCATE);
720     }
721    
722     GlobalUnlock(CBMemHandle);
723     CBMemPtr = NULL;
724 maya 3227 }
725 doda 8445 #endif
726 maya 3227
727 doda 8445 /**
728     * �N���b�v�{�[�h����wchar_t����������������
729     * �����������K�v��������wcslen()��������
730     * @param hWnd
731     * @param emtpy TRUE�������N���b�v�{�[�h����������
732     * @retval �����������|�C���^ �g�p��free()��������
733     * ����������(�������G���[��)��NULL
734     *
735     * TODO ttssh2/ttxssh/auth.c �� GetClipboardTextA() ���u������
736     */
737     static wchar_t *GetClipboardTextW(HWND hWnd, BOOL empty)
738     {
739     UINT Cf;
740     wchar_t *str_w = NULL;
741     size_t str_w_len;
742     HGLOBAL TmpHandle;
743    
744     if (IsClipboardFormatAvailable(CF_UNICODETEXT)) {
745     Cf = CF_UNICODETEXT;
746     }
747     else if (IsClipboardFormatAvailable(CF_TEXT)) {
748     Cf = CF_TEXT;
749     }
750     else if (IsClipboardFormatAvailable(CF_OEMTEXT)) {
751     Cf = CF_OEMTEXT;
752     }
753     else {
754     return NULL;
755     }
756    
757     if (!OpenClipboard(hWnd)) {
758     return NULL;
759     }
760     TmpHandle = GetClipboardData(Cf);
761     if (TmpHandle == NULL) {
762     return NULL;
763     }
764     if (Cf == CF_UNICODETEXT) {
765     const wchar_t *str_cb = (wchar_t *)GlobalLock(TmpHandle);
766     if (str_cb != NULL) {
767     size_t str_cb_len = GlobalSize(TmpHandle); // bytes
768     str_w_len = str_cb_len / sizeof(wchar_t);
769     str_w = malloc((str_w_len + 1) * sizeof(wchar_t)); // +1 for terminator
770     if (str_w != NULL) {
771     memcpy(str_w, str_cb, str_cb_len);
772     str_w[str_w_len] = L'\0';
773     }
774     }
775     }
776     else {
777     const char *str_cb = (char *)GlobalLock(TmpHandle);
778     if (str_cb != NULL) {
779     size_t str_cb_len = GlobalSize(TmpHandle);
780     str_w_len = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, str_cb, (int)str_cb_len, NULL, 0);
781     str_w = malloc(sizeof(wchar_t) * (str_w_len + 1)); // +1 for terminator
782     if (str_w != NULL) {
783     str_w_len = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, str_cb, (int)str_cb_len, str_w, (int)str_w_len);
784     str_w[str_w_len] = L'\0';
785     }
786     }
787     }
788     GlobalUnlock(TmpHandle);
789     if (empty) {
790     EmptyClipboard();
791     }
792     CloseClipboard();
793     return str_w;
794     }
795    
796     #if UNICODE_INTERNAL_BUFF
797     /**
798     * �N���b�v�{�[�h�p�e�L�X�g���M����
799     *
800     * @param str_w �����������|�C���^
801     * malloc()�������o�b�t�@�A���M��������������free()������
802     * @param str_len ������(wchar_t�P��)
803 zmatsuo 8456 * 0 �������� L'\0' ����
804 doda 8445 */
805     static void CBSendStart(wchar_t *str_w, size_t str_len)
806     {
807     SendMem *sm;
808     if (str_len == 0) {
809     str_len = wcslen(str_w);
810     }
811 zmatsuo 8456 sm = SendMemTextW(str_w, str_len);
812 doda 8445 if (sm == NULL)
813     return;
814 zmatsuo 8588 if (ts.PasteDelayPerLine == 0) {
815     SendMemInitDelay(sm, SENDMEM_DELAYTYPE_NO_DELAY, 0, 0);
816 doda 8445 }
817 zmatsuo 8588 else {
818     SendMemInitDelay(sm, SENDMEM_DELAYTYPE_PER_LINE, ts.PasteDelayPerLine, 0);
819     }
820 doda 8445 #if 0
821     SendMemInitDialog(sm, hInst, HVTWin, ts.UILanguageFile);
822     SendMemInitDialogCaption(sm, L"from clipboard");
823     SendMemInitDialogFilename(sm, L"Clipboard");
824     #endif
825     SendMemStart(sm);
826     }
827     #endif
828    
829     #if UNICODE_INTERNAL_BUFF
830     void CBStartPaste(HWND HWin, BOOL AddCR, BOOL Bracketed)
831     {
832     // unsigned int StrLen = 0;
833     wchar_t *str_w;
834     wchar_t *str_w_edited;
835    
836     if (! cv.Ready) {
837     return;
838     }
839     if (TalkStatus!=IdTalkKeyb) {
840     return;
841     }
842    
843     CBEchoOnly = FALSE;
844    
845     str_w = GetClipboardTextW(HWin, FALSE);
846     if (str_w == NULL) {
847     // �N���b�v�{�[�h����������������������������
848     CBEndPaste();
849     return;
850     }
851    
852     if (ts.PasteFlag & CPF_TRIM_TRAILING_NL) {
853     // �o�b�t�@���������s������
854     TrimTrailingNLW(str_w);
855     }
856    
857 zmatsuo 8459 {
858 doda 8445 // ���s�����K��
859     wchar_t *dest = NormalizeLineBreakW(str_w);
860     free(str_w);
861     str_w = dest;
862     }
863    
864     if (!CheckClipboardContentW(HWin, str_w, AddCR, &str_w_edited)) {
865     CBEndPaste();
866     return;
867     }
868     if (str_w_edited != NULL) {
869     // �_�C�A���O�����W������
870     free(str_w);
871     str_w = str_w_edited;
872     }
873    
874     if (AddCR) {
875     size_t str_len = wcslen(str_w) + 2;
876     str_w = realloc(str_w, sizeof(wchar_t) * str_len);
877     str_w[str_len-2] = L'\r';
878     str_w[str_len-1] = 0;
879     }
880    
881     if (Bracketed) {
882     const size_t BracketStartLenW = _countof(BracketStartW) - 1;
883     const size_t BracketEndLenW = _countof(BracketEndW) - 1;
884     size_t str_len = wcslen(str_w);
885     size_t dest_len = str_len + BracketStartLenW + BracketEndLenW;
886     wchar_t *dest = malloc(sizeof(wchar_t) * (dest_len+1));
887     size_t i = 0;
888     wmemcpy(&dest[i], BracketStartW, BracketStartLenW);
889     i += BracketStartLenW;
890     wmemcpy(&dest[i], str_w, str_len);
891     i += str_len;
892     wmemcpy(&dest[i], BracketEndW, BracketEndLenW);
893     i += BracketEndLenW;
894     dest[i] = 0;
895     free(str_w);
896     str_w = dest;
897     }
898    
899     CBSendStart(str_w, 0);
900     }
901     #endif
902    
903     #if !UNICODE_INTERNAL_BUFF
904 doda 4769 void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer)
905     {
906     HANDLE tmpHandle = NULL;
907     char *tmpPtr = NULL;
908 doda 8445 size_t len, header_len, footer_len, b64_len;
909 maya 5071 UINT Cf;
910     LPWSTR tmpPtrWide = NULL;
911 doda 4769
912     if (! cv.Ready) {
913     return;
914     }
915     if (TalkStatus!=IdTalkKeyb) {
916     return;
917     }
918    
919     CBEchoOnly = FALSE;
920    
921 doda 6452 if (CBMemHandle) {
922     GlobalFree(CBMemHandle);
923     }
924 doda 4769 CBMemHandle = NULL;
925     CBMemPtr = NULL;
926     CBMemPtr2 = 0;
927    
928 doda 5259 if (ts.PasteDelayPerLine > 0) {
929     CBInsertDelay = TRUE;
930     }
931     else {
932     CBInsertDelay = FALSE;
933     }
934    
935 doda 6449 CBRetrySend = FALSE;
936     CBRetryEcho = FALSE;
937     CBSendCR = FALSE;
938    
939 maya 5071 if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(HWin)) {
940     Cf = CF_UNICODETEXT;
941     if ((tmpHandle = GetClipboardData(CF_UNICODETEXT)) == NULL) {
942     CloseClipboard();
943     }
944     }
945     else if (IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(HWin)) {
946     Cf = CF_TEXT;
947 doda 4769 if ((tmpHandle = GetClipboardData(CF_TEXT)) == NULL) {
948     CloseClipboard();
949     }
950     }
951     else if (IsClipboardFormatAvailable(CF_OEMTEXT) && OpenClipboard(HWin)) {
952 maya 5071 Cf = CF_OEMTEXT;
953 doda 4769 if ((tmpHandle = GetClipboardData(CF_OEMTEXT)) == NULL) {
954     CloseClipboard();
955     }
956     }
957    
958 doda 6448 if (tmpHandle) {
959     if (Cf == CF_UNICODETEXT) {
960 maya 5071 if ((tmpPtrWide = GlobalLock(tmpHandle)) != NULL) {
961 doda 6448 len = WideCharToMultiByte(CP_ACP, 0, tmpPtrWide, -1, 0, 0, NULL, NULL);
962     if ((tmpPtr = (char *)calloc(sizeof(char), len)) != NULL) {
963     WideCharToMultiByte(CP_ACP, 0, tmpPtrWide, -1, tmpPtr, len, NULL, NULL);
964 maya 5071 }
965 doda 6448 // WideCharToMultiByte �������������������� \0 ����������
966     // \0 ���G���R�[�h������������������ 1 ������
967     len--;
968 doda 6461 GlobalUnlock(tmpHandle);
969 maya 5071 }
970     }
971 doda 6448 else {
972 maya 5071 if ((tmpPtr = GlobalLock(tmpHandle)) != NULL) {
973     len = strlen(tmpPtr);
974 doda 6448 }
975     }
976    
977     if (tmpPtr) {
978     header_len = strlen(header);
979     footer_len = strlen(footer);
980    
981     b64_len = (len + 2) / 3 * 4 + header_len + footer_len + 1;
982    
983     if ((CBMemHandle = GlobalAlloc(GHND, b64_len)) != NULL) {
984     if ((CBMemPtr = GlobalLock(CBMemHandle)) != NULL) {
985     if (header_len > 0) {
986     strncpy_s(CBMemPtr, b64_len, header, _TRUNCATE);
987 doda 4769 }
988 doda 6448 b64encode(CBMemPtr + header_len, b64_len - header_len, tmpPtr, len);
989     if (footer_len > 0) {
990     strncat_s(CBMemPtr, b64_len, footer, _TRUNCATE);
991     }
992     TalkStatus=IdTalkCB;
993     GlobalUnlock(CBMemPtr);
994     CBMemPtr = NULL;
995 doda 4769 }
996 doda 6448 }
997    
998     if (Cf == CF_UNICODETEXT) {
999     free(tmpPtr);
1000     }
1001     else {
1002 doda 6461 GlobalUnlock(tmpHandle);
1003 doda 4769 }
1004     }
1005 doda 6448 CloseClipboard();
1006 doda 4769 }
1007    
1008     if (TalkStatus != IdTalkCB) {
1009     CBEndPaste();
1010     }
1011     }
1012 doda 8445 #endif
1013 doda 4769
1014 doda 8445 #if UNICODE_INTERNAL_BUFF
1015     void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer)
1016     {
1017     size_t mb_len, b64_len, header_len = 0, footer_len = 0;
1018     wchar_t *str_w = NULL;
1019     char *str_mb = NULL;
1020     char *str_b64 = NULL;
1021    
1022     if (! cv.Ready) {
1023     return;
1024     }
1025     if (TalkStatus!=IdTalkKeyb) {
1026     return;
1027     }
1028    
1029     CBEchoOnly = FALSE;
1030    
1031     str_w = GetClipboardTextW(HWin, FALSE);
1032     if (str_w == NULL) {
1033     // �N���b�v�{�[�h����������������������������
1034     goto error;
1035     }
1036    
1037     if (ts.Language == IdUtf8 || ts.KanjiCodeSend == IdUTF8) {
1038     str_mb = ToU8W(str_w);
1039     }
1040     else {
1041     str_mb = ToCharW(str_w);
1042     }
1043    
1044     if (str_mb == NULL) {
1045     goto error;
1046     }
1047    
1048     if (header != NULL) {
1049     header_len = strlen(header);
1050     }
1051     if (footer != NULL) {
1052     footer_len = strlen(footer);
1053     }
1054    
1055     mb_len = strlen(str_mb);
1056     b64_len = (mb_len + 2) / 3 * 4 + header_len + footer_len + 1;
1057    
1058     if ((str_b64 = malloc(b64_len)) == NULL) {;
1059     goto error;
1060     }
1061    
1062     if (header_len > 0) {
1063     strncpy_s(str_b64, b64_len, header, _TRUNCATE);
1064     }
1065    
1066     b64encode(str_b64 + header_len, b64_len - header_len, str_mb, mb_len);
1067    
1068     if (footer_len > 0) {
1069     strncat_s(str_b64, b64_len, footer, _TRUNCATE);
1070     }
1071    
1072     free(str_w);
1073     if ((str_w = ToWcharA(str_b64)) == NULL) {
1074     goto error;
1075     }
1076    
1077     free(str_mb);
1078     free(str_b64);
1079    
1080     // �\���t�����������������o����
1081     CBSendStart(str_w, 0);
1082    
1083     return;
1084    
1085     error:
1086     free(str_w);
1087     free(str_mb);
1088     free(str_b64);
1089     CBEndPaste();
1090     return;
1091     }
1092     #endif
1093    
1094 maya 3227 // �����������N���b�v�{�[�h������DDE�f�[�^���[�������������B
1095     //
1096     // CBMemHandle�n���h�����O���[�o�������������A�����������I�������������A
1097     // �����N���b�v�{�[�h������DDE�f�[�^�������������������������i�j�����������\�������j�B
1098     // �����A�f�[�^���� null-terminate �����������������O�����������������A�������f�[�^����
1099     // �����������B
1100     // (2006.11.6 yutaka)
1101     void CBSend()
1102     {
1103 maya 3393 int c;
1104     BOOL EndFlag;
1105 doda 3688 static DWORD lastcr;
1106     DWORD now;
1107 maya 3227
1108 maya 3393 if (CBMemHandle==NULL) {
1109     return;
1110     }
1111 maya 3227
1112 doda 3974 if (CBEchoOnly) {
1113     CBEcho();
1114     return;
1115     }
1116    
1117 doda 5259 if (CBInsertDelay) {
1118     now = GetTickCount();
1119     if (now - lastcr < (DWORD)ts.PasteDelayPerLine) {
1120     return;
1121     }
1122 doda 3688 }
1123    
1124 maya 3393 if (CBRetrySend) {
1125     CBRetryEcho = (ts.LocalEcho>0);
1126     c = CommTextOut(&cv,(PCHAR)&CBByte,1);
1127     CBRetrySend = (c==0);
1128     if (CBRetrySend) {
1129     return;
1130     }
1131     }
1132 maya 3227
1133 maya 3393 if (CBRetryEcho) {
1134     c = CommTextEcho(&cv,(PCHAR)&CBByte,1);
1135     CBRetryEcho = (c==0);
1136     if (CBRetryEcho) {
1137     return;
1138     }
1139     }
1140 maya 3227
1141 maya 4009 CBMemPtr = GlobalLock(CBMemHandle);
1142     if (CBMemPtr==NULL) {
1143 maya 3393 return;
1144     }
1145 maya 3227
1146 maya 3393 do {
1147     if (CBSendCR && (CBMemPtr[CBMemPtr2]==0x0a)) {
1148     CBMemPtr2++;
1149     // added PasteDelayPerLine (2009.4.12 maya)
1150 doda 5259 if (CBInsertDelay) {
1151 doda 3690 lastcr = now;
1152     CBSendCR = FALSE;
1153     SetTimer(HVTWin, IdPasteDelayTimer, ts.PasteDelayPerLine, NULL);
1154     break;
1155     }
1156 maya 3393 }
1157    
1158     EndFlag = (CBMemPtr[CBMemPtr2]==0);
1159 doda 6449 if (! EndFlag) {
1160 maya 3393 CBByte = CBMemPtr[CBMemPtr2];
1161     CBMemPtr2++;
1162 maya 3227 // Decoding characters which are encoded by MACRO
1163     // to support NUL character sending
1164     //
1165     // [encoded character] --> [decoded character]
1166     // 01 01 --> 00
1167     // 01 02 --> 01
1168 maya 3393 if (CBByte==0x01) { /* 0x01 from MACRO */
1169     CBByte = CBMemPtr[CBMemPtr2];
1170     CBMemPtr2++;
1171     CBByte = CBByte - 1; // character just after 0x01
1172     }
1173     }
1174     else {
1175     CBEndPaste();
1176     return;
1177     }
1178 maya 3227
1179 maya 3393 if (! EndFlag) {
1180     c = CommTextOut(&cv,(PCHAR)&CBByte,1);
1181     CBSendCR = (CBByte==0x0D);
1182     CBRetrySend = (c==0);
1183     if ((! CBRetrySend) &&
1184     (ts.LocalEcho>0)) {
1185     c = CommTextEcho(&cv,(PCHAR)&CBByte,1);
1186     CBRetryEcho = (c==0);
1187     }
1188     }
1189     else {
1190     c=0;
1191     }
1192     }
1193     while (c>0);
1194 maya 3227
1195 maya 4009 if (CBMemPtr!=NULL) {
1196 maya 3393 GlobalUnlock(CBMemHandle);
1197     CBMemPtr=NULL;
1198     }
1199 maya 3227 }
1200    
1201 doda 8445 static void CBEcho()
1202 doda 3974 {
1203     if (CBMemHandle==NULL) {
1204     return;
1205     }
1206    
1207     if (CBRetryEcho && CommTextEcho(&cv,(PCHAR)&CBByte,1) == 0) {
1208     return;
1209     }
1210    
1211     if ((CBMemPtr = GlobalLock(CBMemHandle)) == NULL) {
1212     return;
1213     }
1214    
1215     do {
1216     if (CBSendCR && (CBMemPtr[CBMemPtr2]==0x0a)) {
1217     CBMemPtr2++;
1218     }
1219    
1220     if (CBMemPtr[CBMemPtr2] == 0) {
1221     CBRetryEcho = FALSE;
1222     CBEndPaste();
1223     return;
1224     }
1225    
1226     CBByte = CBMemPtr[CBMemPtr2];
1227     CBMemPtr2++;
1228    
1229     // Decoding characters which are encoded by MACRO
1230     // to support NUL character sending
1231     //
1232     // [encoded character] --> [decoded character]
1233     // 01 01 --> 00
1234     // 01 02 --> 01
1235     if (CBByte==0x01) { /* 0x01 from MACRO */
1236     CBByte = CBMemPtr[CBMemPtr2];
1237     CBMemPtr2++;
1238     CBByte = CBByte - 1; // character just after 0x01
1239     }
1240    
1241     CBSendCR = (CBByte==0x0D);
1242    
1243     } while (CommTextEcho(&cv,(PCHAR)&CBByte,1) > 0);
1244    
1245     CBRetryEcho = TRUE;
1246    
1247     if (CBMemHandle != NULL) {
1248     GlobalUnlock(CBMemHandle);
1249     CBMemPtr=NULL;
1250     }
1251     }
1252    
1253 maya 3227 void CBEndPaste()
1254     {
1255 maya 3393 TalkStatus = IdTalkKeyb;
1256 maya 3227
1257 maya 3393 if (CBMemHandle!=NULL) {
1258     if (CBMemPtr!=NULL) {
1259     GlobalUnlock(CBMemHandle);
1260     }
1261 doda 6449 GlobalFree(CBMemHandle);
1262 maya 3393 }
1263 maya 3227
1264 maya 3393 CBMemHandle = NULL;
1265     CBMemPtr = NULL;
1266     CBMemPtr2 = 0;
1267 doda 3974 CBEchoOnly = FALSE;
1268 doda 5259 CBInsertDelay = FALSE;
1269 doda 8445 _CrtCheckMemory();
1270 maya 3227 }
1271    
1272 doda 8445 /**
1273     * �N���b�v�{�[�h���e�L�X�g���Z�b�g����
1274     * str_w �N���b�v�{�[�h���Z�b�g���������������|�C���^
1275     * NULL�������N���b�v�{�[�h����������(str_len���Q����������)
1276     * str_len ��������
1277     * 0�����������������������Z�o������
1278     */
1279     BOOL CBSetTextW(HWND hWnd, const wchar_t *str_w, size_t str_len)
1280     {
1281     HGLOBAL CBCopyWideHandle;
1282    
1283     if (str_w == NULL) {
1284     str_len = 0;
1285     } else {
1286     if (str_len == 0)
1287     str_len = wcslen(str_w);
1288     }
1289    
1290     if (!OpenClipboard(hWnd)) {
1291     return FALSE;
1292     }
1293    
1294     EmptyClipboard();
1295     if (str_len == 0) {
1296     CloseClipboard();
1297     return TRUE;
1298     }
1299    
1300     {
1301     // ���������R�s�[�A������L'\0'��������
1302     wchar_t *CBCopyWidePtr;
1303     const size_t alloc_bytes = (str_len + 1) * sizeof(wchar_t);
1304     CBCopyWideHandle = GlobalAlloc(GMEM_MOVEABLE, alloc_bytes);
1305     if (CBCopyWideHandle == NULL) {
1306 zmatsuo 8457 CloseClipboard();
1307 doda 8445 return FALSE;
1308     }
1309     CBCopyWidePtr = (wchar_t *)GlobalLock(CBCopyWideHandle);
1310     if (CBCopyWidePtr == NULL) {
1311 zmatsuo 8457 CloseClipboard();
1312 doda 8445 return FALSE;
1313     }
1314     memcpy(CBCopyWidePtr, str_w, alloc_bytes - sizeof(wchar_t));
1315     CBCopyWidePtr[str_len] = L'\0';
1316     GlobalUnlock(CBCopyWideHandle);
1317     }
1318    
1319     SetClipboardData(CF_UNICODETEXT, CBCopyWideHandle);
1320    
1321     // TODO 9x�n����������CF_TEXT���Z�b�g��������������?
1322     CloseClipboard();
1323    
1324     return TRUE;
1325     }
1326    
1327     #if 0
1328 doda 6418 BOOL CBSetClipboard(HWND owner, HGLOBAL hMem)
1329     {
1330     char *buf;
1331     int wide_len;
1332     HGLOBAL wide_hMem;
1333 zmatsuo 7509 LPWSTR wide_buf = 0;
1334 maya 3227
1335 doda 6418 if (OpenClipboard(owner) == 0)
1336     return FALSE;
1337    
1338     buf = GlobalLock(hMem);
1339    
1340     wide_len = MultiByteToWideChar(CP_ACP, 0, buf, -1, NULL, 0);
1341     wide_hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(WCHAR) * wide_len);
1342     if (wide_hMem) {
1343     wide_buf = (LPWSTR)GlobalLock(wide_hMem);
1344     MultiByteToWideChar(CP_ACP, 0, buf, -1, wide_buf, wide_len);
1345     GlobalUnlock(wide_hMem);
1346     }
1347    
1348     GlobalUnlock(hMem);
1349    
1350     EmptyClipboard();
1351     SetClipboardData(CF_TEXT, hMem);
1352     if (wide_buf) {
1353     SetClipboardData(CF_UNICODETEXT, wide_hMem);
1354     }
1355     CloseClipboard();
1356    
1357     return TRUE;
1358     }
1359 doda 8445 #endif
1360 doda 6418
1361 doda 8445 #if 0
1362 doda 6418 HGLOBAL CBAllocClipboardMem(char *text)
1363     {
1364     HGLOBAL hMem;
1365     char *buf;
1366     int len;
1367    
1368     len = strlen(text);
1369    
1370     hMem = GlobalAlloc(GMEM_MOVEABLE, len+1);
1371     if (hMem) {
1372     buf = GlobalLock(hMem);
1373     strncpy_s(buf, len+1, text, _TRUNCATE);
1374     GlobalUnlock(hMem);
1375     }
1376    
1377     return hMem;
1378     }
1379 doda 8445 #endif
1380 doda 6418
1381 doda 8445 #if !UNICODE_INTERNAL_BUFF
1382     static INT_PTR CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
1383 maya 3227 {
1384 zmatsuo 7509 static const DlgTextInfo TextInfos[] = {
1385     { 0, "DLG_CLIPBOARD_TITLE" },
1386     { IDCANCEL, "BTN_CANCEL" },
1387     { IDOK, "BTN_OK" },
1388     };
1389 maya 3227 POINT p;
1390 zmatsuo 8408 RECT rc_dlg;
1391 maya 3902 static int ok2right, edit2ok, edit2bottom;
1392     RECT rc_edit, rc_ok, rc_cancel;
1393 yutakapon 3635 // for status bar
1394     static HWND hStatus = NULL;
1395 zmatsuo 7509 static int init_width, init_height;
1396 maya 3227
1397     switch (msg) {
1398     case WM_INITDIALOG:
1399 zmatsuo 7509 SetDlgTexts(hDlgWnd, TextInfos, _countof(TextInfos), ts.UILanguageFile);
1400 maya 3227
1401 zmatsuo 7509 SetDlgItemTextA(hDlgWnd, IDC_EDIT, CBMemPtr);
1402 maya 3227
1403 doda 6459 if (ActiveWin == IdVT) { // VT Window
1404     /*
1405     * Caret off ���� GetCaretPos() �����m���������������������A
1406     * vtdisp.c �������������������l�����v�Z����
1407     */
1408     DispConvScreenToWin(CursorX, CursorY, &p.x, &p.y);
1409     }
1410     else if (!GetCaretPos(&p)) { // Tek Window
1411     /*
1412     * Tek Window �������������l�������������|������ GetCaretPos() ���g��
1413     * GetCaretPos() ���G���[���������������O������ 0, 0 ������������
1414     */
1415     p.x = 0;
1416     p.y = 0;
1417     }
1418 maya 3227
1419 doda 6460 // x, y �������� 0 �������e�E�B���h�E���������������������������A
1420     // �������h������ x �� 1 ������
1421     if (p.x == 0 && p.y == 0) {
1422     p.x = 1;
1423     }
1424    
1425 doda 6459 ClientToScreen(GetParent(hDlgWnd), &p);
1426 maya 3227 SetWindowPos(hDlgWnd, NULL, p.x, p.y,
1427     0, 0, SWP_NOSIZE | SWP_NOZORDER);
1428 zmatsuo 8408 MoveWindowToDisplay(hDlgWnd);
1429 maya 3227
1430 maya 3641 // �_�C�A���O�������T�C�Y������
1431     GetWindowRect(hDlgWnd, &rc_dlg);
1432     init_width = rc_dlg.right - rc_dlg.left;
1433     init_height = rc_dlg.bottom - rc_dlg.top;
1434    
1435 maya 3227 // �����T�C�Y�����K�v���l���v�Z
1436     GetClientRect(hDlgWnd, &rc_dlg);
1437     GetWindowRect(GetDlgItem(hDlgWnd, IDC_EDIT), &rc_edit);
1438     GetWindowRect(GetDlgItem(hDlgWnd, IDOK), &rc_ok);
1439    
1440     p.x = rc_dlg.right;
1441     p.y = rc_dlg.bottom;
1442     ClientToScreen(hDlgWnd, &p);
1443     ok2right = p.x - rc_ok.left;
1444 maya 3902 edit2bottom = p.y - rc_edit.bottom;
1445 maya 3227 edit2ok = rc_ok.left - rc_edit.right;
1446    
1447     // �T�C�Y������
1448     SetWindowPos(hDlgWnd, NULL, 0, 0,
1449     ts.PasteDialogSize.cx, ts.PasteDialogSize.cy,
1450     SWP_NOZORDER | SWP_NOMOVE);
1451    
1452 yutakapon 3635 // ���T�C�Y�A�C�R�����E�����\���������������A�X�e�[�^�X�o�[���t�����B
1453     InitCommonControls();
1454     hStatus = CreateStatusWindow(
1455     WS_CHILD | WS_VISIBLE |
1456     CCS_BOTTOM | SBARS_SIZEGRIP, NULL, hDlgWnd, 1);
1457    
1458 maya 3227 return TRUE;
1459    
1460     case WM_COMMAND:
1461     switch (LOWORD(wp)) {
1462     case IDOK:
1463     {
1464 zmatsuo 7509 unsigned len = SendMessageA(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXTLENGTH, 0, 0);
1465 maya 3227 HGLOBAL hMem;
1466 doda 6456 INT_PTR result = IDCANCEL;
1467 maya 3227
1468 doda 6456 if (CBMemHandle == NULL) {
1469     CBMemHandle = GlobalAlloc(GHND, len+1);
1470     }
1471     else if (GlobalSize(CBMemHandle) <= len) {
1472     if (CBMemPtr) {
1473     GlobalUnlock(CBMemHandle);
1474     CBMemPtr = NULL;
1475     }
1476     hMem = GlobalReAlloc(CBMemHandle, len+1, 0);
1477     if (hMem) {
1478     CBMemHandle = hMem;
1479     CBMemPtr = GlobalLock(CBMemHandle);
1480     }
1481     else {
1482     /*
1483     * ���������m�����������������������������������B
1484     *
1485     * �_�C�A���O�������������s�������������l������
1486     * �L�����Z�������������������������A����������������
1487     * �s���������v�����������A���������������������e��
1488     * �\���t���������e���B
1489     *
1490     * ���������������S�����|���A���������J�������\���t����
1491     * �s�������������������B
1492     */
1493     GlobalFree(CBMemHandle);
1494     CBMemHandle = NULL;
1495     }
1496     }
1497 doda 6417
1498 doda 6456 if (CBMemHandle) {
1499     if (CBMemPtr == NULL) {
1500     CBMemPtr = GlobalLock(CBMemHandle);
1501 maya 5071 }
1502 zmatsuo 7509 GetDlgItemTextA(hDlgWnd, IDC_EDIT, CBMemPtr, GlobalSize(CBMemHandle));
1503 doda 6456 result = IDOK;
1504 maya 3902 }
1505 maya 3227
1506 yutakapon 3635 DestroyWindow(hStatus);
1507 zmatsuo 7509 TTEndDialog(hDlgWnd, result);
1508 maya 3227 }
1509     break;
1510    
1511     case IDCANCEL:
1512 yutakapon 3635 DestroyWindow(hStatus);
1513 zmatsuo 7509 TTEndDialog(hDlgWnd, IDCANCEL);
1514 maya 3227 break;
1515    
1516     default:
1517     return FALSE;
1518     }
1519    
1520     case WM_SIZE:
1521     {
1522     // ���z�u
1523     POINT p;
1524     int dlg_w, dlg_h;
1525    
1526     GetClientRect(hDlgWnd, &rc_dlg);
1527     dlg_w = rc_dlg.right;
1528     dlg_h = rc_dlg.bottom;
1529    
1530     GetWindowRect(GetDlgItem(hDlgWnd, IDC_EDIT), &rc_edit);
1531     GetWindowRect(GetDlgItem(hDlgWnd, IDOK), &rc_ok);
1532     GetWindowRect(GetDlgItem(hDlgWnd, IDCANCEL), &rc_cancel);
1533    
1534     // OK
1535     p.x = rc_ok.left;
1536     p.y = rc_ok.top;
1537     ScreenToClient(hDlgWnd, &p);
1538     SetWindowPos(GetDlgItem(hDlgWnd, IDOK), 0,
1539     dlg_w - ok2right, p.y, 0, 0,
1540     SWP_NOSIZE | SWP_NOZORDER);
1541    
1542     // CANCEL
1543     p.x = rc_cancel.left;
1544     p.y = rc_cancel.top;
1545     ScreenToClient(hDlgWnd, &p);
1546     SetWindowPos(GetDlgItem(hDlgWnd, IDCANCEL), 0,
1547     dlg_w - ok2right, p.y, 0, 0,
1548     SWP_NOSIZE | SWP_NOZORDER);
1549    
1550     // EDIT
1551     p.x = rc_edit.left;
1552     p.y = rc_edit.top;
1553     ScreenToClient(hDlgWnd, &p);
1554     SetWindowPos(GetDlgItem(hDlgWnd, IDC_EDIT), 0,
1555 maya 3902 0, 0, dlg_w - p.x - edit2ok - ok2right, dlg_h - p.y - edit2bottom,
1556 maya 3227 SWP_NOMOVE | SWP_NOZORDER);
1557    
1558     // �T�C�Y������
1559     GetWindowRect(hDlgWnd, &rc_dlg);
1560     ts.PasteDialogSize.cx = rc_dlg.right - rc_dlg.left;
1561     ts.PasteDialogSize.cy = rc_dlg.bottom - rc_dlg.top;
1562 yutakapon 3635
1563     // status bar
1564     SendMessage(hStatus , msg , wp , lp);
1565 maya 3227 }
1566     return TRUE;
1567    
1568 maya 3641 case WM_GETMINMAXINFO:
1569     {
1570     // �_�C�A���O�������T�C�Y����������������������������
1571     LPMINMAXINFO lpmmi;
1572     lpmmi = (LPMINMAXINFO)lp;
1573     lpmmi->ptMinTrackSize.x = init_width;
1574     lpmmi->ptMinTrackSize.y = init_height;
1575     }
1576     return FALSE;
1577    
1578 maya 3227 default:
1579     return FALSE;
1580     }
1581     return TRUE;
1582     }
1583 doda 8445 #endif

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