Oops; forgot to check in the copy-to-clipboard option for Windows.
[sgt/puzzles] / windows.c
index 2833969..c570b29 100644 (file)
--- a/windows.c
+++ b/windows.c
 #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"
@@ -154,18 +155,12 @@ void frontend_default_colour(frontend *fe, float *output)
 
 void clip(frontend *fe, int x, int y, int w, int h)
 {
-    if (!fe->clip) {
-       fe->clip = CreateRectRgn(0, 0, 1, 1);
-       GetClipRgn(fe->hdc_bm, fe->clip);
-    }
-
     IntersectClipRect(fe->hdc_bm, x, y, x+w, y+h);
 }
 
 void unclip(frontend *fe)
 {
-    assert(fe->clip);
-    SelectClipRgn(fe->hdc_bm, fe->clip);
+    SelectClipRgn(fe->hdc_bm, NULL);
 }
 
 void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
@@ -191,11 +186,7 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
         fe->fonts[i].type = fonttype;
         fe->fonts[i].size = fontsize;
 
-        /*
-         * FIXME: Really I should make at least _some_ effort to
-         * pick the correct font.
-         */
-        fe->fonts[i].font = CreateFont(-fontsize, 0, 0, 0, 0,
+        fe->fonts[i].font = CreateFont(-fontsize, 0, 0, 0, FW_BOLD,
                                       FALSE, FALSE, FALSE, DEFAULT_CHARSET,
                                       OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                                       DEFAULT_QUALITY,
@@ -227,6 +218,7 @@ void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,
                x -= size.cx;
        }
        SetBkMode(fe->hdc_bm, TRANSPARENT);
+       SetTextColor(fe->hdc_bm, fe->colours[colour]);
        TextOut(fe->hdc_bm, x, y, text, strlen(text));
        SelectObject(fe->hdc_bm, oldfont);
     }
@@ -334,6 +326,30 @@ void activate_timer(frontend *fe)
     }
 }
 
+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.
  */
@@ -467,6 +483,10 @@ static frontend *new_window(HINSTANCE inst, char *game_id, char **error)
        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) {
@@ -901,6 +921,15 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
            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'))
                PostQuitMessage(0);