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

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