Create settings.c and move the load/save session code out of
[u/mdw/putty] / window.c
index e966b43..de431d6 100644 (file)
--- a/window.c
+++ b/window.c
@@ -13,6 +13,7 @@
 
 #define PUTTY_DO_GLOBALS                      /* actually _define_ globals */
 #include "putty.h"
+#include "storage.h"
 #include "win_res.h"
 
 #define IDM_SHOWLOG   0x0010
@@ -82,6 +83,8 @@ static RGBTRIPLE defpal[NCOLOURS];
 
 static HWND hwnd;
 
+static HBITMAP caretbm;
+
 static int dbltime, lasttime, lastact;
 static Mouse_Button lastbtn;
 
@@ -129,7 +132,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
        default_protocol = DEFAULT_PROTOCOL;
        default_port = DEFAULT_PORT;
 
-       do_defaults(NULL);
+       do_defaults(NULL, &cfg);
 
        p = cmdline;
        while (*p && isspace(*p)) p++;
@@ -153,6 +156,32 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
                tolower(p[1]) == 'o' &&
                tolower(p[2]) == 'g') {
                 logfile = "putty.log";
+           } else if (q == p + 7 &&
+               tolower(p[0]) == 'c' &&
+               tolower(p[1]) == 'l' &&
+               tolower(p[2]) == 'e' &&
+               tolower(p[3]) == 'a' &&
+               tolower(p[4]) == 'n' &&
+               tolower(p[5]) == 'u' &&
+               tolower(p[6]) == 'p') {
+                /*
+                 * `putty -cleanup'. Remove all registry entries
+                 * associated with PuTTY, and also find and delete
+                 * the random seed file.
+                 */
+                if (MessageBox(NULL,
+                               "This procedure will remove ALL Registry\n"
+                               "entries associated with PuTTY, and will\n"
+                               "also remove the PuTTY random seed file.\n"
+                               "\n"
+                               "THIS PROCESS WILL DESTROY YOUR SAVED\n"
+                               "SESSIONS. Are you really sure you want\n"
+                               "to continue?",
+                               "PuTTY Warning",
+                               MB_YESNO | MB_ICONWARNING) == IDYES) {
+                    cleanup_all();
+                }
+                exit(0);
            }
            p = q + strspn(q, " \t");
        }
@@ -161,7 +190,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
         * An initial @ means to activate a saved session.
         */
        if (*p == '@') {
-           do_defaults (p+1);
+           do_defaults (p+1, &cfg);
            if (!*cfg.host && !do_config()) {
                WSACleanup();
                return 0;
@@ -356,6 +385,17 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
                  SWP_NOMOVE | SWP_NOREDRAW | SWP_NOZORDER);
 
     /*
+     * Set up a caret bitmap, with no content.
+     */
+    {
+        char *bits;
+        int size = (font_width+15)/16 * 2 * font_height; 
+        bits = calloc(size, 1);
+        caretbm = CreateBitmap(font_width, font_height, 1, 1, bits);
+        free(bits);
+    }
+
+    /*
      * Initialise the scroll bar.
      */
     {
@@ -375,7 +415,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
      */
     {
        char *error;
-       char msg[1024];
+       char msg[1024], *title;
        char *realhost;
 
        error = back->init (hwnd, cfg.host, cfg.port, &realhost);
@@ -385,9 +425,14 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
            return 0;
        }
        window_name = icon_name = NULL;
-       sprintf(msg, "%s - PuTTY", realhost);
-       set_title (msg);
-       set_icon (msg);
+        if (*cfg.wintitle) {
+            title = cfg.wintitle;
+        } else {
+            sprintf(msg, "%s - PuTTY", realhost);
+            title = msg;
+        }
+       set_title (title);
+       set_icon (title);
     }
 
     session_closed = FALSE;
@@ -509,9 +554,11 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) {
                    KillTimer(hwnd, timer_id);
                    timer_id = 0;
                }
+                HideCaret(hwnd);
                if (inbuf_head)
                    term_out();
                term_update();
+                ShowCaret(hwnd);
                if (!has_focus)
                   timer_id = SetTimer(hwnd, 1, 2000, NULL);
                else if (cfg.blinktext)
@@ -963,7 +1010,9 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
            enact_pending_netevent();
        if (inbuf_head)
            term_out();
+        HideCaret(hwnd);
        term_update();
+        ShowCaret(hwnd);
        return 0;
       case WM_CREATE:
        break;
@@ -1216,6 +1265,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
       case WM_PAINT:
        {
            PAINTSTRUCT p;
+            HideCaret(hwnd);
            hdc = BeginPaint (hwnd, &p);
            if (pal) {
                SelectPalette (hdc, pal, TRUE);
@@ -1226,6 +1276,7 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
            SelectObject (hdc, GetStockObject(SYSTEM_FONT));
            SelectObject (hdc, GetStockObject(WHITE_PEN));
            EndPaint (hwnd, &p);
+            ShowCaret(hwnd);
        }
        return 0;
       case WM_NETEVENT:
@@ -1242,11 +1293,14 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
        return 0;
       case WM_SETFOCUS:
        has_focus = TRUE;
+        CreateCaret(hwnd, caretbm, 0, 0);
+        ShowCaret(hwnd);
        term_out();
        term_update();
        break;
       case WM_KILLFOCUS:
        has_focus = FALSE;
+        DestroyCaret();
        term_out();
        term_update();
        break;
@@ -1421,6 +1475,16 @@ static LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
 }
 
 /*
+ * Move the system caret. (We maintain one, even though it's
+ * invisible, for the benefit of blind people: apparently some
+ * helper software tracks the system caret, so we should arrange to
+ * have one.)
+ */
+void sys_cursor(int x, int y) {
+    SetCaretPos(x * font_width, y * font_height);
+}
+
+/*
  * Draw a line of text in the window, at given character
  * coordinates, in given attributes.
  *
@@ -2178,7 +2242,7 @@ void palette_reset (void) {
     }
 }
 
-void write_clip (void *data, int len) {
+void write_clip (void *data, int len, int must_deselect) {
     HGLOBAL clipdata;
     void *lock;
 
@@ -2192,14 +2256,18 @@ void write_clip (void *data, int len) {
     ((unsigned char *) lock) [len] = 0;
     GlobalUnlock (clipdata);
 
-    SendMessage (hwnd, WM_IGNORE_CLIP, TRUE, 0);
+    if (!must_deselect)
+        SendMessage (hwnd, WM_IGNORE_CLIP, TRUE, 0);
+
     if (OpenClipboard (hwnd)) {
        EmptyClipboard();
        SetClipboardData (CF_TEXT, clipdata);
        CloseClipboard();
     } else
        GlobalFree (clipdata);
-    SendMessage (hwnd, WM_IGNORE_CLIP, FALSE, 0);
+
+    if (!must_deselect)
+        SendMessage (hwnd, WM_IGNORE_CLIP, FALSE, 0);
 }
 
 void get_clip (void **p, int *len) {