Add X11 forwarding, mainly thanks to Andreas Schultz
[u/mdw/putty] / windlg.c
index b916585..abc0902 100644 (file)
--- a/windlg.c
+++ b/windlg.c
@@ -189,6 +189,7 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_PROTSTATIC,
     IDC_PROTRAW,
     IDC_PROTTELNET,
+    IDC_PROTRLOGIN,
     IDC_PROTSSH,
     IDC_SESSSTATIC,
     IDC_SESSEDIT,
@@ -274,6 +275,10 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_BOX_APPEARANCE1, IDC_BOXT_APPEARANCE1,
     IDC_BOX_APPEARANCE2, IDC_BOXT_APPEARANCE2,
     IDC_BOX_APPEARANCE3, IDC_BOXT_APPEARANCE3,
+    IDC_CURSORSTATIC,
+    IDC_CURBLOCK,
+    IDC_CURUNDER,
+    IDC_CURVERT,
     IDC_BLINKCUR,
     IDC_FONTSTATIC,
     IDC_CHOOSEFONT,
@@ -313,6 +318,16 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_EMRFC,
     telnetpanelend,
 
+    rloginpanelstart,
+    IDC_TITLE_RLOGIN,
+    IDC_BOX_RLOGIN1, IDC_BOXT_RLOGIN1,
+    IDC_BOX_RLOGIN2, IDC_BOXT_RLOGIN2,
+    IDC_R_TSSTATIC,
+    IDC_R_TSEDIT,
+    IDC_RLLUSERSTATIC,
+    IDC_RLLUSEREDIT,
+    rloginpanelend,
+
     sshpanelstart,
     IDC_TITLE_SSH,
     IDC_BOX_SSH1, IDC_BOXT_SSH1,
@@ -386,6 +401,13 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
     IDC_VTPOORMAN,
     translationpanelend,
 
+    tunnelspanelstart,
+    IDC_BOX_TUNNELS, IDC_BOXT_TUNNELS,
+    IDC_X11_FORWARD,
+    IDC_X11_DISPSTATIC,
+    IDC_X11_DISPLAY,
+    tunnelspanelend,
+
     controlendvalue
 };
 
