]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - windows/winctrls.c
first pass
[PuTTY.git] / windows / winctrls.c
index 7c6bf8db3f9b98f1611e9a0ed59113a1f1fe8b4c..a03967e6f81917a07e9669ea89448ba9b57098d7 100644 (file)
@@ -76,7 +76,7 @@ HWND doctl(struct ctlpos *cp, RECT r,
     if (cp->hwnd) {
        ctl = CreateWindowEx(exstyle, wclass, wtext, wstyle,
                             r.left, r.top, r.right, r.bottom,
-                            cp->hwnd, (HMENU) wid, hinst, NULL);
+                            cp->hwnd, (HMENU)(ULONG_PTR)wid, hinst, NULL);
        SendMessage(ctl, WM_SETFONT, cp->font, MAKELPARAM(TRUE, 0));
 
        if (!strcmp(wclass, "LISTBOX")) {
@@ -267,10 +267,9 @@ void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...)
     nbuttons = 0;
     while (1) {
        char *btext = va_arg(ap, char *);
-       int bid;
        if (!btext)
            break;
-       bid = va_arg(ap, int);
+       (void) va_arg(ap, int); /* id */
        nbuttons++;
     }
     va_end(ap);
@@ -299,10 +298,10 @@ void bareradioline(struct ctlpos *cp, int nacross, ...)
     nbuttons = 0;
     while (1) {
        char *btext = va_arg(ap, char *);
-       int bid;
        if (!btext)
            break;
-       bid = va_arg(ap, int);
+       (void) va_arg(ap, int); /* id */
+        nbuttons++;
     }
     va_end(ap);
     buttons = snewn(nbuttons, struct radio);
@@ -330,10 +329,10 @@ void radiobig(struct ctlpos *cp, char *text, int id, ...)
     nbuttons = 0;
     while (1) {
        char *btext = va_arg(ap, char *);
-       int bid;
        if (!btext)
            break;
-       bid = va_arg(ap, int);
+       (void) va_arg(ap, int); /* id */
+        nbuttons++;
     }
     va_end(ap);
     buttons = snewn(nbuttons, struct radio);
@@ -372,7 +371,6 @@ void checkbox(struct ctlpos *cp, char *text, int id)
 char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines)
 {
     HDC hdc = GetDC(hwnd);
-    int lpx = GetDeviceCaps(hdc, LOGPIXELSX);
     int width, nlines, j;
     INT *pwidths, nfit;
     SIZE size;
@@ -448,6 +446,8 @@ char *staticwrap(struct ctlpos *cp, HWND hwnd, char *text, int *lines)
 
     if (lines) *lines = nlines;
 
+    sfree(pwidths);
+
     return ret;
 }
 
@@ -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");
@@ -1665,7 +1665,9 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc,
            winctrl_add_shortcuts(dp, c);
            if (actual_base_id == base_id)
                base_id += num_ids;
-       }
+       } else {
+            sfree(data);
+        }
 
        if (colstart >= 0) {
            /*
@@ -1934,21 +1936,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 +1961,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);
            }
        }
@@ -2100,13 +2100,12 @@ void dlg_editbox_set(union control *ctrl, void *dlg, char const *text)
     SetDlgItemText(dp->hwnd, c->base_id+1, text);
 }
 
-void dlg_editbox_get(union control *ctrl, void *dlg, char *buffer, int length)
+char *dlg_editbox_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_EDITBOX);
-    GetDlgItemText(dp->hwnd, c->base_id+1, buffer, length);
-    buffer[length-1] = '\0';
+    return GetDlgItemText_alloc(dp->hwnd, c->base_id+1);
 }
 
 /* The `listbox' functions can also apply to combo boxes. */
@@ -2286,51 +2285,56 @@ void dlg_label_change(union control *ctrl, void *dlg, char const *text)
     }
 }
 
-void dlg_filesel_set(union control *ctrl, void *dlg, Filename fn)
+void dlg_filesel_set(union control *ctrl, void *dlg, Filename *fn)
 {
     struct dlgparam *dp = (struct dlgparam *)dlg;
     struct winctrl *c = dlg_findbyctrl(dp, ctrl);
     assert(c && c->ctrl->generic.type == CTRL_FILESELECT);
-    SetDlgItemText(dp->hwnd, c->base_id+1, fn.path);
+    SetDlgItemText(dp->hwnd, c->base_id+1, fn->path);
 }
 
-void dlg_filesel_get(union control *ctrl, void *dlg, Filename *fn)
+Filename *dlg_filesel_get(union control *ctrl, void *dlg)
 {
     struct dlgparam *dp = (struct dlgparam *)dlg;
     struct winctrl *c = dlg_findbyctrl(dp, ctrl);
+    char *tmp;
+    Filename *ret;
     assert(c && c->ctrl->generic.type == CTRL_FILESELECT);
-    GetDlgItemText(dp->hwnd, c->base_id+1, fn->path, lenof(fn->path));
-    fn->path[lenof(fn->path)-1] = '\0';
+    tmp = GetDlgItemText_alloc(dp->hwnd, c->base_id+1);
+    ret = filename_from_str(tmp);
+    sfree(tmp);
+    return ret;
 }
 
