2 * wclipbrd.c -- Clipboard routines for WinBoard
5 * Copyright 2000 Free Software Foundation, Inc.
7 * ------------------------------------------------------------------------
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * ------------------------------------------------------------------------
26 #include <windows.h> /* required for all Windows applications */
39 /* Imports from winboard.c */
43 static char *copyTemp;
44 static char *pasteTemp;
51 fen = PositionToFEN(currentMove);
53 DisplayError("Unable to convert position to FEN.", 0);
56 if (!CopyTextToClipboard(fen))
57 DisplayError("Unable to copy FEN to clipboard.", 0);
65 /* A rather cheesy hack here. Write the game to a file, then read from the
66 * file into the clipboard.
75 copyTemp = tmpnam(NULL);
78 DisplayError("Cannot create temporary file name.",0);
81 f = fopen(copyTemp, "w");
83 DisplayError("Cannot open temporary file.", 0);
86 if (!SaveGame(f,0,"")) { /* call into backend */
87 DisplayError("Cannot write to temporary file.", 0);
88 goto copy_game_to_clipboard_cleanup;
90 f = fopen(copyTemp, "rb");
92 DisplayError("Cannot reopen temporary file.", 0);
93 goto copy_game_to_clipboard_cleanup;
95 if (fstat(fileno(f), &st) < 0) {
96 DisplayError("Cannot determine size of file.", 0);
97 goto copy_game_to_clipboard_cleanup;
101 DisplayError("Cannot determine size of file.", 0);
102 goto copy_game_to_clipboard_cleanup;
105 buf = (char*)malloc(size+1);
107 DisplayError("Cannot allocate clipboard buffer.", 0);
108 goto copy_game_to_clipboard_cleanup;
110 len = fread(buf, sizeof(char), size, f);
112 DisplayError("Cannot read from temporary file.", 0);
113 goto copy_game_to_clipboard_cleanup;
115 if ((unsigned long)size != (unsigned long)len) { /* sigh */
116 DisplayError("Error reading from temporary file.", 0);
117 goto copy_game_to_clipboard_cleanup;
120 if (!CopyTextToClipboard(buf)) {
121 DisplayError("Cannot copy text to clipboard", 0);
124 copy_game_to_clipboard_cleanup:
131 CopyTextToClipboard(char *text)
133 /* some (most?) of the error checking may be overkill,
134 * but hey, this is Windows
142 hGlobalMem = GlobalAlloc(GHND, (DWORD)lstrlen(text)+1);
143 if (hGlobalMem == NULL) {
144 DisplayError("Unable to allocate memory for clipboard.", 0);
147 lpGlobalMem = GlobalLock(hGlobalMem);
148 if (lpGlobalMem == NULL) {
149 DisplayError("Unable to lock clipboard memory.", 0);
150 GlobalFree(hGlobalMem);
153 lstrcpy(lpGlobalMem, text);
154 if (appData.debugMode) {
155 lockCount = GlobalFlags(hGlobalMem) & GMEM_LOCKCOUNT;
156 fprintf(debugFP, "CopyTextToClipboard(): lock count %d\n", lockCount);
158 SetLastError(NO_ERROR);
159 locked = GlobalUnlock(hGlobalMem);
160 err = GetLastError();
161 if (appData.debugMode) {
162 lockCount = GlobalFlags(hGlobalMem) & GMEM_LOCKCOUNT;
163 fprintf(debugFP, "CopyTextToClipboard(): lock count %d\n", lockCount);
166 locked = !((err == NO_ERROR) || (err == ERROR_NOT_LOCKED));
167 if (appData.debugMode) {
169 "CopyTextToClipboard(): err %d locked %d\n", err, locked);
173 DisplayError("Cannot unlock clipboard memory.", 0);
174 GlobalFree(hGlobalMem);
177 if (!OpenClipboard(hwndMain)) {
178 DisplayError("Cannot open clipboard.", 0);
179 GlobalFree(hGlobalMem);
182 if (!EmptyClipboard()) {
183 DisplayError("Cannot empty clipboard.", 0);
186 if (hGlobalMem != SetClipboardData(CF_TEXT, hGlobalMem)) {
187 DisplayError("Cannot copy text to clipboard.", 0);
189 GlobalFree(hGlobalMem);
192 if (!CloseClipboard())
193 DisplayError("Cannot close clipboard.", 0);
201 PasteFENFromClipboard()
204 if (!PasteTextFromClipboard(&fen)) {
205 DisplayError("Unable to paste FEN from clipboard.", 0);
208 if (appData.debugMode) {
209 fprintf(debugFP, "PasteFenFromClipboard(): fen '%s'\n", fen);
211 EditPositionPasteFEN(fen); /* call into backend */
217 PasteGameFromClipboard()
219 /* Write the clipboard to a temp file, then let LoadGameFromFile()
220 * do all the work. */
224 if (!PasteTextFromClipboard(&buf)) {
228 pasteTemp = tmpnam(NULL);
230 f = fopen(pasteTemp, "wb+");
232 DisplayError("Unable to create temporary file.", 0);
235 len = fwrite(buf, sizeof(char), strlen(buf), f);
237 if (len != strlen(buf)) {
238 DisplayError("Error writing to temporary file.", 0);
241 LoadGameFromFile(pasteTemp, 0, "Clipboard", TRUE);
246 PasteTextFromClipboard(char **text)
248 /* some (most?) of the error checking may be overkill,
249 * but hey, this is Windows
257 if (!OpenClipboard(hwndMain)) {
258 DisplayError("Unable to open clipboard.", 0);
261 hClipMem = GetClipboardData(CF_TEXT);
262 if (hClipMem == NULL) {
264 DisplayError("No text in clipboard.", 0);
267 lpClipMem = GlobalLock(hClipMem);
268 if (lpClipMem == NULL) {
270 DisplayError("Unable to lock clipboard memory.", 0);
273 *text = (char *) malloc(GlobalSize(hClipMem)+1);
275 DisplayError("Unable to allocate memory for text string.", 0);
279 lstrcpy(*text, lpClipMem);
280 if (appData.debugMode) {
281 lockCount = GlobalFlags(hClipMem) & GMEM_LOCKCOUNT;
282 fprintf(debugFP, "PasteTextFromClipboard(): lock count %d\n", lockCount);
284 SetLastError(NO_ERROR);
286 /*suggested by Wilkin Ng*/
287 lockCount = GlobalFlags(hClipMem) & GMEM_LOCKCOUNT;
289 locked = GlobalUnlock(hClipMem);
292 locked = GlobalUnlock(hClipMem);
294 err = GetLastError();
295 if (appData.debugMode) {
296 lockCount = GlobalFlags(hClipMem) & GMEM_LOCKCOUNT;
297 fprintf(debugFP, "PasteTextFromClipboard(): lock count %d\n", lockCount);
300 locked = !((err == NO_ERROR) || (err == ERROR_NOT_LOCKED));
301 if (appData.debugMode) {
303 "PasteTextFromClipboard(): err %d locked %d\n", err, locked);
307 DisplayError("Unable to unlock clipboard memory.", 0);
309 if (!CloseClipboard())
310 DisplayError("Unable to close clipboard.", 0);
316 DeleteClipboardTempFiles()
318 if (copyTemp) remove(copyTemp);
319 if (pasteTemp) remove(pasteTemp);