Change the term_mouse interface a little so that it gets passed
[u/mdw/putty] / window.c
index 8696fe4..74bfc40 100644 (file)
--- a/window.c
+++ b/window.c
@@ -78,6 +78,7 @@
 #define WHEEL_DELTA 120
 #endif
 
+static Mouse_Button translate_button(void *frontend, Mouse_Button button);
 static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
                        unsigned char *output);
@@ -120,6 +121,7 @@ static void *ldisc;
 static Backend *back;
 static void *backhandle;
 
+static struct unicode_data ucsdata;
 static int session_closed;
 
 Config cfg;                           /* exported to windlg.c */
@@ -271,8 +273,17 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
        char *p;
        int got_host = 0;
 
-       default_protocol = DEFAULT_PROTOCOL;
-       default_port = DEFAULT_PORT;
+       default_protocol = be_default_protocol;
+       /* Find the appropriate default port. */
+       {
+           int i;
+           default_port = 0; /* illegal */
+           for (i = 0; backends[i].backend != NULL; i++)
+               if (backends[i].protocol == default_protocol) {
+                   default_port = backends[i].backend->default_port;
+                   break;
+               }
+       }
        cfg.logtype = LGTYP_NONE;
 
        do_defaults(NULL, &cfg);
@@ -508,7 +519,9 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
 
     hwnd = NULL;
 
-    term = term_init(&cfg, NULL);
+    memset(&ucsdata, 0, sizeof(ucsdata));
+
+    term = term_init(&cfg, &ucsdata, NULL);
     logctx = log_init(NULL, &cfg);
     term_provide_logctx(term, logctx);
 
@@ -903,7 +916,8 @@ void connection_fatal(void *frontend, char *fmt, ...)
        PostQuitMessage(1);
     else {
        session_closed = TRUE;
-       SetWindowText(hwnd, "PuTTY (inactive)");
+       set_icon(NULL, "PuTTY (inactive)");
+       set_title(NULL, "PuTTY (inactive)");
     }
 }
 
@@ -947,7 +961,8 @@ static void enact_pending_netevent(void)
            cfg.close_on_exit == COE_NORMAL) PostQuitMessage(0);
        else {
            session_closed = TRUE;
-           SetWindowText(hwnd, "PuTTY (inactive)");
+           set_icon(NULL, "PuTTY (inactive)");
+           set_title(NULL, "PuTTY (inactive)");
            MessageBox(hwnd, "Connection closed by remote host",
                       "PuTTY", MB_OK | MB_ICONINFORMATION);
        }
@@ -1112,16 +1127,15 @@ static void init_fonts(int pick_width, int pick_height)
 
        /* !!! Yes the next line is right */
        if (cset == OEM_CHARSET)
-           font_codepage = GetOEMCP();
+           ucsdata.font_codepage = GetOEMCP();
        else
-           if (TranslateCharsetInfo
-               ((DWORD *) cset, &info, TCI_SRCCHARSET)) font_codepage =
-               info.ciACP;
+           if (TranslateCharsetInfo ((DWORD *) cset, &info, TCI_SRCCHARSET))
+               ucsdata.font_codepage = info.ciACP;
        else
-           font_codepage = -1;
+           ucsdata.font_codepage = -1;
 
-       GetCPInfo(font_codepage, &cpinfo);
-       dbcs_screenfont = (cpinfo.MaxCharSize > 1);
+       GetCPInfo(ucsdata.font_codepage, &cpinfo);
+       ucsdata.dbcs_screenfont = (cpinfo.MaxCharSize > 1);
     }
 
     f(FONT_UNDERLINE, cfg.fontcharset, fw_dontcare, TRUE);
@@ -1209,7 +1223,7 @@ static void init_fonts(int pick_width, int pick_height)
     }
     fontflag[0] = fontflag[1] = fontflag[2] = 1;
 
-    init_ucs(&cfg);
+    init_ucs(&cfg, &ucsdata);
 }
 
 static void another_font(int fontno)
@@ -1547,7 +1561,8 @@ static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt)
 
     if (send_raw_mouse && !(cfg.mouse_override && shift)) {
        lastbtn = MBT_NOTHING;
-       term_mouse(term, b, MA_CLICK, x, y, shift, ctrl, alt);
+       term_mouse(term, b, translate_button(b), MA_CLICK,
+                  x, y, shift, ctrl, alt);
        return;
     }
 
@@ -1560,7 +1575,8 @@ static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt)
        lastact = MA_CLICK;
     }
     if (lastact != MA_NOTHING)
-       term_mouse(term, b, lastact, x, y, shift, ctrl, alt);
+       term_mouse(term, b, translate_button(b), lastact,
+                  x, y, shift, ctrl, alt);
     lasttime = thistime;
 }
 
@@ -1568,7 +1584,7 @@ static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt)
  * Translate a raw mouse button designation (LEFT, MIDDLE, RIGHT)
  * into a cooked one (SELECT, EXTEND, PASTE).
  */
-Mouse_Button translate_button(void *frontend, Mouse_Button button)
+static Mouse_Button translate_button(void *frontend, Mouse_Button button)
 {
     if (button == MBT_LEFT)
        return MBT_SELECT;
@@ -2039,7 +2055,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                      is_alt_pressed());
                SetCapture(hwnd);
            } else {
-               term_mouse(term, button, MA_RELEASE,
+               term_mouse(term, button, translate_button(button), MA_RELEASE,
                           TO_CHR_X(X_POS(lParam)),
                           TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
                           wParam & MK_CONTROL, is_alt_pressed());
@@ -2064,7 +2080,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                b = MBT_MIDDLE;
            else
                b = MBT_RIGHT;
-           term_mouse(term, b, MA_DRAG, TO_CHR_X(X_POS(lParam)),
+           term_mouse(term, b, translate_button(b), MA_DRAG,
+                      TO_CHR_X(X_POS(lParam)),
                       TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
                       wParam & MK_CONTROL, is_alt_pressed());
        }
@@ -2599,12 +2616,13 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
                if (send_raw_mouse &&
                    !(cfg.mouse_override && shift_pressed)) {
                    /* send a mouse-down followed by a mouse up */
-                   term_mouse(term, b,
+                   term_mouse(term, b, translate_button(b),
                               MA_CLICK,
                               TO_CHR_X(X_POS(lParam)),
                               TO_CHR_Y(Y_POS(lParam)), shift_pressed,
                               control_pressed, is_alt_pressed());
-                   term_mouse(term, b, MA_RELEASE, TO_CHR_X(X_POS(lParam)),
+                   term_mouse(term, b, translate_button(b),
+                              MA_RELEASE, TO_CHR_X(X_POS(lParam)),
                               TO_CHR_Y(Y_POS(lParam)), shift_pressed,
                               control_pressed, is_alt_pressed());
                } else {
@@ -2760,8 +2778,8 @@ void do_text(Context ctx, int x, int y, char *text, int len,
            if (lattr == LATTR_TOP || lattr == LATTR_BOT)
                text_adjust *= 2;
            attr &= ~CSET_MASK;
-           text[0] = (char) (unitab_xterm['q'] & CHAR_MASK);
-           attr |= (unitab_xterm['q'] & CSET_MASK);
+           text[0] = (char) (ucsdata.unitab_xterm['q'] & CHAR_MASK);
+           attr |= (ucsdata.unitab_xterm['q'] & CSET_MASK);
            if (attr & ATTR_UNDER) {
                attr &= ~ATTR_UNDER;
                force_manual_underline = 1;
@@ -2822,7 +2840,7 @@ void do_text(Context ctx, int x, int y, char *text, int len,
        line_box.right = font_width*term->cols+offset_width;
 
     /* We're using a private area for direct to font. (512 chars.) */
-    if (dbcs_screenfont && (attr & CSET_MASK) == ATTR_ACP) {
+    if (ucsdata.dbcs_screenfont && (attr & CSET_MASK) == ATTR_ACP) {
        /* Ho Hum, dbcs fonts are a PITA! */
        /* To display on W9x I have to convert to UCS */
        static wchar_t *uni_buf = 0;
@@ -2835,15 +2853,15 @@ void do_text(Context ctx, int x, int y, char *text, int len,
 
        for(nlen = mptr = 0; mptr<len; mptr++) {
            uni_buf[nlen] = 0xFFFD;
-           if (IsDBCSLeadByteEx(font_codepage, (BYTE) text[mptr])) {
+           if (IsDBCSLeadByteEx(ucsdata.font_codepage, (BYTE) text[mptr])) {
                IpDx[nlen] += char_width;
-               MultiByteToWideChar(font_codepage, MB_USEGLYPHCHARS,
+               MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
                                   text+mptr, 2, uni_buf+nlen, 1);
                mptr++;
            }
            else
            {
-               MultiByteToWideChar(font_codepage, MB_USEGLYPHCHARS,
+               MultiByteToWideChar(ucsdata.font_codepage, MB_USEGLYPHCHARS,
                                   text+mptr, 1, uni_buf+nlen, 1);
            }
            nlen++;
@@ -3012,17 +3030,17 @@ int char_width(Context ctx, int uc) {
 
     switch (uc & CSET_MASK) {
       case ATTR_ASCII:
-       uc = unitab_line[uc & 0xFF];
+       uc = ucsdata.unitab_line[uc & 0xFF];
        break;
       case ATTR_LINEDRW:
-       uc = unitab_xterm[uc & 0xFF];
+       uc = ucsdata.unitab_xterm[uc & 0xFF];
        break;
       case ATTR_SCOACS:
-       uc = unitab_scoacs[uc & 0xFF];
+       uc = ucsdata.unitab_scoacs[uc & 0xFF];
        break;
     }
     if (DIRECT_FONT(uc)) {
-       if (dbcs_screenfont) return 1;
+       if (ucsdata.dbcs_screenfont) return 1;
 
        /* Speedup, I know of no font where ascii is the wrong width */
        if ((uc&CHAR_MASK) >= ' ' && (uc&CHAR_MASK)<= '~') 
@@ -3290,10 +3308,18 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
            SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0);
            return 0;
        }
+       if (wParam == VK_PRIOR && shift_state == 2) {
+           SendMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
+           return 0;
+       }
        if (wParam == VK_NEXT && shift_state == 1) {
            SendMessage(hwnd, WM_VSCROLL, SB_PAGEDOWN, 0);
            return 0;
        }
+       if (wParam == VK_NEXT && shift_state == 2) {
+           SendMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
+           return 0;
+       }
        if (wParam == VK_INSERT && shift_state == 1) {
            term_do_paste(term);
            return 0;
@@ -3759,7 +3785,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
 #ifdef SHOW_TOASCII_RESULT
        if (r == 1 && !key_down) {
            if (alt_sum) {
-               if (in_utf(term) || dbcs_screenfont)
+               if (in_utf(term) || ucsdata.dbcs_screenfont)
                    debug((", (U+%04x)", alt_sum));
                else
                    debug((", LCH(%d)", alt_sum));
@@ -3812,7 +3838,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
 
                if (!key_down) {
                    if (alt_sum) {
-                       if (in_utf(term) || dbcs_screenfont) {
+                       if (in_utf(term) || ucsdata.dbcs_screenfont) {
                            keybuf = alt_sum;
                            term_seen_key_event(term);
                            luni_send(ldisc, &keybuf, 1, 1);
@@ -3862,7 +3888,7 @@ static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
        if (!left_alt)
            keys[0] = 0;
        /* If we will be using alt_sum fix the 256s */
-       else if (keys[0] && (in_utf(term) || dbcs_screenfont))
+       else if (keys[0] && (in_utf(term) || ucsdata.dbcs_screenfont))
            keys[0] = 10;
     }