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 2476 - (hide annotations) (download) (as text)
Mon Apr 14 17:35:50 2008 UTC (16 years ago) by maya
Original Path: teraterm/trunk/teraterm/clipboar.c
File MIME type: text/x-csrc
File size: 9143 byte(s)
ファイル移動に伴う修正

1 maya 2476 /* 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 <string.h>
9     #include <stdlib.h>
10     #include <stdio.h>
11    
12     #include "ttwinman.h"
13     #include "ttcommon.h"
14    
15     #include "clipboar.h"
16     #include "tt_res.h"
17    
18     // for clipboard copy
19     static HGLOBAL CBCopyHandle = NULL;
20     static PCHAR CBCopyPtr = NULL;
21    
22     // for clipboard paste
23     static HGLOBAL CBMemHandle = NULL;
24     static PCHAR CBMemPtr = NULL;
25     static LONG CBMemPtr2 = 0;
26     static BOOL CBAddCR = FALSE;
27     static BYTE CBByte;
28     static BOOL CBRetrySend;
29     static BOOL CBRetryEcho;
30     static BOOL CBSendCR;
31     static BOOL CBDDE;
32    
33     static HFONT DlgClipboardFont;
34    
35     PCHAR CBOpen(LONG MemSize)
36     {
37     if (MemSize==0) return (NULL);
38     if (CBCopyHandle!=NULL) return (NULL);
39     CBCopyPtr = NULL;
40     CBCopyHandle = GlobalAlloc(GMEM_MOVEABLE, MemSize);
41     if (CBCopyHandle == NULL)
42     MessageBeep(0);
43     else {
44     CBCopyPtr = GlobalLock(CBCopyHandle);
45     if (CBCopyPtr == NULL)
46     {
47     GlobalFree(CBCopyHandle);
48     CBCopyHandle = NULL;
49     MessageBeep(0);
50     }
51     }
52     return (CBCopyPtr);
53     }
54    
55     void CBClose()
56     {
57     BOOL Empty;
58     if (CBCopyHandle==NULL) return;
59    
60     Empty = FALSE;
61     if (CBCopyPtr!=NULL)
62     Empty = (CBCopyPtr[0]==0);
63    
64     GlobalUnlock(CBCopyHandle);
65     CBCopyPtr = NULL;
66    
67     if (OpenClipboard(HVTWin))
68     {
69     EmptyClipboard();
70     if (! Empty)
71     SetClipboardData(CF_TEXT, CBCopyHandle);
72     CloseClipboard();
73     }
74     CBCopyHandle = NULL;
75     }
76    
77     void CBStartPaste(HWND HWin, BOOL AddCR,
78     int BuffSize, PCHAR DataPtr, int DataSize)
79     //
80     // DataPtr and DataSize are used only for DDE
81     // For clipboard, BuffSize should be 0
82     // DataSize should be <= BuffSize
83     {
84     UINT Cf;
85    
86     if (! cv.Ready) return;
87     if (TalkStatus!=IdTalkKeyb) return;
88    
89     CBAddCR = AddCR;
90    
91     if (BuffSize==0) // for clipboard
92     {
93     if (IsClipboardFormatAvailable(CF_TEXT))
94     Cf = CF_TEXT;
95     else if (IsClipboardFormatAvailable(CF_OEMTEXT))
96     Cf = CF_OEMTEXT;
97     else return;
98     }
99    
100     CBMemHandle = NULL;
101     CBMemPtr = NULL;
102     CBMemPtr2 = 0;
103     CBDDE = FALSE;
104     if (BuffSize==0) //clipboard
105     {
106     if (OpenClipboard(HWin))
107     CBMemHandle = GetClipboardData(Cf);
108     if (CBMemHandle!=NULL) TalkStatus=IdTalkCB;
109     }
110     else { // dde
111     CBMemHandle = GlobalAlloc(GHND,BuffSize);
112     if (CBMemHandle != NULL)
113     {
114     CBDDE = TRUE;
115     CBMemPtr = GlobalLock(CBMemHandle);
116     if (CBMemPtr != NULL)
117     {
118     memcpy(CBMemPtr,DataPtr,DataSize);
119     GlobalUnlock(CBMemHandle);
120     CBMemPtr=NULL;
121     TalkStatus=IdTalkCB;
122     }
123     }
124     }
125     CBRetrySend = FALSE;
126     CBRetryEcho = FALSE;
127     CBSendCR = FALSE;
128     if (TalkStatus != IdTalkCB) CBEndPaste();
129     }
130    
131     // �����������N���b�v�{�[�h������DDE�f�[�^���[�������������B
132     //
133     // CBMemHandle�n���h�����O���[�o�������������A�����������I�������������A
134     // �����N���b�v�{�[�h������DDE�f�[�^�������������������������i�j�����������\�������j�B
135     // �����A�f�[�^���� null-terminate �����������������O�����������������A�������f�[�^����
136     // �����������B
137     // (2006.11.6 yutaka)
138     void CBSend()
139     {
140     int c;
141     BOOL EndFlag;
142    
143     if (CBMemHandle==NULL) return;
144    
145     if (CBRetrySend)
146     {
147     CBRetryEcho = (ts.LocalEcho>0);
148     c = CommTextOut(&cv,(PCHAR)&CBByte,1);
149     CBRetrySend = (c==0);
150     if (CBRetrySend) return;
151     }
152    
153     if (CBRetryEcho)
154     {
155     c = CommTextEcho(&cv,(PCHAR)&CBByte,1);
156     CBRetryEcho = (c==0);
157     if (CBRetryEcho) return;
158     }
159    
160     CBMemPtr = GlobalLock(CBMemHandle);
161     if (CBMemPtr==NULL) return;
162    
163     do {
164     if (CBSendCR && (CBMemPtr[CBMemPtr2]==0x0a))
165     CBMemPtr2++;
166    
167     EndFlag = (CBMemPtr[CBMemPtr2]==0);
168     if (! EndFlag)
169     {
170     CBByte = CBMemPtr[CBMemPtr2];
171     CBMemPtr2++;
172     // Decoding characters which are encoded by MACRO
173     // to support NUL character sending
174     //
175     // [encoded character] --> [decoded character]
176     // 01 01 --> 00
177     // 01 02 --> 01
178     if (CBByte==0x01) /* 0x01 from MACRO */
179     {
180     CBByte = CBMemPtr[CBMemPtr2];
181     CBMemPtr2++;
182     CBByte = CBByte - 1; // character just after 0x01
183     }
184     }
185     else if (CBAddCR)
186     {
187     EndFlag = FALSE;
188     CBAddCR = FALSE;
189     CBByte = 0x0d;
190     }
191     else {
192     CBEndPaste();
193     return;
194     }
195    
196     if (! EndFlag)
197     {
198     c = CommTextOut(&cv,(PCHAR)&CBByte,1);
199     CBSendCR = (CBByte==0x0D);
200     CBRetrySend = (c==0);
201     if ((! CBRetrySend) &&
202     (ts.LocalEcho>0))
203     {
204     c = CommTextEcho(&cv,(PCHAR)&CBByte,1);
205     CBRetryEcho = (c==0);
206     }
207     }
208     else
209     c=0;
210     }
211     while (c>0);
212    
213     if (CBMemPtr!=NULL)
214     {
215     GlobalUnlock(CBMemHandle);
216     CBMemPtr=NULL;
217     }
218     }
219    
220     void CBEndPaste()
221     {
222     TalkStatus = IdTalkKeyb;
223    
224     if (CBMemHandle!=NULL)
225     {
226     if (CBMemPtr!=NULL)
227     GlobalUnlock(CBMemHandle);
228     if (CBDDE)
229     GlobalFree(CBMemHandle);
230     }
231     if (!CBDDE) CloseClipboard();
232    
233     CBDDE = FALSE;
234     CBMemHandle = NULL;
235     CBMemPtr = NULL;
236     CBMemPtr2 = 0;
237     CBAddCR = FALSE;
238     }
239    
240    
241     static char *ClipboardPtr = NULL;
242     static int PasteCanceled = 0;
243    
244     static LRESULT CALLBACK OnClipboardDlgProc(HWND hDlgWnd, UINT msg, WPARAM wp, LPARAM lp)
245     {
246     POINT pt;
247     //char *p;
248     LOGFONT logfont;
249     HFONT font;
250     char uimsg[MAX_UIMSG];
251    
252     switch (msg) {
253     case WM_INITDIALOG:
254     #if 0
255     for (p = ClipboardPtr; *p ; p++) {
256     char buf[20];
257     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%02x ", *p);
258     OutputDebugString(buf);
259     }
260     #endif
261    
262     font = (HFONT)SendMessage(hDlgWnd, WM_GETFONT, 0, 0);
263     GetObject(font, sizeof(LOGFONT), &logfont);
264     if (get_lang_font("DLG_TAHOMA_FONT", hDlgWnd, &logfont, &DlgClipboardFont, ts.UILanguageFile)) {
265     SendDlgItemMessage(hDlgWnd, IDC_EDIT, WM_SETFONT, (WPARAM)DlgClipboardFont, MAKELPARAM(TRUE,0));
266     SendDlgItemMessage(hDlgWnd, IDC_CLIPBOARD_INFO, WM_SETFONT, (WPARAM)DlgClipboardFont, MAKELPARAM(TRUE,0));
267     SendDlgItemMessage(hDlgWnd, IDOK, WM_SETFONT, (WPARAM)DlgClipboardFont, MAKELPARAM(TRUE,0));
268     SendDlgItemMessage(hDlgWnd, IDCANCEL, WM_SETFONT, (WPARAM)DlgClipboardFont, MAKELPARAM(TRUE,0));
269     }
270     else {
271     DlgClipboardFont = NULL;
272     }
273    
274     GetWindowText(hDlgWnd, uimsg, sizeof(uimsg));
275     get_lang_msg("DLG_CLIPBOARD_TITLE", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
276     SetWindowText(hDlgWnd, ts.UIMsg);
277     GetDlgItemText(hDlgWnd, IDC_CLIPBOARD_INFO, uimsg, sizeof(uimsg));
278     get_lang_msg("DLG_CLIPBOARD_INFO", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
279     SetDlgItemText(hDlgWnd, IDC_CLIPBOARD_INFO, ts.UIMsg);
280     GetDlgItemText(hDlgWnd, IDCANCEL, uimsg, sizeof(uimsg));
281     get_lang_msg("BTN_CANCEL", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
282     SetDlgItemText(hDlgWnd, IDCANCEL, ts.UIMsg);
283     GetDlgItemText(hDlgWnd, IDOK, uimsg, sizeof(uimsg));
284     get_lang_msg("BTN_OK", ts.UIMsg, sizeof(ts.UIMsg), uimsg, ts.UILanguageFile);
285     SetDlgItemText(hDlgWnd, IDOK, ts.UIMsg);
286    
287     SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_SETTEXT, 0, (LPARAM)ClipboardPtr);
288    
289     GetCursorPos(&pt);
290     SetWindowPos(hDlgWnd, NULL, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
291     return TRUE;
292    
293     case WM_COMMAND:
294     switch (LOWORD(wp)) {
295     case IDOK:
296     {
297     int len = SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXTLENGTH, 0, 0);
298     HGLOBAL hMem;
299     char *buf;
300    
301     hMem = GlobalAlloc(GMEM_MOVEABLE, len + 1);
302     buf = GlobalLock(hMem);
303     SendMessage(GetDlgItem(hDlgWnd, IDC_EDIT), WM_GETTEXT, len + 1, (LPARAM)buf);
304     GlobalUnlock(hMem);
305    
306     EmptyClipboard();
307     SetClipboardData(CF_TEXT, hMem);
308    
309     // hMem���N���b�v�{�[�h�������������������A�j�����������������B
310    
311     if (DlgClipboardFont != NULL) {
312     DeleteObject(DlgClipboardFont);
313     }
314    
315     EndDialog(hDlgWnd, IDOK);
316     }
317     break;
318    
319     case IDCANCEL:
320     PasteCanceled = 1;
321    
322     if (DlgClipboardFont != NULL) {
323     DeleteObject(DlgClipboardFont);
324     }
325    
326     EndDialog(hDlgWnd, IDCANCEL);
327     break;
328    
329     default:
330     return FALSE;
331     }
332    
333     #if 0
334     case WM_CLOSE:
335     PasteCanceled = 1;
336     EndDialog(hDlgWnd, 0);
337     return TRUE;
338     #endif
339    
340     default:
341     return FALSE;
342     }
343     return TRUE;
344     }
345    
346     //
347     // �N���b�v�{�[�h�����s�R�[�h�����������������A�m�F�_�C�A���O���\�������B
348     // �N���b�v�{�[�h�����X�����\�B
349     //
350     // return 0: Cancel
351     // 1: Paste OK
352     //
353     // (2008.2.3 yutaka)
354     //
355     int CBStartPasteConfirmChange(HWND HWin)
356     {
357     UINT Cf;
358     HANDLE hText;
359     char *pText;
360     int pos;
361     int ret = 0;
362    
363     if (ts.ConfirmChangePaste == 0)
364     return 1;
365    
366     if (! cv.Ready)
367     goto error;
368     if (TalkStatus!=IdTalkKeyb)
369     goto error;
370    
371     if (IsClipboardFormatAvailable(CF_TEXT))
372     Cf = CF_TEXT;
373     else if (IsClipboardFormatAvailable(CF_OEMTEXT))
374     Cf = CF_OEMTEXT;
375     else
376     goto error;
377    
378     if (!OpenClipboard(HWin))
379     goto error;
380    
381     hText = GetClipboardData(Cf);
382    
383     if (hText != NULL) {
384     pText = (char *)GlobalLock(hText);
385     pos = strcspn(pText, "\r\n"); // ���s����������������
386     if (pText[pos] != '\0') {
387     ClipboardPtr = pText;
388     PasteCanceled = 0;
389     ret = DialogBox(hInst, MAKEINTRESOURCE(IDD_CLIPBOARD_DIALOG),
390     HVTWin, (DLGPROC)OnClipboardDlgProc);
391     if (ret == 0 || ret == -1) {
392     ret = GetLastError();
393     }
394    
395     if (PasteCanceled) {
396     ret = 0;
397     GlobalUnlock(hText);
398     CloseClipboard();
399     goto error;
400     }
401    
402     }
403    
404     ret = 1;
405    
406     GlobalUnlock(hText);
407     }
408    
409     CloseClipboard();
410    
411     error:
412     return (ret);
413     }

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