]> code.delx.au - gnu-emacs/blobdiff - src/term.c
(parse_menu_item) [HAVE_NS]: treat new event like NON_ASCII_KEYSTROKE_EVENT, but...
[gnu-emacs] / src / term.c
index d092cfa24b1138242401e012dbc7ed7f18b30cb8..3fbc3c46c4ddb0e743d5dde775ae949d5744d8ae 100644 (file)
@@ -1,6 +1,6 @@
 /* Terminal control module for terminals described by TERMCAP
    Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1998, 2000, 2001,
-                 2002, 2003, 2004, 2005, 2006, 2007, 2008
+                 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
                  Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -604,7 +604,7 @@ encode_terminal_code (src, src_len, coding)
          if (src->u.cmp.automatic)
            {
              gstring = composition_gstring_from_id (src->u.cmp.id);
-             required = src->u.cmp.to - src->u.cmp.from;
+             required = src->u.cmp.to + 1 - src->u.cmp.from;
            }
          else
            {
@@ -621,13 +621,13 @@ encode_terminal_code (src, src_len, coding)
            }
 
          if (src->u.cmp.automatic)
-           for (i = src->u.cmp.from; i < src->u.cmp.to; i++)
+           for (i = src->u.cmp.from; i <= src->u.cmp.to; i++)
              {
                Lisp_Object g = LGSTRING_GLYPH (gstring, i);
                int c = LGLYPH_CHAR (g);
 
                if (! char_charset (c, charset_list, NULL))
-                 break;
+                 c = '?';
                buf += CHAR_STRING (c, buf);
                nchars++;
              }
@@ -636,17 +636,23 @@ encode_terminal_code (src, src_len, coding)
              {
                int c = COMPOSITION_GLYPH (cmp, i);
 
-               if (! char_charset (c, charset_list, NULL))
-                 break;
+               if (c == '\t')
+                 continue;
+               if (char_charset (c, charset_list, NULL))
+                 {
+                   if (CHAR_WIDTH (c) == 0
+                       && i > 0 && COMPOSITION_GLYPH (cmp, i - 1) == '\t')
+                     /* Should be left-padded */
+                     {
+                       buf += CHAR_STRING (' ', buf);
+                       nchars++;
+                     }
+                 }
+               else
+                 c = '?';
                buf += CHAR_STRING (c, buf);
                nchars++;
              }
-         if (i == 0)
-           {
-             /* The first character of the composition is not encodable.  */
-             *buf++ = '?';
-             nchars++;
-           }
        }
       /* We must skip glyphs to be padded for a wide character.  */
       else if (! CHAR_GLYPH_PADDING_P (*src))
@@ -1782,7 +1788,7 @@ append_composite_glyph (it)
          glyph->u.cmp.automatic = 1;
          glyph->u.cmp.id = it->cmp_it.id;
          glyph->u.cmp.from = it->cmp_it.from;
-         glyph->u.cmp.to = it->cmp_it.to;
+         glyph->u.cmp.to = it->cmp_it.to - 1;
        }
 
       glyph->face_id = it->face_id;
@@ -1811,8 +1817,7 @@ produce_composite_glyph (it)
     {
       struct composition *cmp = composition_table[it->cmp_it.id];
 
-      c = COMPOSITION_GLYPH (cmp, 0);
-      it->pixel_width = CHAR_WIDTH (it->c);
+      it->pixel_width = cmp->width;
     }
   else
     {
@@ -2470,7 +2475,19 @@ the currently selected frame. */)
 #endif
 
       if (FRAMEP (t->display_info.tty->top_frame))
-        FRAME_SET_VISIBLE (XFRAME (t->display_info.tty->top_frame), 1);
+       {
+         struct frame *f = XFRAME (t->display_info.tty->top_frame);
+         int width, height;
+         int old_height = FRAME_COLS (f);
+         int old_width = FRAME_LINES (f);
+
+         /* Check if terminal/window size has changed while the frame
+            was suspended.  */
+         get_tty_size (fileno (t->display_info.tty->input), &width, &height);
+         if (width != old_width || height != old_height)
+           change_frame_size (f, height, width, 0, 0, 0);
+         FRAME_SET_VISIBLE (XFRAME (t->display_info.tty->top_frame), 1);
+       }
 
       init_sys_modes (t->display_info.tty);