-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);
 }
 
 /*
@@ -2364,6 +2368,8 @@ void dlg_set_focus(union control *ctrl, void *dlg)
     struct winctrl *c = dlg_findbyctrl(dp, ctrl);
     int id;
     HWND ctl;
+    if (!c)
+        return;
     switch (ctrl->generic.type) {
       case CTRL_EDITBOX: id = c->base_id + 1; break;
       case CTRL_RADIO:
@@ -2398,7 +2404,7 @@ void dlg_beep(void *dlg)
     MessageBeep(0);
 }
 
-void dlg_error_msg(void *dlg, char *msg)
+void dlg_error_msg(void *dlg, const char *msg)
 {
     struct dlgparam *dp = (struct dlgparam *)dlg;
     MessageBox(dp->hwnd, msg,
@@ -2471,8 +2477,10 @@ int dlg_coloursel_results(union control *ctrl, void *dlg,
 void dlg_auto_set_fixed_pitch_flag(void *dlg)
 {
     struct dlgparam *dp = (struct dlgparam *)dlg;
-    Config *cfg = (Config *)dp->data;
-    HFONT font;
+    Conf *conf = (Conf *)dp->data;
+    FontSpec *fs;
+    int quality;
+    HFONT hfont;
     HDC hdc;
     TEXTMETRIC tm;
     int is_var;
@@ -2483,16 +2491,19 @@ void dlg_auto_set_fixed_pitch_flag(void *dlg)
      * dialog box as false.
      *
      * We assume here that any client of the dlg_* mechanism which is
-     * using font selectors at all is also using a normal 'Config *'
+     * using font selectors at all is also using a normal 'Conf *'
      * as dp->data.
      */
 
-    font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
-                      DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
-                      CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg->font_quality),
-                      FIXED_PITCH | FF_DONTCARE, cfg->font.name);
+    quality = conf_get_int(conf, CONF_font_quality);
+    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, fs->name);
     hdc = GetDC(NULL);
-    if (font && hdc && SelectObject(hdc, font) && 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 {
@@ -2500,8 +2511,8 @@ void dlg_auto_set_fixed_pitch_flag(void *dlg)
     }
     if (hdc)
         ReleaseDC(NULL, hdc);
-    if (font)
-        DeleteObject(font);
+    if (hfont)
+        DeleteObject(hfont);
 
     if (is_var)
         dp->fixed_pitch_fonts = FALSE;
@@ -2519,23 +2530,6 @@ void dlg_set_fixed_pitch_flag(void *dlg, int flag)
     dp->fixed_pitch_fonts = flag;
 }
 
-struct perctrl_privdata {
-    union control *ctrl;
-    void *data;
-    int needs_free;
-};
-
-static int perctrl_privdata_cmp(void *av, void *bv)
-{
-    struct perctrl_privdata *a = (struct perctrl_privdata *)av;
-    struct perctrl_privdata *b = (struct perctrl_privdata *)bv;
-    if (a->ctrl < b->ctrl)
-       return -1;
-    else if (a->ctrl > b->ctrl)
-       return +1;
-    return 0;
-}
-
 void dp_init(struct dlgparam *dp)
 {
     dp->nctrltrees = 0;
@@ -2545,7 +2539,6 @@ void dp_init(struct dlgparam *dp)
     memset(dp->shortcuts, 0, sizeof(dp->shortcuts));
     dp->hwnd = NULL;
     dp->wintitle = dp->errtitle = NULL;
-    dp->privdata = newtree234(perctrl_privdata_cmp);
     dp->fixed_pitch_fonts = TRUE;
 }
 
@@ -2557,67 +2550,6 @@ void dp_add_tree(struct dlgparam *dp, struct winctrls *wc)
 
 void dp_cleanup(struct dlgparam *dp)
 {
-    struct perctrl_privdata *p;
-
-    if (dp->privdata) {
-       while ( (p = index234(dp->privdata, 0)) != NULL ) {
-           del234(dp->privdata, p);
-           if (p->needs_free)
-               sfree(p->data);
-           sfree(p);
-       }
-       freetree234(dp->privdata);
-       dp->privdata = NULL;
-    }
     sfree(dp->wintitle);
     sfree(dp->errtitle);
 }
-
-void *dlg_get_privdata(union control *ctrl, void *dlg)
-{
-    struct dlgparam *dp = (struct dlgparam *)dlg;
-    struct perctrl_privdata tmp, *p;
-    tmp.ctrl = ctrl;
-    p = find234(dp->privdata, &tmp, NULL);
-    if (p)
-       return p->data;
-    else
-       return NULL;
-}
-
-void dlg_set_privdata(union control *ctrl, void *dlg, void *ptr)
-{
-    struct dlgparam *dp = (struct dlgparam *)dlg;
-    struct perctrl_privdata tmp, *p;
-    tmp.ctrl = ctrl;
-    p = find234(dp->privdata, &tmp, NULL);
-    if (!p) {
-       p = snew(struct perctrl_privdata);
-       p->ctrl = ctrl;
-       p->needs_free = FALSE;
-       add234(dp->privdata, p);
-    }
-    p->data = ptr;
-}
-
-void *dlg_alloc_privdata(union control *ctrl, void *dlg, size_t size)
-{
-    struct dlgparam *dp = (struct dlgparam *)dlg;
-    struct perctrl_privdata tmp, *p;
-    tmp.ctrl = ctrl;
-    p = find234(dp->privdata, &tmp, NULL);
-    if (!p) {
-       p = snew(struct perctrl_privdata);
-       p->ctrl = ctrl;
-       p->needs_free = FALSE;
-       add234(dp->privdata, p);
-    }
-    assert(!p->needs_free);
-    p->needs_free = TRUE;
-    /*
-     * This is an internal allocation routine, so it's allowed to
-     * use smalloc directly.
-     */
-    p->data = smalloc(size);
-    return p->data;
-}