Change the semantics of 'FontSpec' so that it's a dynamically
[u/mdw/putty] / windows / winctrls.c
index 8453e2e..4afd3d0 100644 (file)
@@ -1639,8 +1639,8 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc,
            shortcuts[nshortcuts++] = ctrl->fontselect.shortcut;
            statictext(&pos, escaped, 1, base_id);
            staticbtn(&pos, "", base_id+1, "Change...", base_id+2);
+            data = fontspec_new("", 0, 0, 0);
            sfree(escaped);
-           data = snew(FontSpec);
            break;
          default:
            assert(!"Can't happen");
@@ -1934,21 +1934,21 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg,
            CHOOSEFONT cf;
            LOGFONT lf;
            HDC hdc;
-           FontSpec fs = *(FontSpec *)c->data;
-           
+           FontSpec *fs = (FontSpec *)c->data;
+
            hdc = GetDC(0);
-           lf.lfHeight = -MulDiv(fs.height,
+           lf.lfHeight = -MulDiv(fs->height,
                                  GetDeviceCaps(hdc, LOGPIXELSY), 72);
            ReleaseDC(0, hdc);
            lf.lfWidth = lf.lfEscapement = lf.lfOrientation = 0;
            lf.lfItalic = lf.lfUnderline = lf.lfStrikeOut = 0;
-           lf.lfWeight = (fs.isbold ? FW_BOLD : 0);
-           lf.lfCharSet = fs.charset;
+           lf.lfWeight = (fs->isbold ? FW_BOLD : 0);
+           lf.lfCharSet = fs->charset;
            lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
            lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
            lf.lfQuality = DEFAULT_QUALITY;
            lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
-           strncpy(lf.lfFaceName, fs.name,
+           strncpy(lf.lfFaceName, fs->name,
                    sizeof(lf.lfFaceName) - 1);
            lf.lfFaceName[sizeof(lf.lfFaceName) - 1] = '\0';
 
@@ -1959,13 +1959,11 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg,
                 CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
 
            if (ChooseFont(&cf)) {
-               strncpy(fs.name, lf.lfFaceName,
-                       sizeof(fs.name) - 1);
-               fs.name[sizeof(fs.name) - 1] = '\0';
-               fs.isbold = (lf.lfWeight == FW_BOLD);
-               fs.charset = lf.lfCharSet;
-               fs.height = cf.iPointSize / 10;
+                fs = fontspec_new(lf.lfFaceName, (lf.lfWeight == FW_BOLD),
+                                  cf.iPointSize / 10, lf.lfCharSet);
                dlg_fontsel_set(ctrl, dp, fs);
+                fontspec_free(fs);
+
                ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE);
            }
        }
@@ -2313,34 +2311,35 @@ void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn)
     fn->path[lenof(fn->path)-1] = '\0';
 }
 
-void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec fs)
+void dlg_fontsel_set(union control *ctrl, void *dlg, FontSpec *fs)
 {
     char *buf, *boldstr;
     struct dlgparam *dp = (struct dlgparam *)dlg;
     struct winctrl *c = dlg_findbyctrl(dp, ctrl);
     assert(c && c->ctrl->generic.type == CTRL_FONTSELECT);
 
-    *(FontSpec *)c->data = fs;        /* structure copy */
+    fontspec_free((FontSpec *)c->data);
+    c->data = fontspec_copy(fs);
 
-    boldstr = (fs.isbold ? "bold, " : "");
-    if (fs.height == 0)
-       buf = dupprintf("Font: %s, %sdefault height", fs.name, boldstr);
+    boldstr = (fs->isbold ? "bold, " : "");
+    if (fs->height == 0)
+       buf = dupprintf("Font: %s, %sdefault height", fs->name, boldstr);
     else
-       buf = dupprintf("Font: %s, %s%d-%s", fs.name, boldstr,
-                       (fs.height < 0 ? -fs.height : fs.height),
-                       (fs.height < 0 ? "pixel" : "point"));
+       buf = dupprintf("Font: %s, %s%d-%s", fs->name, boldstr,
+                       (fs->height < 0 ? -fs->height : fs->height),
+                       (fs->height < 0 ? "pixel" : "point"));
     SetDlgItemText(dp->hwnd, c->base_id+1, buf);
     sfree(buf);
 
     dlg_auto_set_fixed_pitch_flag(dp);
 }
 
-void dlg_fontsel_get(union control *ctrl, void *dlg, FontSpec *fs)
+FontSpec *dlg_fontsel_get(union control *ctrl, void *dlg)
 {
     struct dlgparam *dp = (struct dlgparam *)dlg;
     struct winctrl *c = dlg_findbyctrl(dp, ctrl);
     assert(c && c->ctrl->generic.type == CTRL_FONTSELECT);
-    *fs = *(FontSpec *)c->data;               /* structure copy */
+    return fontspec_copy((FontSpec *)c->data);
 }
 
 /*
@@ -2482,7 +2481,7 @@ void dlg_auto_set_fixed_pitch_flag(void *dlg)
 {
     struct dlgparam *dp = (struct dlgparam *)dlg;
     Conf *conf = (Conf *)dp->data;
-    FontSpec *font;
+    FontSpec *fs;
     int quality;
     HFONT hfont;
     HDC hdc;
@@ -2500,14 +2499,14 @@ void dlg_auto_set_fixed_pitch_flag(void *dlg)
      */
 
     quality = conf_get_int(conf, CONF_font_quality);
-    font = conf_get_fontspec(conf, CONF_font);
+    fs = conf_get_fontspec(conf, CONF_font);
 
     hfont = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
                        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
                        CLIP_DEFAULT_PRECIS, FONT_QUALITY(quality),
-                       FIXED_PITCH | FF_DONTCARE, font->name);
+                       FIXED_PITCH | FF_DONTCARE, fs->name);
     hdc = GetDC(NULL);
-    if (font && hdc && SelectObject(hdc, hfont) && GetTextMetrics(hdc, &tm)) {
+    if (hdc && SelectObject(hdc, hfont) && GetTextMetrics(hdc, &tm)) {
         /* Note that the TMPF_FIXED_PITCH bit is defined upside down :-( */
         is_var = (tm.tmPitchAndFamily & TMPF_FIXED_PITCH);
     } else {