Sebastian Kuschel reports that pfd_closing can be called for a socket
[u/mdw/putty] / windows / windlg.c
index 9d98623..aadf88e 100644 (file)
@@ -44,7 +44,7 @@ static struct dlgparam dp;
 static char **events = NULL;
 static int nevents = 0, negsize = 0;
 
-extern Config cfg;                    /* defined in window.c */
+extern Conf *conf;                    /* defined in window.c */
 
 #define PRINTER_DISABLED_STRING "None (printing disabled)"
 
@@ -322,7 +322,7 @@ static HTREEITEM treeview_insert(struct treeview_faff *faff,
     newitem = TreeView_InsertItem(faff->treeview, &ins);
     if (level > 0)
        TreeView_Expand(faff->treeview, faff->lastat[level - 1],
-                       TVE_EXPAND);
+                       (level > 1 ? TVE_COLLAPSE : TVE_EXPAND));
     faff->lastat[level] = newitem;
     for (i = level + 1; i < 4; i++)
        faff->lastat[i] = NULL;
@@ -380,7 +380,7 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
        create_controls(hwnd, "");     /* Open and Cancel buttons etc */
        SetWindowText(hwnd, dp.wintitle);
        SetWindowLongPtr(hwnd, GWLP_USERDATA, 0);
-        if (help_path)
+        if (has_help())
             SetWindowLongPtr(hwnd, GWL_EXSTYLE,
                             GetWindowLongPtr(hwnd, GWL_EXSTYLE) |
                             WS_EX_CONTEXTHELP);
@@ -389,7 +389,6 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
             if (item)
                 DestroyWindow(item);
         }
-        requested_help = FALSE;
        SendMessage(hwnd, WM_SETICON, (WPARAM) ICON_BIG,
                    (LPARAM) LoadIcon(hinst, MAKEINTRESOURCE(IDI_CFGICON)));
        /*
@@ -586,19 +585,12 @@ static int CALLBACK GenericMainDlgProc(HWND hwnd, UINT msg,
            ret = 0;
        return ret;
       case WM_HELP:
-        if (help_path) {
-           if (winctrl_context_help(&dp, hwnd,
-                                    ((LPHELPINFO)lParam)->iCtrlId))
-                requested_help = TRUE;
-           else
-                MessageBeep(0);
-        }
+       if (!winctrl_context_help(&dp, hwnd,
+                                ((LPHELPINFO)lParam)->iCtrlId))
+           MessageBeep(0);
         break;
       case WM_CLOSE:
-        if (requested_help) {
-            WinHelp(hwnd, help_path, HELP_QUIT, 0);
-            requested_help = FALSE;
-        }
+       quit_help(hwnd);
        SaneEndDialog(hwnd, 0);
        return 0;
 
@@ -622,12 +614,7 @@ void modal_about_box(HWND hwnd)
 
 void show_help(HWND hwnd)
 {
-    if (help_path) {
-       WinHelp(hwnd, help_path,
-               help_has_contents ? HELP_FINDER : HELP_CONTENTS,
-               0);
-       requested_help = TRUE;
-    }
+    launch_help(hwnd, NULL);
 }
 
 void defuse_showwindow(void)
@@ -653,7 +640,7 @@ int do_config(void)
 
     ctrlbox = ctrl_new_box();
     setup_config_box(ctrlbox, FALSE, 0, 0);
-    win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), FALSE, 0);
+    win_setup_config_box(ctrlbox, &dp.hwnd, has_help(), FALSE, 0);
     dp_init(&dp);
     winctrl_init(&ctrls_base);
     winctrl_init(&ctrls_panel);
@@ -661,7 +648,8 @@ int do_config(void)
     dp_add_tree(&dp, &ctrls_panel);
     dp.wintitle = dupprintf("%s Configuration", appname);
     dp.errtitle = dupprintf("%s Error", appname);
-    dp.data = &cfg;
+    dp.data = conf;
+    dlg_auto_set_fixed_pitch_flag(&dp);
     dp.shortcuts['g'] = TRUE;         /* the treeview: `Cate&gory' */
 
     ret =
@@ -678,15 +666,15 @@ int do_config(void)
 
 int do_reconfig(HWND hwnd, int protcfginfo)
 {
-    Config backup_cfg;
-    int ret;
+    Conf *backup_conf;
+    int ret, protocol;
 
-    backup_cfg = cfg;                 /* structure copy */
+    backup_conf = conf_copy(conf);
 
     ctrlbox = ctrl_new_box();
-    setup_config_box(ctrlbox, TRUE, cfg.protocol, protcfginfo);
-    win_setup_config_box(ctrlbox, &dp.hwnd, (help_path != NULL), TRUE,
-                         cfg.protocol);
+    protocol = conf_get_int(conf, CONF_protocol);
+    setup_config_box(ctrlbox, TRUE, protocol, protcfginfo);
+    win_setup_config_box(ctrlbox, &dp.hwnd, has_help(), TRUE, protocol);
     dp_init(&dp);
     winctrl_init(&ctrls_base);
     winctrl_init(&ctrls_panel);
@@ -694,7 +682,8 @@ int do_reconfig(HWND hwnd, int protcfginfo)
     dp_add_tree(&dp, &ctrls_panel);
     dp.wintitle = dupprintf("%s Reconfiguration", appname);
     dp.errtitle = dupprintf("%s Error", appname);
-    dp.data = &cfg;
+    dp.data = conf;
+    dlg_auto_set_fixed_pitch_flag(&dp);
     dp.shortcuts['g'] = TRUE;         /* the treeview: `Cate&gory' */
 
     ret = SaneDialogBox(hinst, MAKEINTRESOURCE(IDD_MAINBOX), NULL,
@@ -706,7 +695,9 @@ int do_reconfig(HWND hwnd, int protcfginfo)
     dp_cleanup(&dp);
 
     if (!ret)
-       cfg = backup_cfg;              /* structure copy */
+       conf_copy_into(conf, backup_conf);
+
+    conf_free(backup_conf);
 
     return ret;
 }
@@ -799,7 +790,7 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
 
     if (ret == 0)                     /* success - key matched OK */
        return 1;
-    if (ret == 2) {                   /* key was different */
+    else if (ret == 2) {              /* key was different */
        int mbret;
        char *text = dupprintf(wrongmsg, appname, keytype, fingerprint,
                               appname);
@@ -815,9 +806,7 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
            return 1;
        } else if (mbret == IDNO)
            return 1;
-        return 0;
-    }
-    if (ret == 1) {                   /* key was absent */
+    } else if (ret == 1) {            /* key was absent */
        int mbret;
        char *text = dupprintf(absentmsg, keytype, fingerprint, appname);
        char *caption = dupprintf(mbtitle, appname);
@@ -832,8 +821,8 @@ int verify_ssh_host_key(void *frontend, char *host, int port, char *keytype,
            return 1;
        } else if (mbret == IDNO)
            return 1;
-        return 0;
     }
+    return 0;  /* abandon the connection */
 }
 
 /*
@@ -856,6 +845,7 @@ int askalg(void *frontend, const char *algtype, const char *algname,
     title = dupprintf(mbtitle, appname);
     mbret = MessageBox(NULL, message, title,
                       MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON2);
+    socket_reselect_all();
     sfree(message);
     sfree(title);
     if (mbret == IDYES)
@@ -868,7 +858,7 @@ int askalg(void *frontend, const char *algtype, const char *algname,
  * Ask whether to wipe a session log file before writing to it.
  * Returns 2 for wipe, 1 for append, 0 for cancel (don't log).
  */
-int askappend(void *frontend, Filename filename,
+int askappend(void *frontend, Filename *filename,
              void (*callback)(void *ctx, int result), void *ctx)
 {
     static const char msgtemplate[] =
@@ -882,12 +872,14 @@ int askappend(void *frontend, Filename filename,
     char *mbtitle;
     int mbret;
 
-    message = dupprintf(msgtemplate, FILENAME_MAX, filename.path);
+    message = dupprintf(msgtemplate, FILENAME_MAX, filename->path);
     mbtitle = dupprintf("%s Log to File", appname);
 
     mbret = MessageBox(NULL, message, mbtitle,
                       MB_ICONQUESTION | MB_YESNOCANCEL | MB_DEFBUTTON3);
 
+    socket_reselect_all();
+
     sfree(message);
     sfree(mbtitle);
 
@@ -929,6 +921,8 @@ void old_keyfile_warning(void)
 
     MessageBox(NULL, msg, title, MB_OK);
 
+    socket_reselect_all();
+
     sfree(msg);
     sfree(title);
 }