@@ -429,7 +451,8 @@ static void init_dlg_ctrls(HWND hwnd) {
     SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE);
     CheckRadioButton (hwnd, IDC_PROTRAW, IDC_PROTSSH,
                      cfg.protocol==PROT_SSH ? IDC_PROTSSH :
-                     cfg.protocol==PROT_TELNET ? IDC_PROTTELNET : IDC_PROTRAW );
+                     cfg.protocol==PROT_TELNET ? IDC_PROTTELNET :
+                      cfg.protocol==PROT_RLOGIN ? IDC_PROTRLOGIN : IDC_PROTRAW );
     SetDlgItemInt (hwnd, IDC_PINGEDIT, cfg.ping_interval, FALSE);
 
     CheckRadioButton (hwnd, IDC_DEL008, IDC_DEL127,
@@ -472,6 +495,9 @@ static void init_dlg_ctrls(HWND hwnd) {
 
     SetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle);
     CheckDlgButton (hwnd, IDC_WINNAME, cfg.win_name_always);
+    CheckRadioButton (hwnd, IDC_CURBLOCK, IDC_CURVERT,
+                     cfg.cursor_type==0 ? IDC_CURBLOCK :
+                     cfg.cursor_type==1 ? IDC_CURUNDER : IDC_CURVERT);
     CheckDlgButton (hwnd, IDC_BLINKCUR, cfg.blink_cur);
     CheckDlgButton (hwnd, IDC_SCROLLBAR, cfg.scrollbar);
     CheckDlgButton (hwnd, IDC_LOCKSIZE, cfg.locksize);
@@ -480,6 +506,8 @@ static void init_dlg_ctrls(HWND hwnd) {
 
     SetDlgItemText (hwnd, IDC_TTEDIT, cfg.termtype);
     SetDlgItemText (hwnd, IDC_TSEDIT, cfg.termspeed);
+    SetDlgItemText (hwnd, IDC_R_TSEDIT, cfg.termspeed);
+    SetDlgItemText (hwnd, IDC_RLLUSEREDIT, cfg.localusername);
     SetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username);
     SetDlgItemText (hwnd, IDC_LGFEDIT, cfg.logfilename);
     CheckRadioButton(hwnd, IDC_LSTATOFF, IDC_LSTATRAW,
@@ -558,6 +586,9 @@ static void init_dlg_ctrls(HWND hwnd) {
                      cfg.vtmode == VT_OEMANSI ? IDC_VTOEMANSI :
                      cfg.vtmode == VT_OEMONLY ? IDC_VTOEMONLY :
                      IDC_VTPOORMAN);
+
+    CheckDlgButton (hwnd, IDC_X11_FORWARD, cfg.x11_forward);
+    SetDlgItemText (hwnd, IDC_X11_DISPLAY, cfg.x11_display);
 }
 
 static void hide(HWND hwnd, int hide, int minid, int maxid) {
@@ -684,15 +715,17 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                multiedit(&cp,
                          "Host &Name", IDC_HOSTSTATIC, IDC_HOST, 75,
                          "&Port", IDC_PORTSTATIC, IDC_PORT, 25, NULL);
-               if (backends[2].backend == NULL) {
+               if (backends[3].backend == NULL) {
                    /* this is PuTTYtel, so only two protocols available */
-                   radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3,
+                   radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4,
                              "&Raw", IDC_PROTRAW,
-                             "&Telnet", IDC_PROTTELNET, NULL);
+                             "&Telnet", IDC_PROTTELNET,
+                             "R&login", IDC_PROTRLOGIN, NULL);
                } else {
-                   radioline(&cp, "Protocol:", IDC_PROTSTATIC, 3,
+                   radioline(&cp, "Protocol:", IDC_PROTSTATIC, 4,
                              "&Raw", IDC_PROTRAW,
                              "&Telnet", IDC_PROTTELNET,
+                             "R&login", IDC_PROTRLOGIN,
 #ifdef FWHACK
                              "SS&H/hack",
 #else
@@ -828,7 +861,7 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
             treeview_insert(&tvfaff, 0, "Window");
        }
 
-        /* The Appearance panel. Accelerators used: [acgo] rmkhti */
+        /* The Appearance panel. Accelerators used: [acgo] rmkhtibluv */
        {
            struct ctlpos cp;
            ctlposinit(&cp, hwnd, 80, 3, 13);
@@ -836,6 +869,11 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                      IDC_TITLE_APPEARANCE);
             beginbox(&cp, "Adjust the use of the cursor",
                      IDC_BOX_APPEARANCE1, IDC_BOXT_APPEARANCE1);
+           radioline(&cp, "Cursor appearance:", IDC_CURSORSTATIC, 3,
+                     "B&lock", IDC_CURBLOCK,
+                     "&Underline", IDC_CURUNDER,
+                     "&Vertical line", IDC_CURVERT,
+                     NULL);
            checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR);
             endbox(&cp);
             beginbox(&cp, "Set the font used in the terminal window",
@@ -844,10 +882,9 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
             endbox(&cp);
             beginbox(&cp, "Adjust the use of the window title",
                      IDC_BOX_APPEARANCE3, IDC_BOXT_APPEARANCE3);
-           if (dlgtype == 0)
-               multiedit(&cp,
-                         "Initial window &title:", IDC_WINTITLE,
-                         IDC_WINEDIT, 100, NULL);
+            multiedit(&cp,
+                      "Window &title:", IDC_WINTITLE,
+                      IDC_WINEDIT, 100, NULL);
            checkbox(&cp, "Avoid ever using &icon title", IDC_WINNAME);
             endbox(&cp);
 
@@ -949,7 +986,7 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
             }
             beginbox(&cp, "Sending of null packets to keep session active",
                      IDC_BOX_CONNECTION2, IDC_BOXT_CONNECTION2);
-            staticedit(&cp, "Minutes between &keepalives (0 to turn off)",
+            staticedit(&cp, "Seconds between &keepalives (0 to turn off)",
                        IDC_PINGSTATIC, IDC_PINGEDIT, 25);
             endbox(&cp);
 
@@ -982,8 +1019,25 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
            }
        }
 
+
+       /* The Rlogin Panel */
+       {
+           struct ctlpos cp;
+           ctlposinit(&cp, hwnd, 80, 3, 13);
+           if (dlgtype == 0) {
+                bartitle(&cp, "Options controlling Rlogin connections", IDC_TITLE_RLOGIN);
+                beginbox(&cp, "Data to send to the server",
+                         IDC_BOX_RLOGIN1, IDC_BOXT_RLOGIN1);
+               staticedit(&cp, "Terminal-&speed string", IDC_R_TSSTATIC, IDC_R_TSEDIT, 50);
+               staticedit(&cp, "&Local username:", IDC_RLLUSERSTATIC, IDC_RLLUSEREDIT, 50);
+                endbox(&cp);
+
+                treeview_insert(&tvfaff, 1, "Rlogin");
+           }
+       }
+
        /* The SSH panel. Accelerators used: [acgo] rmakwp123bd */
-        if (backends[2].backend != NULL) {
+        if (backends[3].backend != NULL) {
            struct ctlpos cp;
            ctlposinit(&cp, hwnd, 80, 3, 13);
            if (dlgtype == 0) {
@@ -1020,6 +1074,22 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                 treeview_insert(&tvfaff, 1, "SSH");
            }
        }
+        /* The Tunnels panel. Accelerators used: [acgo] ex */
+        {
+           struct ctlpos tp;
+           ctlposinit(&tp, hwnd, 80, 3, 13);
+           if (dlgtype == 0) {
+             beginbox(&tp, "X11 forwarding options",
+                      IDC_BOX_TUNNELS, IDC_BOXT_TUNNELS);
+             checkbox(&tp, "&Enable X11 forwarding",
+                      IDC_X11_FORWARD);
+             multiedit(&tp, "&X display location", IDC_X11_DISPSTATIC,
+                       IDC_X11_DISPLAY, 50, NULL);
+             endbox(&tp);
+             
+             treeview_insert(&tvfaff, 2, "Tunnels");
+           }
+        }
 
        init_dlg_ctrls(hwnd);
         for (i = 0; i < nsessions; i++)
@@ -1080,10 +1150,14 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                hide(hwnd, FALSE, windowpanelstart, windowpanelend);
            if (!strcmp(buffer, "Appearance"))
                hide(hwnd, FALSE, appearancepanelstart, appearancepanelend);
+           if (!strcmp(buffer, "Tunnels"))
+               hide(hwnd, FALSE, tunnelspanelstart, tunnelspanelend);
            if (!strcmp(buffer, "Connection"))
                hide(hwnd, FALSE, connectionpanelstart, connectionpanelend);
            if (!strcmp(buffer, "Telnet"))
                hide(hwnd, FALSE, telnetpanelstart, telnetpanelend);
+           if (!strcmp(buffer, "Rlogin"))
+               hide(hwnd, FALSE, rloginpanelstart, rloginpanelend);
            if (!strcmp(buffer, "SSH"))
                hide(hwnd, FALSE, sshpanelstart, sshpanelend);
            if (!strcmp(buffer, "Selection"))
@@ -1112,16 +1186,19 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
            EndDialog (hwnd, 0);
            return 0;
          case IDC_PROTTELNET:
+         case IDC_PROTRLOGIN:
          case IDC_PROTSSH:
          case IDC_PROTRAW:
            if (HIWORD(wParam) == BN_CLICKED ||
                HIWORD(wParam) == BN_DOUBLECLICKED) {
                int i = IsDlgButtonChecked (hwnd, IDC_PROTSSH);
                int j = IsDlgButtonChecked (hwnd, IDC_PROTTELNET);
-               cfg.protocol = i ? PROT_SSH : j ? PROT_TELNET : PROT_RAW ;
-               if ((cfg.protocol == PROT_SSH && cfg.port == 23) ||
-                   (cfg.protocol == PROT_TELNET && cfg.port == 22)) {
-                   cfg.port = i ? 22 : 23;
+               int k = IsDlgButtonChecked (hwnd, IDC_PROTRLOGIN);
+               cfg.protocol = i ? PROT_SSH : j ? PROT_TELNET : k ? PROT_RLOGIN : PROT_RAW ;
+               if ((cfg.protocol == PROT_SSH && cfg.port != 22) ||
+                   (cfg.protocol == PROT_TELNET && cfg.port != 23) ||
+                   (cfg.protocol == PROT_RLOGIN && cfg.port != 513)) {
+                   cfg.port = i ? 22 : j ? 23 : 513;
                    SetDlgItemInt (hwnd, IDC_PORT, cfg.port, FALSE);
                }
            }
@@ -1418,6 +1495,21 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                HIWORD(wParam) == BN_DOUBLECLICKED)
                cfg.win_name_always = IsDlgButtonChecked (hwnd, IDC_WINNAME);
            break;
+         case IDC_CURBLOCK:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED)
+               cfg.cursor_type = 0;
+           break;
+         case IDC_CURUNDER:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED)
+               cfg.cursor_type = 1;
+           break;
+         case IDC_CURVERT:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED)
+               cfg.cursor_type = 2;
+           break;
           case IDC_BLINKCUR:
             if (HIWORD(wParam) == BN_CLICKED ||
                 HIWORD(wParam) == BN_DOUBLECLICKED)
