Integrate unfix.org's IPv6 patches up to level 10, with rather a lot
[u/mdw/putty] / windows / window.c
index fe90483..17aaf1a 100644 (file)
@@ -158,7 +158,7 @@ static enum {
 } und_mode;
 static int descent;
 
-#define NCFGCOLOURS 24
+#define NCFGCOLOURS 22
 #define NEXTCOLOURS 240
 #define NALLCOLOURS (NCFGCOLOURS + NEXTCOLOURS)
 static COLORREF colours[NALLCOLOURS];
@@ -542,9 +542,20 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
        }
 
        /*
-        * Trim a colon suffix off the hostname if it's there.
+        * Trim a colon suffix off the hostname if it's there. In
+        * order to protect IPv6 address literals against this
+        * treatment, we do not do this if there's _more_ than one
+        * colon.
         */
-       cfg.host[strcspn(cfg.host, ":")] = '\0';
+       {
+           char *c = strchr(cfg.host, ':');
+
+           if (c) {
+               char *d = strchr(c+1, ':');
+               if (!d)
+                   *c = '\0';
+           }
+       }
 
        /*
         * Remove any remaining whitespace from the hostname.
@@ -635,7 +646,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
      * Initialise the terminal. (We have to do this _after_
      * creating the window, since the terminal is the first thing
      * which will call schedule_timer(), which will in turn call
-     * timer_change_notify() which will expect hwnd to exist.
+     * timer_change_notify() which will expect hwnd to exist.)
      */
     term = term_init(&cfg, &ucsdata, NULL);
     logctx = log_init(NULL, &cfg);
@@ -1900,7 +1911,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                GetWindowText(hwnd, cfg.wintitle, sizeof(cfg.wintitle));
                prev_cfg = cfg;
 
-               if (!do_reconfig(hwnd))
+               if (!do_reconfig(hwnd, back ? back->cfg_info(backhandle) : 0))
                    break;
 
                {
@@ -2295,10 +2306,10 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                HBRUSH fillcolour, oldbrush;
                HPEN   edge, oldpen;
                fillcolour = CreateSolidBrush (
-                                   colours[(ATTR_DEFBG>>ATTR_BGSHIFT)*2]);
+                                   colours[ATTR_DEFBG>>ATTR_BGSHIFT]);
                oldbrush = SelectObject(hdc, fillcolour);
                edge = CreatePen(PS_SOLID, 0, 
-                                   colours[(ATTR_DEFBG>>ATTR_BGSHIFT)*2]);
+                                   colours[ATTR_DEFBG>>ATTR_BGSHIFT]);
                oldpen = SelectObject(hdc, edge);
 
                /*
@@ -2320,7 +2331,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                Rectangle(hdc, p.rcPaint.left, p.rcPaint.top, 
                          p.rcPaint.right, p.rcPaint.bottom);
 
-               // SelectClipRgn(hdc, NULL);
+               /* SelectClipRgn(hdc, NULL); */
 
                SelectObject(hdc, oldbrush);
                DeleteObject(fillcolour);
@@ -3234,7 +3245,7 @@ void do_cursor(Context ctx, int x, int y, wchar_t *text, int len,
        if (attr & TATTR_ACTCURS) {
            HPEN oldpen;
            oldpen =
-               SelectObject(hdc, CreatePen(PS_SOLID, 0, colours[23]));
+               SelectObject(hdc, CreatePen(PS_SOLID, 0, colours[261]));
            MoveToEx(hdc, startx, starty, NULL);
            LineTo(hdc, startx + dx * length, starty + dy * length);
            oldpen = SelectObject(hdc, oldpen);
@@ -3242,7 +3253,7 @@ void do_cursor(Context ctx, int x, int y, wchar_t *text, int len,
        } else {
            for (i = 0; i < length; i++) {
                if (i % 2 == 0) {
-                   SetPixel(hdc, startx, starty, colours[23]);
+                   SetPixel(hdc, startx, starty, colours[261]);
                }
                startx += dx;
                starty += dy;