Change the term_mouse interface a little so that it gets passed
[u/mdw/putty] / terminal.c
index ba5e14e..87085c6 100644 (file)
@@ -337,7 +337,8 @@ void term_clrsb(Terminal *term)
 /*
  * Initialise the terminal.
  */
-Terminal *term_init(Config *mycfg, void *frontend)
+Terminal *term_init(Config *mycfg, struct unicode_data *ucsdata,
+                   void *frontend)
 {
     Terminal *term;
 
@@ -347,6 +348,7 @@ Terminal *term_init(Config *mycfg, void *frontend)
      */
     term = smalloc(sizeof(Terminal));
     term->frontend = frontend;
+    term->ucsdata = ucsdata;
     term->cfg = *mycfg;                       /* STRUCTURE COPY */
     term->logctx = NULL;
     term->compatibility_level = TM_PUTTY;
@@ -389,6 +391,34 @@ Terminal *term_init(Config *mycfg, void *frontend)
     return term;
 }
 
+void term_free(Terminal *term)
+{
+    unsigned long *line;
+    struct beeptime *beep;
+
+    while ((line = delpos234(term->scrollback, 0)) != NULL)
+       sfree(line);
+    freetree234(term->scrollback);
+    while ((line = delpos234(term->screen, 0)) != NULL)
+       sfree(line);
+    freetree234(term->screen);
+    while ((line = delpos234(term->alt_screen, 0)) != NULL)
+       sfree(line);
+    freetree234(term->alt_screen);
+    sfree(term->disptext);
+    while (term->beephead) {
+       beep = term->beephead;
+       term->beephead = beep->next;
+       sfree(beep);
+    }
+    bufchain_clear(&term->inbuf);
+    if(term->print_job)
+       printer_finish_job(term->print_job);
+    bufchain_clear(&term->printer_buf);
+    sfree(term->paste_buffer);
+    sfree(term);
+}
+
 /*
  * Set up the terminal for a given size.
  */
@@ -1274,8 +1304,8 @@ void term_out(Terminal *term)
                  case 0:
                    if (c < 0x80) {
                        /* UTF-8 must be stateless so we ignore iso2022. */
-                       if (unitab_ctrl[c] != 0xFF) 
-                            c = unitab_ctrl[c];
+                       if (term->ucsdata->unitab_ctrl[c] != 0xFF) 
+                            c = term->ucsdata->unitab_ctrl[c];
                        else c = ((unsigned char)c) | ATTR_ASCII;
                        break;
                    } else if ((c & 0xe0) == 0xc0) {
@@ -1372,8 +1402,8 @@ void term_out(Terminal *term)
                     * the same encoding.
                     */
                  case ATTR_LINEDRW:
-                   if (unitab_ctrl[c] != 0xFF)
-                       c = unitab_ctrl[c];
+                   if (term->ucsdata->unitab_ctrl[c] != 0xFF)
+                       c = term->ucsdata->unitab_ctrl[c];
                    else
                        c = ((unsigned char) c) | ATTR_LINEDRW;
                    break;
@@ -1385,8 +1415,8 @@ void term_out(Terminal *term)
                        break;
                    }
                  /*FALLTHROUGH*/ case ATTR_ASCII:
-                   if (unitab_ctrl[c] != 0xFF)
-                       c = unitab_ctrl[c];
+                   if (term->ucsdata->unitab_ctrl[c] != 0xFF)
+                       c = term->ucsdata->unitab_ctrl[c];
                    else
                        c = ((unsigned char) c) | ATTR_ASCII;
                    break;
@@ -3115,13 +3145,13 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
            tattr = (*d & (ATTR_MASK ^ CSET_MASK));
            switch (tchar & CSET_MASK) {
              case ATTR_ASCII:
-               tchar = unitab_line[tchar & 0xFF];
+               tchar = term->ucsdata->unitab_line[tchar & 0xFF];
                break;
              case ATTR_LINEDRW:
-               tchar = unitab_xterm[tchar & 0xFF];
+               tchar = term->ucsdata->unitab_xterm[tchar & 0xFF];
                break;
              case ATTR_SCOACS:  
-               tchar = unitab_scoacs[tchar&0xFF]; 
+               tchar = term->ucsdata->unitab_scoacs[tchar&0xFF]; 
                break;
            }
            tattr |= (tchar & CSET_MASK);