@@ -1491,8 +1583,9 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
            }
            break;
          case IDC_TSEDIT:
+         case IDC_R_TSEDIT:
            if (HIWORD(wParam) == EN_CHANGE)
-               GetDlgItemText (hwnd, IDC_TSEDIT, cfg.termspeed,
+               GetDlgItemText (hwnd, LOWORD(wParam), cfg.termspeed,
                                sizeof(cfg.termspeed)-1);
            break;
          case IDC_LOGEDIT:
@@ -1500,6 +1593,11 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                GetDlgItemText (hwnd, IDC_LOGEDIT, cfg.username,
                                sizeof(cfg.username)-1);
            break;
+         case IDC_RLLUSEREDIT:
+           if (HIWORD(wParam) == EN_CHANGE)
+               GetDlgItemText (hwnd, IDC_RLLUSEREDIT, cfg.localusername,
+                               sizeof(cfg.localusername)-1);
+           break;
          case IDC_EMBSD:
          case IDC_EMRFC:
            cfg.rfc_environ = IsDlgButtonChecked (hwnd, IDC_EMRFC);
@@ -1778,6 +1876,16 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
                 IsDlgButtonChecked (hwnd, IDC_VTOEMONLY) ? VT_OEMONLY :
                 VT_POORMAN);
            break;
+         case IDC_X11_FORWARD:
+           if (HIWORD(wParam) == BN_CLICKED ||
+               HIWORD(wParam) == BN_DOUBLECLICKED)
+               cfg.x11_forward = IsDlgButtonChecked (hwnd, IDC_X11_FORWARD);
+           break;
+          case IDC_X11_DISPLAY:
+            if (HIWORD(wParam) == EN_CHANGE)
+                GetDlgItemText (hwnd, IDC_X11_DISPLAY, cfg.x11_display,
+                                sizeof(cfg.x11_display)-1);
+            break;
        }
        return 0;
       case WM_CLOSE: