home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1136 < prev    next >
Internet Message Format  |  1990-12-28  |  34KB

  1. From: howard@hasse.ericsson.se (Howard Gayle)
  2. Newsgroups: alt.sources
  3. Subject: GNU Emacs 8-bit mods part 09 of 12
  4. Message-ID: <1990Apr5.134111.9195@ericsson.se>
  5. Date: 5 Apr 90 13:41:11 GMT
  6.  
  7. *** ../18.55/src/xdisp.c    Wed Apr 26 22:13:59 1989
  8. --- src/xdisp.c    Thu Apr  5 09:17:31 1990
  9. ***************
  10. *** 1,5 ****
  11.   /* Display generation from window structure and buffer text.
  12. !    Copyright (C) 1985, 1986, 1987, 1988 Free Software Foundation, Inc.
  13.   
  14.   This file is part of GNU Emacs.
  15.   
  16. --- 1,5 ----
  17.   /* Display generation from window structure and buffer text.
  18. !    Copyright (C) 1985, 1986, 1987, 1988, 1990 Free Software Foundation, Inc.
  19.   
  20.   This file is part of GNU Emacs.
  21.   
  22. ***************
  23. *** 19,29 ****
  24. --- 19,34 ----
  25.   and this notice must be preserved on all copies.  */
  26.   
  27.   
  28. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  29. +  *  See chartab.c for details. */
  30.   #include "config.h"
  31.   #include <stdio.h>
  32.   /*#include <ctype.h>*/
  33.   #undef NULL
  34.   #include "lisp.h"
  35. + #include "chartab.h"
  36.   #include "window.h"
  37.   #include "termchar.h"
  38.   #include "dispextern.h"
  39. ***************
  40. *** 349,357 ****
  41.             && end_unchanged >= tlendpos
  42.             && bf_s2 >= tlendpos)))
  43.       {
  44. !       if (tlbufpos > FirstCharacter && CharAt (tlbufpos - 1) != '\n'
  45.         && (tlbufpos == NumCharacters + 1
  46. !           || CharAt (tlbufpos) == '\n'))
  47.       /* Former continuation line has disappeared by becoming empty */
  48.       goto cancel;
  49.         else if (XFASTINT (w->last_modified) < bf_modified
  50. --- 354,362 ----
  51.             && end_unchanged >= tlendpos
  52.             && bf_s2 >= tlendpos)))
  53.       {
  54. !       if (tlbufpos > FirstCharacter && CharAt (tlbufpos - 1) != NEWLINE
  55.         && (tlbufpos == NumCharacters + 1
  56. !           || CharAt (tlbufpos) == NEWLINE))
  57.       /* Former continuation line has disappeared by becoming empty */
  58.       goto cancel;
  59.         else if (XFASTINT (w->last_modified) < bf_modified
  60. ***************
  61. *** 689,695 ****
  62.        but no longer is, find a new starting point.  */
  63.     else if (!NULL (w->start_at_line_beg)
  64.          && !(startp == FirstCharacter
  65. !         || CharAt (startp - 1) == '\n'))
  66.       {
  67.         goto recenter;
  68.       }
  69. --- 694,700 ----
  70.        but no longer is, find a new starting point.  */
  71.     else if (!NULL (w->start_at_line_beg)
  72.          && !(startp == FirstCharacter
  73. !         || CharAt (startp - 1) == NEWLINE))
  74.       {
  75.         goto recenter;
  76.       }
  77. ***************
  78. *** 764,770 ****
  79.   
  80.     startp = marker_position (w->start);
  81.     w->start_at_line_beg = 
  82. !     (startp == FirstCharacter || CharAt (startp - 1) == '\n') ? Qt : Qnil;
  83.   
  84.   done:
  85.     /* If window not full width, must redo its mode line
  86. --- 769,775 ----
  87.   
  88.     startp = marker_position (w->start);
  89.     w->start_at_line_beg = 
  90. !     (startp == FirstCharacter || CharAt (startp - 1) == NEWLINE) ? Qt : Qnil;
  91.   
  92.   done:
  93.     /* If window not full width, must redo its mode line
  94. ***************
  95. *** 811,817 ****
  96.         if (pos != val.bufpos)
  97.       last_text_vpos
  98.         /* Next line, unless prev line ended in end of buffer with no cr */
  99. !       = vpos - (val.vpos && CharAt (val.bufpos - 1) != '\n');
  100.         pos = val.bufpos;
  101.       }
  102.   
  103. --- 816,822 ----
  104.         if (pos != val.bufpos)
  105.       last_text_vpos
  106.         /* Next line, unless prev line ended in end of buffer with no cr */
  107. !       = vpos - (val.vpos && CharAt (val.bufpos - 1) != NEWLINE);
  108.         pos = val.bufpos;
  109.       }
  110.   
  111. ***************
  112. *** 930,936 ****
  113.        newline before it, so the following line must be redrawn. */
  114.     if (stop_vpos == ep.vpos
  115.         && (ep.bufpos == FirstCharacter
  116. !       || CharAt (ep.bufpos - 1) != '\n'
  117.         || ep.bufpos == bf_s1 + bf_s2 + 1 - end_unchanged))
  118.       stop_vpos = ep.vpos + 1;
  119.   
  120. --- 935,941 ----
  121.        newline before it, so the following line must be redrawn. */
  122.     if (stop_vpos == ep.vpos
  123.         && (ep.bufpos == FirstCharacter
  124. !       || CharAt (ep.bufpos - 1) != NEWLINE
  125.         || ep.bufpos == bf_s1 + bf_s2 + 1 - end_unchanged))
  126.       stop_vpos = ep.vpos + 1;
  127.   
  128. ***************
  129. *** 952,958 ****
  130.         for (i = ep.bufpos; i < xp.bufpos; i++)
  131.       {
  132.         tem = CharAt (i);
  133. !       if (tem != ' ' && tem != '\n' && tem != '\t')
  134.           break;
  135.       }
  136.         if (i == xp.bufpos)
  137. --- 957,963 ----
  138.         for (i = ep.bufpos; i < xp.bufpos; i++)
  139.       {
  140.         tem = CharAt (i);
  141. !       if (tem != SPACE && tem != NEWLINE && tem != HTAB)
  142.           break;
  143.       }
  144.         if (i == xp.bufpos)
  145. ***************
  146. *** 1063,1069 ****
  147.         if (pos != val.bufpos)
  148.       last_text_vpos
  149.         /* Next line, unless prev line ended in end of buffer with no cr */
  150. !         = vpos - (val.vpos && CharAt (val.bufpos - 1) != '\n');
  151.         pos = val.bufpos;
  152.       }
  153.   
  154. --- 1068,1074 ----
  155.         if (pos != val.bufpos)
  156.       last_text_vpos
  157.         /* Next line, unless prev line ended in end of buffer with no cr */
  158. !         = vpos - (val.vpos && CharAt (val.bufpos - 1) != NEWLINE);
  159.         pos = val.bufpos;
  160.       }
  161.   
  162. ***************
  163. *** 1167,1172 ****
  164. --- 1172,1194 ----
  165.     return 1;
  166.   }
  167.   
  168. + glyf_t *copy_rope (t, s, r)
  169. + register glyf_t *t; /* Copy to here. */
  170. + register glyf_t *s; /* Starting point. */
  171. + register rope_t *r; /* Copy from here. */
  172. + {
  173. + register int     n = r->r_len;   /* Number of glyfs in rope. */
  174. + register glyf_t *f = r->r_glyfs; /* Step through glyfs in rope. */
  175. + while (n--)
  176. +    {
  177. +    if (t >= s) *t = *f;
  178. +    ++t;
  179. +    ++f;
  180. +    }
  181. + return (t);
  182. + }
  183.   /* Display one line of window w, starting at position `start' in w's buffer.
  184.    Display starting at horizontal position `hpos',
  185.     which is normally zero or negative.
  186. ***************
  187. *** 1193,1209 ****
  188.        int taboffset;
  189.   {
  190.     register int pos = start;
  191. !   register int c;
  192. !   register char *p1;
  193.     int end;
  194.     register int pause;
  195. !   register unsigned char *p;
  196. !   char *endp;
  197. !   register char *startp;
  198. !   register char *p1prev;
  199.     register struct display_line *line;
  200.     int tab_width = XINT (bf_cur->tab_width);
  201. -   int ctl_arrow = !NULL (bf_cur->ctl_arrow);
  202.     int width = XFASTINT (w->width) - 1
  203.       - (XFASTINT (w->width) + XFASTINT (w->left) != screen_width);
  204.     struct position val;
  205. --- 1215,1230 ----
  206.        int taboffset;
  207.   {
  208.     register int pos = start;
  209. !   register char_t c;
  210. !   register glyf_t *p1;
  211.     int end;
  212.     register int pause;
  213. !   register char_t *p;
  214. !   glyf_t *endp;
  215. !   register glyf_t *startp;
  216. !   register glyf_t *p1prev;
  217.     register struct display_line *line;
  218.     int tab_width = XINT (bf_cur->tab_width);
  219.     int width = XFASTINT (w->width) - 1
  220.       - (XFASTINT (w->width) + XFASTINT (w->left) != screen_width);
  221.     struct position val;
  222. ***************
  223. *** 1218,1224 ****
  224.       = XTYPE (bf_cur->selective_display) == Lisp_Int
  225.         ? XINT (bf_cur->selective_display)
  226.       : !NULL (bf_cur->selective_display) ? -1 : 0;
  227. !   int selective_e = selective && !NULL (bf_cur->selective_display_ellipses);
  228.   
  229.     hpos += XFASTINT (w->left);
  230.     line = get_display_line (vpos, XFASTINT (w->left));
  231. --- 1239,1246 ----
  232.       = XTYPE (bf_cur->selective_display) == Lisp_Int
  233.         ? XINT (bf_cur->selective_display)
  234.       : !NULL (bf_cur->selective_display) ? -1 : 0;
  235. !   register struct Lisp_Chartab *cp = WINDOW_CHAR_TABLE (w);
  236. !   int selective_rlen = selective ? cp->ct_invisr.r_len : 0;
  237.   
  238.     hpos += XFASTINT (w->left);
  239.     line = get_display_line (vpos, XFASTINT (w->left));
  240. ***************
  241. *** 1229,1235 ****
  242.       {
  243.         if (minibuf_prompt)
  244.       hpos = display_string (w, line, minibuf_prompt, hpos,
  245. !                    !truncate ? '\\' : '$', -1, -1);
  246.         minibuf_prompt_width = hpos;
  247.       }
  248.   
  249. --- 1251,1258 ----
  250.       {
  251.         if (minibuf_prompt)
  252.       hpos = display_string (w, line, minibuf_prompt, hpos,
  253. !                    truncate ? cp->ct_truncg : cp->ct_wrapg,
  254. !                    -1, -1);
  255.         minibuf_prompt_width = hpos;
  256.       }
  257.   
  258. ***************
  259. *** 1267,1279 ****
  260.         p = &CharAt (pos);
  261.       }
  262.         c = *p++;
  263. !       if (c >= 040 && c < 0177)
  264. !     {
  265. !       if (p1 >= startp)
  266. !         *p1 = c;
  267. !       p1++;
  268. !     }
  269. !       else if (c == '\n')
  270.       {
  271.         invis = 0;
  272.         while (pos < end
  273. --- 1290,1296 ----
  274.         p = &CharAt (pos);
  275.       }
  276.         c = *p++;
  277. !       if (c == NEWLINE)
  278.       {
  279.         invis = 0;
  280.         while (pos < end
  281. ***************
  282. *** 1282,1348 ****
  283.           {
  284.             invis = 1;
  285.             pos = find_next_newline (pos + 1, 1);
  286. !           if (CharAt (pos - 1) == '\n')
  287.           pos--;
  288.           }
  289. !       if (invis && selective_e)
  290.           {
  291. !           p1 += 4;
  292.             if (p1 - startp > width)
  293.           p1 = endp;
  294. !           strncpy (p1prev, " ...", p1 - p1prev);
  295.           }
  296.         break;
  297.       }
  298. !       else if (c == '\t')
  299.       {
  300.         do
  301.           {
  302.             if (p1 >= startp)
  303. !         *p1 = ' ';
  304.             p1++;
  305.           }
  306.         while ((p1 - startp + taboffset + hscroll - (hscroll > 0))
  307.            % tab_width);
  308.       }
  309. !       else if (c == Ctl('M') && selective == -1)
  310.       {
  311.         pos = find_next_newline (pos, 1);
  312. !       if (CharAt (pos - 1) == '\n')
  313.           pos--;
  314. !       if (selective_e)
  315.           {
  316. !           p1 += 4;
  317.             if (p1 - startp > width)
  318.           p1 = endp;
  319. !           strncpy (p1prev, " ...", p1 - p1prev);
  320.           }
  321.         break;
  322.       }
  323. !       else if (c < 0200 && ctl_arrow)
  324. !     {
  325. !       if (p1 >= startp)
  326. !         *p1 = '^';
  327. !       p1++;
  328. !       if (p1 >= startp)
  329. !         *p1 = c ^ 0100;
  330. !       p1++;
  331. !     }
  332. !       else
  333. !     {
  334. !       if (p1 >= startp)
  335. !         *p1 = '\\';
  336. !       p1++;
  337. !       if (p1 >= startp)
  338. !         *p1 = (c >> 6) + '0';
  339. !       p1++;
  340. !       if (p1 >= startp)
  341. !         *p1 = (7 & (c >> 3)) + '0';
  342. !       p1++;
  343. !       if (p1 >= startp)
  344. !         *p1 = (7 & c) + '0';
  345. !       p1++;
  346. !     }
  347.         pos++;
  348.       }
  349.   
  350. --- 1299,1345 ----
  351.           {
  352.             invis = 1;
  353.             pos = find_next_newline (pos + 1, 1);
  354. !           if (CharAt (pos - 1) == NEWLINE)
  355.           pos--;
  356.           }
  357. !       if (invis && selective_rlen)
  358.           {
  359. !           p1 += selective_rlen;
  360.             if (p1 - startp > width)
  361.           p1 = endp;
  362. !           bcopy (cp->ct_invisr.r_glyfs, p1prev,
  363. !                      (p1 - p1prev) * sizeof (glyf_t));
  364.           }
  365.         break;
  366.       }
  367. !       else if (c == HTAB)
  368.       {
  369.         do
  370.           {
  371.             if (p1 >= startp)
  372. !         *p1 = SPACEGLYF;
  373.             p1++;
  374.           }
  375.         while ((p1 - startp + taboffset + hscroll - (hscroll > 0))
  376.            % tab_width);
  377.       }
  378. !       else if (c == cp->ct_invisc && selective == -1)
  379.       {
  380.         pos = find_next_newline (pos, 1);
  381. !       if (CharAt (pos - 1) == NEWLINE)
  382.           pos--;
  383. !       if (selective_rlen)
  384.           {
  385. !           p1 += selective_rlen;
  386.             if (p1 - startp > width)
  387.           p1 = endp;
  388. !           bcopy (cp->ct_invisr.r_glyfs, p1prev,
  389. !                      (p1 - p1prev) * sizeof (glyf_t));
  390.           }
  391.         break;
  392.       }
  393. !       else
  394. !         p1 = copy_rope (p1, startp, &cp->ct_dispr[c]);
  395.         pos++;
  396.       }
  397.   
  398. ***************
  399. *** 1373,1379 ****
  400.   
  401.     if (pos < NumCharacters + 1)
  402.       {
  403. !       if (CharAt (pos) == '\n')
  404.       /* If stopped due to a newline, start next line after it */
  405.       pos++;
  406.         else
  407. --- 1370,1376 ----
  408.   
  409.     if (pos < NumCharacters + 1)
  410.       {
  411. !       if (CharAt (pos) == NEWLINE)
  412.       /* If stopped due to a newline, start next line after it */
  413.       pos++;
  414.         else
  415. ***************
  416. *** 1381,1387 ****
  417.       {
  418.         if (truncate)
  419.           {
  420. !           *p1++ = '$';
  421.             /* Truncating => start next line after next newline,
  422.            and point is on this line if it is before the newline,
  423.            and skip none of first char of next line */
  424. --- 1378,1384 ----
  425.       {
  426.         if (truncate)
  427.           {
  428. !           *p1++ = cp->ct_truncg;
  429.             /* Truncating => start next line after next newline,
  430.            and point is on this line if it is before the newline,
  431.            and skip none of first char of next line */
  432. ***************
  433. *** 1388,1398 ****
  434.             pos = find_next_newline (pos, 1);
  435.             val.hpos = XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0;
  436.   
  437. !           lastpos = pos - (CharAt (pos - 1) == '\n');
  438.           }
  439.         else
  440.           {
  441. !           *p1++ = '\\';
  442.             val.vpos = 0;
  443.             lastpos--;
  444.           }
  445. --- 1385,1395 ----
  446.             pos = find_next_newline (pos, 1);
  447.             val.hpos = XINT (w->hscroll) ? 1 - XINT (w->hscroll) : 0;
  448.   
  449. !           lastpos = pos - (CharAt (pos - 1) == NEWLINE);
  450.           }
  451.         else
  452.           {
  453. !           *p1++ = cp->ct_wrapg;
  454.             val.vpos = 0;
  455.             lastpos--;
  456.           }
  457. ***************
  458. *** 1436,1442 ****
  459.     /* If hscroll and line not empty, insert truncation-at-left marker */
  460.     if (hscroll && lastpos != start)
  461.       {
  462. !       *startp = '$';
  463.         if (p1 <= startp)
  464.       p1 = startp + 1;
  465.       }
  466. --- 1433,1439 ----
  467.     /* If hscroll and line not empty, insert truncation-at-left marker */
  468.     if (hscroll && lastpos != start)
  469.       {
  470. !       *startp = cp->ct_truncg;
  471.         if (p1 <= startp)
  472.       p1 = startp + 1;
  473.       }
  474. ***************
  475. *** 1445,1452 ****
  476.       {
  477.         endp++;
  478.         if (p1 < startp) p1 = startp;
  479. !       while (p1 < endp) *p1++ = ' ';
  480. !       *p1++ = '|';
  481.       }
  482.     line->length = max (line->length, p1 - line->body);
  483.     line->body[line->length] = 0;
  484. --- 1442,1449 ----
  485.       {
  486.         endp++;
  487.         if (p1 < startp) p1 = startp;
  488. !       while (p1 < endp) *p1++ = SPACEGLYF;
  489. !       *p1++ = cp->ct_frameg;
  490.       }
  491.     line->length = max (line->length, p1 - line->body);
  492.     line->body[line->length] = 0;
  493. ***************
  494. *** 1717,1723 ****
  495.   {
  496.     register char *bp = buf;
  497.     register long len;
  498. !     
  499.     len = strlen (str);
  500.     if (width && width < len)
  501.       {
  502. --- 1714,1720 ----
  503.   {
  504.     register char *bp = buf;
  505.     register long len;
  506.     len = strlen (str);
  507.     if (width && width < len)
  508.       {
  509. ***************
  510. *** 1856,1862 ****
  511.      been obtained by get_display_line (vpos, hpos)
  512.      or in some suitable manner.
  513.   
  514. !   TRUNCATE is character to display at end if truncated.  Zero for none.
  515.   
  516.     MINCOL is the first column ok to end at.  (Pad with spaces to this col.)
  517.     MAXCOL is the last column ok to end at.  Truncate here.
  518. --- 1853,1859 ----
  519.      been obtained by get_display_line (vpos, hpos)
  520.      or in some suitable manner.
  521.   
  522. !   TRUNCATE is glyf to display at end if truncated.  Zero for none.
  523.   
  524.     MINCOL is the first column ok to end at.  (Pad with spaces to this col.)
  525.     MAXCOL is the last column ok to end at.  Truncate here.
  526. ***************
  527. *** 1872,1900 ****
  528.        register struct display_line *line;
  529.        unsigned char *string;
  530.        int hpos;
  531. !      char truncate;
  532.        int mincol, maxcol;
  533.   {
  534. !   register int c;
  535. !   register unsigned char *p1;
  536.     int hscroll = XINT (w->hscroll);
  537.     int tab_width = XINT (bf_cur->tab_width);
  538. !   register unsigned char *start;
  539. !   register unsigned char *end;
  540. !   unsigned char *p1start = (unsigned char *) line->body + hpos;
  541.     int window_width = XFASTINT (w->width);
  542.   
  543.     if (tab_width <= 0 || tab_width > 20) tab_width = 8;
  544.   
  545.     p1 = p1start;
  546. !   start = (unsigned char *) line->body + XFASTINT (w->left);
  547.     end = start + window_width - (truncate != 0);
  548.   
  549.     if ((window_width + XFASTINT (w->left)) != screen_width)
  550. !     *end-- = '|';
  551.   
  552. !   if (maxcol >= 0 && end - (unsigned char *) line->body > maxcol)
  553. !     end = (unsigned char *) line->body + maxcol;
  554.     if (maxcol >= 0 && mincol > maxcol)
  555.       mincol = maxcol;
  556.   
  557. --- 1869,1898 ----
  558.        register struct display_line *line;
  559.        unsigned char *string;
  560.        int hpos;
  561. !      glyf_t truncate;
  562.        int mincol, maxcol;
  563.   {
  564. !   register char_t c;
  565. !   register glyf_t *p1;
  566.     int hscroll = XINT (w->hscroll);
  567.     int tab_width = XINT (bf_cur->tab_width);
  568. !   register glyf_t *start;
  569. !   register glyf_t *end;
  570. !   glyf_t *p1start = line->body + hpos;
  571.     int window_width = XFASTINT (w->width);
  572. +   register struct Lisp_Chartab *cp = WINDOW_CHAR_TABLE (w);
  573.   
  574.     if (tab_width <= 0 || tab_width > 20) tab_width = 8;
  575.   
  576.     p1 = p1start;
  577. !   start = line->body + XFASTINT (w->left);
  578.     end = start + window_width - (truncate != 0);
  579.   
  580.     if ((window_width + XFASTINT (w->left)) != screen_width)
  581. !     *end-- = cp->ct_frameg;
  582.   
  583. !   if (maxcol >= 0 && end - line->body > maxcol)
  584. !     end = line->body + maxcol;
  585.     if (maxcol >= 0 && mincol > maxcol)
  586.       mincol = maxcol;
  587.   
  588. ***************
  589. *** 1902,1947 ****
  590.       {
  591.         c = *string++;
  592.         if (!c) break;
  593. !       if (c >= 040 && c < 0177)
  594. !     {
  595. !       if (p1 >= start)
  596. !         *p1 = c;
  597. !       p1++;
  598. !     }
  599. !       else if (c == '\t')
  600.       {
  601.         do
  602.           {
  603.             if (p1 >= start)
  604. !         *p1 = ' ';
  605.             p1++;
  606.           }
  607.         while ((p1 - start + hscroll - (hscroll > 0)) % tab_width);
  608.       }
  609. !       else if (c < 0200 && buffer_defaults.ctl_arrow)
  610. !     {
  611. !       if (p1 >= start)
  612. !         *p1 = '^';
  613. !       p1++;
  614. !       if (p1 >= start)
  615. !         *p1 = c ^ 0100;
  616. !       p1++;
  617. !     }
  618. !       else
  619. !     {
  620. !       if (p1 >= start)
  621. !         *p1 = '\\';
  622. !       p1++;
  623. !       if (p1 >= start)
  624. !         *p1 = (c >> 6) + '0';
  625. !       p1++;
  626. !       if (p1 >= start)
  627. !         *p1 = (7 & (c >> 3)) + '0';
  628. !       p1++;
  629. !       if (p1 >= start)
  630. !         *p1 = (7 & c) + '0';
  631. !       p1++;
  632. !     }
  633.       }
  634.   
  635.     if (c)
  636. --- 1900,1917 ----
  637.       {
  638.         c = *string++;
  639.         if (!c) break;
  640. !       if (c == HTAB)
  641.       {
  642.         do
  643.           {
  644.             if (p1 >= start)
  645. !         *p1 = SPACEGLYF;
  646.             p1++;
  647.           }
  648.         while ((p1 - start + hscroll - (hscroll > 0)) % tab_width);
  649.       }
  650. !       else
  651. !         p1 = copy_rope (p1, start, &cp->ct_dispr[c]);
  652.       }
  653.   
  654.     if (c)
  655. ***************
  656. *** 1951,1963 ****
  657.       }
  658.     else if (mincol >= 0)
  659.       {
  660. !       end = (unsigned char *) line->body + mincol;
  661.         while (p1 < end)
  662. !     *p1++ = ' ';
  663.       }
  664.   
  665.     {
  666. !     register int len = p1 - (unsigned char *) line->body;
  667.       if (len > line->length)
  668.         line->length = len;
  669.       line->body[line->length] = 0;
  670. --- 1921,1933 ----
  671.       }
  672.     else if (mincol >= 0)
  673.       {
  674. !       end = line->body + mincol;
  675.         while (p1 < end)
  676. !     *p1++ = SPACEGLYF;
  677.       }
  678.   
  679.     {
  680. !     register int len = p1 - line->body;
  681.       if (len > line->length)
  682.         line->length = len;
  683.       line->body[line->length] = 0;
  684. *** ../18.55/src/x11term.c    Thu Aug  3 04:56:42 1989
  685. --- src/x11term.c    Thu Apr  5 09:18:47 1990
  686. ***************
  687. *** 1,5 ****
  688.   /* X Communication module for terminals which understand the X protocol.
  689. !    Copyright (C) 1988 Free Software Foundation, Inc.
  690.   
  691.   This file is part of GNU Emacs.
  692.   
  693. --- 1,5 ----
  694.   /* X Communication module for terminals which understand the X protocol.
  695. !    Copyright (C) 1988, 1990 Free Software Foundation, Inc.
  696.   
  697.   This file is part of GNU Emacs.
  698.   
  699. ***************
  700. *** 29,34 ****
  701. --- 29,38 ----
  702.    *    $Header: x11term.c,v 1.12 88/02/29 14:11:07 rfrench Exp $
  703.    */
  704.   
  705. + /* Modified 1990 for 8-bit character support by Howard Gayle.
  706. +  *  See chartab.c for details. */
  707.   #ifndef lint
  708.   static char *rcsid_xterm_c = "$Header: x11term.c,v 1.12 88/02/29 14:11:07 rfrench Exp $";
  709.   #endif    lint
  710. ***************
  711. *** 49,54 ****
  712. --- 53,59 ----
  713.   #ifdef HAVE_X_WINDOWS
  714.   
  715.   #include "lisp.h"
  716. + #include "chartab.h"
  717.   #undef NULL
  718.   
  719.   /* Allow m- file to inhibit use of interrupt-driven input.  */
  720. ***************
  721. *** 457,467 ****
  722.       UNBLOCK_INPUT ();
  723.   }
  724.   
  725.   /* used by dumprectangle which is usually invoked upon Expose
  726.    * events which come from bit blt's or moving an obscuring opaque window
  727.    */
  728.   
  729. ! dumpchars (ActiveScreen, numcols, tempX, tempY, tempHL)
  730.        register struct display_line **ActiveScreen;
  731.        register int numcols;
  732.        register int tempX, tempY, tempHL;
  733. --- 462,490 ----
  734.       UNBLOCK_INPUT ();
  735.   }
  736.   
  737. + /* Display a sequence of glyfs. */
  738. + static void drawglyfs (gc, x, y, gp, n)
  739. + GC               gc; /* Graphic context.*/
  740. + int                x;  /* Horizontal glyf position. */
  741. + int                y;  /* Vertical glyf position. */
  742. + register glyf_t *gp; /* Points to first glyf. */
  743. + int              n;  /* Number of glyfs to display. */
  744. + {
  745. + register char *cp;                /* Steps through buf[]. */
  746. + register int   i;                 /* Counts glyfs.*/
  747. + char             buf[MScreenWidth]; /* Holds characters to be displayed. */
  748. + cp = buf;
  749. + for (i = n; 0 != i; --i)
  750. +    *cp++ = 0377 & *gp++;
  751. + XDrawImageString (XXdisplay, XXwindow, gc, x, y, buf, n);
  752. + }
  753.   /* used by dumprectangle which is usually invoked upon Expose
  754.    * events which come from bit blt's or moving an obscuring opaque window
  755.    */
  756.   
  757. ! dumpglyfs (ActiveScreen, numcols, tempX, tempY, tempHL)
  758.        register struct display_line **ActiveScreen;
  759.        register int numcols;
  760.        register int tempX, tempY, tempHL;
  761. ***************
  762. *** 476,492 ****
  763.           tempY < 0 || tempY >= screen_height)
  764.           return;
  765.   
  766. !     XDrawImageString(XXdisplay, XXwindow, tempHL ? XXgc_rev : XXgc_norm,
  767. !              tempX*XXfontw+XXInternalBorder,
  768. !              tempY*XXfonth+XXInternalBorder+XXbase,
  769. !              &ActiveScreen[tempY+1]->body[tempX],
  770. !              numcols);
  771.   }
  772.   
  773.   /* When a line has been changed this function is called.  Due to various
  774.    * bits of braindamage on the parts of both X11 and Emacs, the new
  775.    * version of the line is simply output if this function is invoked while
  776. !  * in UpDate.  Sometimes writechars can be invoked when not in update if
  777.    * text is to be output at the end of the line.  In this case the whole
  778.    * line is not output.  Simply the new text at the current cursor
  779.    * position given by VisibleX,Y.  The cursor is moved to the end of the
  780. --- 499,515 ----
  781.           tempY < 0 || tempY >= screen_height)
  782.           return;
  783.   
  784. !     drawglyfs(tempHL ? XXgc_rev : XXgc_norm,
  785. !           tempX*XXfontw+XXInternalBorder,
  786. !           tempY*XXfonth+XXInternalBorder+XXbase,
  787. !           &ActiveScreen[tempY+1]->body[tempX],
  788. !           numcols);
  789.   }
  790.   
  791.   /* When a line has been changed this function is called.  Due to various
  792.    * bits of braindamage on the parts of both X11 and Emacs, the new
  793.    * version of the line is simply output if this function is invoked while
  794. !  * in UpDate.  Sometimes writeglyfs can be invoked when not in update if
  795.    * text is to be output at the end of the line.  In this case the whole
  796.    * line is not output.  Simply the new text at the current cursor
  797.    * position given by VisibleX,Y.  The cursor is moved to the end of the
  798. ***************
  799. *** 518,529 ****
  800.       else
  801.           temp_length = 0;
  802.       if (temp_length > 0) {
  803. !         XDrawImageString (XXdisplay, XXwindow,
  804. !                   CurHL ? XXgc_rev : XXgc_norm,
  805. !                   first*XXfontw+XXInternalBorder,
  806. !                   cursY*XXfonth+XXInternalBorder+XXbase,
  807. !                   &DesiredScreen[cursY + 1]->body[first],
  808. !                   temp_length);
  809.           if (temp_length < screen_width)
  810.               x_clear_end_of_line (temp_length);
  811.           XTtopos (cursY, temp_length);
  812. --- 541,551 ----
  813.       else
  814.           temp_length = 0;
  815.       if (temp_length > 0) {
  816. !         drawglyfs (CurHL ? XXgc_rev : XXgc_norm,
  817. !                first*XXfontw+XXInternalBorder,
  818. !                cursY*XXfonth+XXInternalBorder+XXbase,
  819. !                &DesiredScreen[cursY + 1]->body[first],
  820. !                temp_length);
  821.           if (temp_length < screen_width)
  822.               x_clear_end_of_line (temp_length);
  823.           XTtopos (cursY, temp_length);
  824. ***************
  825. *** 535,547 ****
  826.       UNBLOCK_INPUT ();
  827.   }
  828.   
  829. ! writechars (start, end)
  830. !     register char *start, *end;
  831.   {
  832.     BLOCK_INPUT_DECLARE ();
  833.   
  834.   #ifdef XDEBUG
  835. !   fprintf(stderr, "writechars (cursX %d temp_len %d InUpd %d)\n",
  836.         cursX, end-start+1, InUpdate);
  837.   #endif XDEBUG
  838.   
  839. --- 557,569 ----
  840.       UNBLOCK_INPUT ();
  841.   }
  842.   
  843. ! writeglyfs (start, end)
  844. !     register glyf_t *start, *end;
  845.   {
  846.     BLOCK_INPUT_DECLARE ();
  847.   
  848.   #ifdef XDEBUG
  849. !   fprintf(stderr, "writeglyfs (cursX %d temp_len %d InUpd %d)\n",
  850.         cursX, end-start+1, InUpdate);
  851.   #endif XDEBUG
  852.   
  853. ***************
  854. *** 559,570 ****
  855.   
  856.     if (InUpdate)
  857.       {
  858. !       XDrawImageString (XXdisplay, XXwindow,
  859. !             CurHL ? XXgc_rev : XXgc_norm,
  860. !             cursX*XXfontw+XXInternalBorder,
  861. !             cursY*XXfonth+XXInternalBorder+XXbase,
  862. !             start,
  863. !             (end - start) + 1);
  864.         XTtopos (cursY, (end - start) + 1);
  865.   
  866.         UNBLOCK_INPUT ();
  867. --- 581,591 ----
  868.   
  869.     if (InUpdate)
  870.       {
  871. !       drawglyfs (CurHL ? XXgc_rev : XXgc_norm,
  872. !          cursX*XXfontw+XXInternalBorder,
  873. !          cursY*XXfonth+XXInternalBorder+XXbase,
  874. !          start,
  875. !          (end - start) + 1);
  876.         XTtopos (cursY, (end - start) + 1);
  877.   
  878.         UNBLOCK_INPUT ();
  879. ***************
  880. *** 582,593 ****
  881.     if (((end - start) + VisibleX) >= screen_width)
  882.       end = start + (screen_width - (VisibleX + 1));
  883.     if (end >= start) {
  884. !     XDrawImageString (XXdisplay, XXwindow,
  885. !               CurHL ? XXgc_rev : XXgc_norm,
  886. !               (VisibleX * XXfontw+XXInternalBorder),
  887. !               VisibleY * XXfonth+XXInternalBorder+XXbase,
  888. !               start,
  889. !               ((end - start) + 1));
  890.       VisibleX = VisibleX + (end - start) + 1;
  891.     }
  892.     if (!CursorExists)
  893. --- 603,613 ----
  894.     if (((end - start) + VisibleX) >= screen_width)
  895.       end = start + (screen_width - (VisibleX + 1));
  896.     if (end >= start) {
  897. !     drawglyfs (CurHL ? XXgc_rev : XXgc_norm,
  898. !            VisibleX * XXfontw+XXInternalBorder,
  899. !            VisibleY * XXfonth+XXInternalBorder+XXbase,
  900. !            start,
  901. !            ((end - start) + 1));
  902.       VisibleX = VisibleX + (end - start) + 1;
  903.     }
  904.     if (!CursorExists)
  905. ***************
  906. *** 596,610 ****
  907.   }
  908.   
  909.   static
  910. ! XTwrite_chars (start, len)
  911. !      register char *start;
  912.        register int len;
  913.   {
  914.   #ifdef XDEBUG
  915. !     fprintf (stderr, "XTwrite_chars (len %d)\n",len);
  916.   #endif
  917.   
  918. !     writechars (start, start+len-1);
  919.   }
  920.   
  921.   XTflash ()
  922. --- 616,630 ----
  923.   }
  924.   
  925.   static
  926. ! XTwrite_glyfs (start, len)
  927. !      register glyf_t *start;
  928.        register int len;
  929.   {
  930.   #ifdef XDEBUG
  931. !     fprintf (stderr, "XTwrite_glyfs (len %d)\n",len);
  932.   #endif
  933.   
  934. !     writeglyfs (start, start+len-1);
  935.   }
  936.   
  937.   XTflash ()
  938. ***************
  939. *** 669,674 ****
  940. --- 689,695 ----
  941.   CursorToggle ()
  942.   {
  943.       register struct display_line **ActiveScreen;
  944. +         static   glyf_t                sg = SPACEGLYF;
  945.   
  946.       if (!WindowMapped) {
  947.           CursorExists = 0;
  948. ***************
  949. *** 692,718 ****
  950.       if (ActiveScreen && ActiveScreen[VisibleY+1] &&
  951.           VisibleX < ActiveScreen[VisibleY+1]->length) {
  952.           if (CursorExists)
  953. !             XDrawImageString(XXdisplay, XXwindow, XXgc_norm,
  954. !                     VisibleX*XXfontw+XXInternalBorder,
  955. !                     VisibleY*XXfonth+XXInternalBorder+XXbase,
  956. !                     &ActiveScreen[VisibleY+1]->body[VisibleX],
  957. !                     1);
  958.           else if (CursorOutline) {
  959. !             XDrawImageString(XXdisplay, XXwindow, XXgc_norm,
  960. !                     VisibleX*XXfontw+XXInternalBorder,
  961. !                     VisibleY*XXfonth+XXInternalBorder+XXbase,
  962. !                     &ActiveScreen[VisibleY+1]->body[VisibleX],
  963. !                     1);
  964.               XDrawRectangle (XXdisplay, XXwindow, XXgc_norm,
  965.                       VisibleX*XXfontw+XXInternalBorder,
  966.                       VisibleY*XXfonth+XXInternalBorder,
  967.                       XXfontw - 1, XXfonth - 1);
  968.           } else
  969. !             XDrawImageString(XXdisplay, XXwindow, XXgc_curs,
  970. !                     VisibleX*XXfontw+XXInternalBorder,
  971. !                     VisibleY*XXfonth+XXInternalBorder+XXbase,
  972. !                     &ActiveScreen[VisibleY+1]->body[VisibleX],
  973. !                     1);
  974.             }
  975.       else {
  976.           if (CursorExists)
  977. --- 713,739 ----
  978.       if (ActiveScreen && ActiveScreen[VisibleY+1] &&
  979.           VisibleX < ActiveScreen[VisibleY+1]->length) {
  980.           if (CursorExists)
  981. !             drawglyfs(XXgc_norm,
  982. !                   VisibleX*XXfontw+XXInternalBorder,
  983. !                   VisibleY*XXfonth+XXInternalBorder+XXbase,
  984. !                   &ActiveScreen[VisibleY+1]->body[VisibleX],
  985. !                   1);
  986.           else if (CursorOutline) {
  987. !             drawglyfs(XXgc_norm,
  988. !                   VisibleX*XXfontw+XXInternalBorder,
  989. !                   VisibleY*XXfonth+XXInternalBorder+XXbase,
  990. !                   &ActiveScreen[VisibleY+1]->body[VisibleX],
  991. !                   1);
  992.               XDrawRectangle (XXdisplay, XXwindow, XXgc_norm,
  993.                       VisibleX*XXfontw+XXInternalBorder,
  994.                       VisibleY*XXfonth+XXInternalBorder,
  995.                       XXfontw - 1, XXfonth - 1);
  996.           } else
  997. !             drawglyfs(XXgc_curs,
  998. !                   VisibleX*XXfontw+XXInternalBorder,
  999. !                   VisibleY*XXfonth+XXInternalBorder+XXbase,
  1000. !                   &ActiveScreen[VisibleY+1]->body[VisibleX],
  1001. !                   1);
  1002.             }
  1003.       else {
  1004.           if (CursorExists)
  1005. ***************
  1006. *** 726,735 ****
  1007.                       VisibleY*XXfonth+XXInternalBorder,
  1008.                       XXfontw - 1, XXfonth - 1);
  1009.           else
  1010. !             XDrawImageString(XXdisplay, XXwindow, XXgc_curs,
  1011. !                     VisibleX*XXfontw+XXInternalBorder,
  1012. !                     VisibleY*XXfonth+XXInternalBorder+XXbase,
  1013. !                     " ", 1);
  1014.             }
  1015.   
  1016.       CursorExists = !CursorExists;
  1017. --- 747,756 ----
  1018.                       VisibleY*XXfonth+XXInternalBorder,
  1019.                       XXfontw - 1, XXfonth - 1);
  1020.           else
  1021. !             drawglyfs(XXgc_curs,
  1022. !                   VisibleX*XXfontw+XXInternalBorder,
  1023. !                   VisibleY*XXfonth+XXInternalBorder+XXbase,
  1024. !                   &sg, 1);
  1025.             }
  1026.   
  1027.       CursorExists = !CursorExists;
  1028. ***************
  1029. *** 892,898 ****
  1030.               continue;
  1031.           localX = left;
  1032.           localHL = ActiveScreen[localY+1]->highlighted;
  1033. !         dumpchars (ActiveScreen,
  1034.                  min (cols,
  1035.                   ActiveScreen[localY+1]->length-localX),
  1036.                  localX, localY, localHL);
  1037. --- 913,919 ----
  1038.               continue;
  1039.           localX = left;
  1040.           localHL = ActiveScreen[localY+1]->highlighted;
  1041. !         dumpglyfs (ActiveScreen,
  1042.                  min (cols,
  1043.                   ActiveScreen[localY+1]->length-localX),
  1044.                  localX, localY, localHL);
  1045. ***************
  1046. *** 937,948 ****
  1047.   }
  1048.   
  1049.   static
  1050. ! XTinsert_chars (start, len)
  1051. !      register char *start;
  1052.        register int len;
  1053.   {
  1054.   #ifdef XDEBUG
  1055. !     fprintf (stderr, "XTinsert_chars\n");
  1056.   #endif
  1057.   
  1058.       updateline (0);
  1059. --- 958,969 ----
  1060.   }
  1061.   
  1062.   static
  1063. ! XTinsert_glyfs (start, len)
  1064. !      register glyf_t *start;
  1065.        register int len;
  1066.   {
  1067.   #ifdef XDEBUG
  1068. !     fprintf (stderr, "XTinsert_glyfs\n");
  1069.   #endif
  1070.   
  1071.       updateline (0);
  1072. ***************
  1073. *** 949,961 ****
  1074.   }
  1075.   
  1076.   static
  1077. ! XTdelete_chars (n)
  1078.        register int n;
  1079.   {
  1080.       char *msg = "Major foobars!  This shouldn't show up!";
  1081.       
  1082.   #ifdef XDEBUG
  1083. !     fprintf (stderr, "XTdelete_chars (num %d cursX %d)\n",n,cursX);
  1084.   #endif
  1085.   
  1086.       updateline (0);
  1087. --- 970,982 ----
  1088.   }
  1089.   
  1090.   static
  1091. ! XTdelete_glyfs (n)
  1092.        register int n;
  1093.   {
  1094.       char *msg = "Major foobars!  This shouldn't show up!";
  1095.       
  1096.   #ifdef XDEBUG
  1097. !     fprintf (stderr, "XTdelete_glyfs (num %d cursX %d)\n",n,cursX);
  1098.   #endif
  1099.   
  1100.       updateline (0);
  1101. ***************
  1102. *** 1067,1147 ****
  1103.   {
  1104.       switch (keycode) {
  1105.       case XK_L1:
  1106. !         return("192");
  1107.       case XK_L2:
  1108. !         return("193");
  1109.       case XK_L3:
  1110. !         return("194");
  1111.       case XK_L4:
  1112. !         return("195");
  1113.       case XK_L5:
  1114. !         return("196");
  1115.       case XK_L6:
  1116. !         return("197");
  1117.       case XK_L7:
  1118. !         return("198");
  1119.       case XK_L8:
  1120. !         return("199");
  1121.       case XK_L9:
  1122. !         return("200");
  1123.       case XK_L10:
  1124. !         return("201");
  1125.   
  1126.       case XK_R1:
  1127. !         return("208");
  1128.       case XK_R2:
  1129. !         return("209");
  1130.       case XK_R3:
  1131. !         return("210");
  1132.       case XK_R4:
  1133. !         return("211");
  1134.       case XK_R5:
  1135. !         return("212");
  1136.       case XK_R6:
  1137. !         return("213");
  1138.       case XK_R7:
  1139. !         return("214");
  1140.       case XK_R8:
  1141. !         return("215");
  1142.       case XK_R9:
  1143. !         return("216");
  1144.       case XK_R10:
  1145. !         return("217");
  1146.       case XK_R11:
  1147. !         return("218");
  1148.       case XK_R12:
  1149. !         return("219");
  1150.       case XK_R13:
  1151. !         return("220");
  1152.       case XK_R14:
  1153. !         return("221");
  1154.       case XK_R15:
  1155. !         return("222");
  1156.   
  1157.       case XK_Break:            /* Sun3 "Alternate" key */
  1158. !         return("223");
  1159.   
  1160.       case XK_F1:
  1161. !         return("224");
  1162.       case XK_F2:
  1163. !         return("225");
  1164.       case XK_F3:
  1165. !         return("226");
  1166.       case XK_F4:
  1167. !         return("227");
  1168.       case XK_F5:
  1169. !         return("228");
  1170.       case XK_F6:
  1171. !         return("229");
  1172.       case XK_F7:
  1173. !         return("230");
  1174.       case XK_F8:
  1175. !         return("231");
  1176.       case XK_F9:
  1177. !         return("232");
  1178.   
  1179.       default:
  1180. !         return("-1");
  1181.       }
  1182.   }
  1183.   #else
  1184. --- 1088,1168 ----
  1185.   {
  1186.       switch (keycode) {
  1187.       case XK_L1:
  1188. !         return("\033[192z");
  1189.       case XK_L2:
  1190. !         return("\033[193z");
  1191.       case XK_L3:
  1192. !         return("\033[194z");
  1193.       case XK_L4:
  1194. !         return("\033[195z");
  1195.       case XK_L5:
  1196. !         return("\033[196z");
  1197.       case XK_L6:
  1198. !         return("\033[197z");
  1199.       case XK_L7:
  1200. !         return("\033[198z");
  1201.       case XK_L8:
  1202. !         return("\033[199z");
  1203.       case XK_L9:
  1204. !         return("\033[200z");
  1205.       case XK_L10:
  1206. !         return("\033[201z");
  1207.   
  1208.       case XK_R1:
  1209. !         return("\021305");
  1210.       case XK_R2:
  1211. !         return("\021304");
  1212.       case XK_R3:
  1213. !         return("\021326");
  1214.       case XK_R4:
  1215. !         return("\021345");
  1216.       case XK_R5:
  1217. !         return("\021344");
  1218.       case XK_R6:
  1219. !         return("\021366");
  1220.       case XK_R7:
  1221. !         return("\033[214z");
  1222.       case XK_R8:
  1223. !         return("\033[215z");
  1224.       case XK_R9:
  1225. !         return("\033[216z");
  1226.       case XK_R10:
  1227. !         return("\033[217z");
  1228.       case XK_R11:
  1229. !         return("\033[218z");
  1230.       case XK_R12:
  1231. !         return("\033[219z");
  1232.       case XK_R13:
  1233. !         return("\033[220z");
  1234.       case XK_R14:
  1235. !         return("\033[221z");
  1236.       case XK_R15:
  1237. !         return("\033[222z");
  1238.   
  1239.       case XK_Break:            /* Sun3 "Alternate" key */
  1240. !         return("\033[223z");
  1241.   
  1242.       case XK_F1:
  1243. !         return("\033[224z");
  1244.       case XK_F2:
  1245. !         return("\033[225z");
  1246.       case XK_F3:
  1247. !         return("\033[226z");
  1248.       case XK_F4:
  1249. !         return("\033[227z");
  1250.       case XK_F5:
  1251. !         return("\033[228z");
  1252.       case XK_F6:
  1253. !         return("\033[229z");
  1254.       case XK_F7:
  1255. !         return("\033[230z");
  1256.       case XK_F8:
  1257. !         return("\033[231z");
  1258.       case XK_F9:
  1259. !         return("\033[232z");
  1260.   
  1261.       default:
  1262. !         return("\033[-1z");
  1263.       }
  1264.   }
  1265.   #else
  1266. ***************
  1267. *** 1335,1345 ****
  1268.        will have already given us the string we want. */
  1269.         if (IsFunctionKey(keysym) ||
  1270.         IsMiscFunctionKey(keysym)) {
  1271. -     strcpy(mapping_buf,"[");
  1272. -     strcat(mapping_buf,stringFuncVal(keysym));
  1273.   #ifdef sun
  1274. !     strcat(mapping_buf,"z");
  1275.   #else
  1276.       strcat(mapping_buf,"~");
  1277.   #endif /* sun */
  1278.       nbytes = strlen(mapping_buf);
  1279. --- 1356,1366 ----
  1280.        will have already given us the string we want. */
  1281.         if (IsFunctionKey(keysym) ||
  1282.         IsMiscFunctionKey(keysym)) {
  1283.   #ifdef sun
  1284. !     strcpy(mapping_buf,stringFuncVal(keysym));
  1285.   #else
  1286. +     strcpy(mapping_buf,"[");
  1287. +     strcat(mapping_buf,stringFuncVal(keysym));
  1288.       strcat(mapping_buf,"~");
  1289.   #endif /* sun */
  1290.       nbytes = strlen(mapping_buf);
  1291. ***************
  1292. *** 1559,1567 ****
  1293.       clear_end_of_line_hook = XTclear_end_of_line;
  1294.       ins_del_lines_hook = XTins_del_lines;
  1295.       change_line_highlight_hook = XTchange_line_highlight;
  1296. !     insert_chars_hook = XTinsert_chars;
  1297. !     write_chars_hook = XTwrite_chars;
  1298. !     delete_chars_hook = XTdelete_chars;
  1299.       ring_bell_hook = XTfeep;
  1300.       reset_terminal_modes_hook = XTreset_terminal_modes;
  1301.       set_terminal_modes_hook = XTset_terminal_modes;
  1302. --- 1580,1588 ----
  1303.       clear_end_of_line_hook = XTclear_end_of_line;
  1304.       ins_del_lines_hook = XTins_del_lines;
  1305.       change_line_highlight_hook = XTchange_line_highlight;
  1306. !     insert_glyfs_hook = XTinsert_glyfs;
  1307. !     write_glyfs_hook = XTwrite_glyfs;
  1308. !     delete_glyfs_hook = XTdelete_glyfs;
  1309.       ring_bell_hook = XTfeep;
  1310.       reset_terminal_modes_hook = XTreset_terminal_modes;
  1311.       set_terminal_modes_hook = XTset_terminal_modes;
  1312. ***************
  1313. *** 1884,1890 ****
  1314. --- 1905,1914 ----
  1315.   #ifndef CANNOT_DUMP
  1316.       if (initialized)
  1317.   #endif /* CANNOT_DUMP */
  1318. +                 {
  1319.           Vxterm = Qt;
  1320. +                 init_char_table_x();
  1321. +                 }
  1322.   
  1323.       Fset (intern ("window-system-version"), make_number (11));
  1324.   
  1325.