shithub: puzzles

Download patch

ref: aea7b6181580df2f0b28d027832dee8d9abccd73
parent: 9e240e45df4929f77b1a088cffbf7aaa6050ed03
author: Simon Tatham <anakin@pobox.com>
date: Mon May 2 06:55:32 EDT 2005

Oops; forgot to check in the copy-to-clipboard option for Windows.

[originally from svn r5730]

--- a/windows.c
+++ b/windows.c
@@ -27,11 +27,12 @@
 #define IDM_RESTART   0x0020
 #define IDM_UNDO      0x0030
 #define IDM_REDO      0x0040
-#define IDM_QUIT      0x0050
-#define IDM_CONFIG    0x0060
-#define IDM_SEED      0x0070
-#define IDM_HELPC     0x0080
-#define IDM_GAMEHELP  0x0090
+#define IDM_COPY      0x0050
+#define IDM_QUIT      0x0060
+#define IDM_CONFIG    0x0070
+#define IDM_SEED      0x0080
+#define IDM_HELPC     0x0090
+#define IDM_GAMEHELP  0x00A0
 #define IDM_PRESETS   0x0100
 
 #define HELP_FILE_NAME  "puzzles.hlp"
@@ -325,6 +326,30 @@
     }
 }
 
+void write_clip(HWND hwnd, char *data)
+{
+    HGLOBAL clipdata;
+    int len = strlen(data);
+    void *lock;
+
+    clipdata = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, len + 1);
+    if (!clipdata)
+	return;
+    lock = GlobalLock(clipdata);
+    if (!lock)
+	return;
+    memcpy(lock, data, len);
+    ((unsigned char *) lock)[len] = 0;
+    GlobalUnlock(clipdata);
+
+    if (OpenClipboard(hwnd)) {
+	EmptyClipboard();
+	SetClipboardData(CF_TEXT, clipdata);
+	CloseClipboard();
+    } else
+	GlobalFree(clipdata);
+}
+
 /*
  * See if we can find a help file.
  */
@@ -458,6 +483,10 @@
 	AppendMenu(menu, MF_SEPARATOR, 0, 0);
 	AppendMenu(menu, MF_ENABLED, IDM_UNDO, "Undo");
 	AppendMenu(menu, MF_ENABLED, IDM_REDO, "Redo");
+	if (thegame.can_format_as_text) {
+	    AppendMenu(menu, MF_SEPARATOR, 0, 0);
+	    AppendMenu(menu, MF_ENABLED, IDM_COPY, "Copy");
+	}
 	AppendMenu(menu, MF_SEPARATOR, 0, 0);
 	AppendMenu(menu, MF_ENABLED, IDM_QUIT, "Exit");
         if (fe->help_path) {
@@ -891,6 +920,15 @@
 	  case IDM_REDO:
 	    if (!midend_process_key(fe->me, 0, 0, '\x12'))
 		PostQuitMessage(0);
+	    break;
+	  case IDM_COPY:
+	    {
+		char *text = midend_text_format(fe->me);
+		if (text)
+		    write_clip(hwnd, text);
+		else
+		    MessageBeep(MB_ICONWARNING);
+	    }
 	    break;
 	  case IDM_QUIT:
 	    if (!midend_process_key(fe->me, 0, 0, 'q'))