@@ -3179,7 +3209,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
            if ((attr & CSET_MASK) == 0x2300 && tchar >= 0xBA
                && tchar <= 0xBD) break_run = TRUE;
 
-           if (!dbcs_screenfont && !dirty_line) {
+           if (!term->ucsdata->dbcs_screenfont && !dirty_line) {
                if ((tchar | tattr) == term->disptext[idx])
                    break_run = TRUE;
                else if (!dirty_run && ccount == 1)
@@ -3194,7 +3224,7 @@ static void do_paint(Terminal *term, Context ctx, int may_optimise)
                start = j;
                ccount = 0;
                attr = tattr;
-               if (dbcs_screenfont)
+               if (term->ucsdata->dbcs_screenfont)
                    last_run_dirty = dirty_run;
                dirty_run = dirty_line;
            }
@@ -3414,22 +3444,22 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect)
            switch (uc & CSET_MASK) {
              case ATTR_LINEDRW:
                if (!term->cfg.rawcnp) {
-                   uc = unitab_xterm[uc & 0xFF];
+                   uc = term->ucsdata->unitab_xterm[uc & 0xFF];
                    break;
                }
              case ATTR_ASCII:
-               uc = unitab_line[uc & 0xFF];
+               uc = term->ucsdata->unitab_line[uc & 0xFF];
                break;
              case ATTR_SCOACS:  
-               uc = unitab_scoacs[uc&0xFF]; 
+               uc = term->ucsdata->unitab_scoacs[uc&0xFF]; 
                break;
            }
            switch (uc & CSET_MASK) {
              case ATTR_ACP:
-               uc = unitab_font[uc & 0xFF];
+               uc = term->ucsdata->unitab_font[uc & 0xFF];
                break;
              case ATTR_OEMCP:
-               uc = unitab_oemcp[uc & 0xFF];
+               uc = term->ucsdata->unitab_oemcp[uc & 0xFF];
                break;
            }
 
@@ -3443,14 +3473,14 @@ static void clipme(Terminal *term, pos top, pos bottom, int rect)
                    char buf[4];
                    WCHAR wbuf[4];
                    int rv;
-                   if (is_dbcs_leadbyte(font_codepage, (BYTE) c)) {
+                   if (is_dbcs_leadbyte(term->ucsdata->font_codepage, (BYTE) c)) {
                        buf[0] = c;
                        buf[1] = (char) (0xFF & ldata[top.x + 1]);
-                       rv = mb_to_wc(font_codepage, 0, buf, 2, wbuf, 4);
+                       rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 2, wbuf, 4);
                        top.x++;
                    } else {
                        buf[0] = c;
-                       rv = mb_to_wc(font_codepage, 0, buf, 1, wbuf, 4);
+                       rv = mb_to_wc(term->ucsdata->font_codepage, 0, buf, 1, wbuf, 4);
                    }
 
                    if (rv > 0) {
@@ -3580,28 +3610,29 @@ static int wordtype(Terminal *term, int uc)
 
     switch (uc & CSET_MASK) {
       case ATTR_LINEDRW:
-       uc = unitab_xterm[uc & 0xFF];
+       uc = term->ucsdata->unitab_xterm[uc & 0xFF];
        break;
       case ATTR_ASCII:
-       uc = unitab_line[uc & 0xFF];
+       uc = term->ucsdata->unitab_line[uc & 0xFF];
        break;
       case ATTR_SCOACS:  
-       uc = unitab_scoacs[uc&0xFF]; 
+       uc = term->ucsdata->unitab_scoacs[uc&0xFF]; 
        break;
     }
     switch (uc & CSET_MASK) {
       case ATTR_ACP:
-       uc = unitab_font[uc & 0xFF];
+       uc = term->ucsdata->unitab_font[uc & 0xFF];
        break;
       case ATTR_OEMCP:
-       uc = unitab_oemcp[uc & 0xFF];
+       uc = term->ucsdata->unitab_oemcp[uc & 0xFF];
        break;
     }
 
     /* For DBCS font's I can't do anything usefull. Even this will sometimes
      * fail as there's such a thing as a double width space. :-(
      */
-    if (dbcs_screenfont && font_codepage == line_codepage)
+    if (term->ucsdata->dbcs_screenfont &&
+       term->ucsdata->font_codepage == term->ucsdata->line_codepage)
        return (uc != ' ');
 
     if (uc < 0x80)
@@ -3771,8 +3802,8 @@ void term_do_paste(Terminal *term)
     get_clip(term->frontend, NULL, NULL);
 }
 
-void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
-               int shift, int ctrl, int alt)
+void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
+               Mouse_Action a, int x, int y, int shift, int ctrl, int alt)
 {
     pos selpoint;
     unsigned long *ldata;
@@ -3813,7 +3844,7 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
 
        if (term->ldisc) {
 
-           switch (b) {
+           switch (braw) {
              case MBT_LEFT:
                encstate = 0x20;               /* left button down */
                break;
@@ -3842,9 +3873,9 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
                term->mouse_is_down = 0;
                break;
              case MA_CLICK:
-               if (term->mouse_is_down == b)
+               if (term->mouse_is_down == braw)
                    return;
-               term->mouse_is_down = b;
+               term->mouse_is_down = braw;
                break;
              default: break;          /* placate gcc warning about enum use */
            }
@@ -3861,8 +3892,6 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
        return;
     }
 
-    b = translate_button(term->frontend, b);
-
     /*
      * Set the selection type (rectangular or normal) at the start
      * of a selection attempt, from the state of Alt.
@@ -3876,13 +3905,13 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
        term->seltype = default_seltype;
     }
 
-    if (b == MBT_SELECT && a == MA_CLICK) {
+    if (bcooked == MBT_SELECT && a == MA_CLICK) {
        deselect(term);
        term->selstate = ABOUT_TO;
        term->seltype = default_seltype;
        term->selanchor = selpoint;
        term->selmode = SM_CHAR;
-    } else if (b == MBT_SELECT && (a == MA_2CLK || a == MA_3CLK)) {
+    } else if (bcooked == MBT_SELECT && (a == MA_2CLK || a == MA_3CLK)) {
        deselect(term);
        term->selmode = (a == MA_2CLK ? SM_WORD : SM_LINE);
        term->selstate = DRAGGING;
@@ -3890,11 +3919,12 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
        term->selend = term->selstart;
        incpos(term->selend);
        sel_spread(term);
-    } else if ((b == MBT_SELECT && a == MA_DRAG) ||
-              (b == MBT_EXTEND && a != MA_RELEASE)) {
+    } else if ((bcooked == MBT_SELECT && a == MA_DRAG) ||
+              (bcooked == MBT_EXTEND && a != MA_RELEASE)) {
        if (term->selstate == ABOUT_TO && poseq(term->selanchor, selpoint))
            return;
-       if (b == MBT_EXTEND && a != MA_DRAG && term->selstate == SELECTED) {
+       if (bcooked == MBT_EXTEND && a != MA_DRAG &&
+           term->selstate == SELECTED) {
            if (term->seltype == LEXICOGRAPHIC) {
                /*
                 * For normal selection, we extend by moving
@@ -3955,7 +3985,8 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
            term->selend.y =   max(term->selanchor.y, selpoint.y);
        }
        sel_spread(term);
-    } else if ((b == MBT_SELECT || b == MBT_EXTEND) && a == MA_RELEASE) {
+    } else if ((bcooked == MBT_SELECT || bcooked == MBT_EXTEND) &&
+              a == MA_RELEASE) {
        if (term->selstate == DRAGGING) {
            /*
             * We've completed a selection. We now transfer the
@@ -3966,7 +3997,7 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
            term->selstate = SELECTED;
        } else
            term->selstate = NO_SELECTION;
-    } else if (b == MBT_PASTE
+    } else if (bcooked == MBT_PASTE
               && (a == MA_CLICK
 #if MULTICLICK_ONLY_EVENT
                   || a == MA_2CLK || a == MA_3CLK