home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume12 / kterm / part06 < prev    next >
Text File  |  1991-05-08  |  52KB  |  1,711 lines

  1. Path: uunet!cs.utexas.edu!convex!central!newstop!male!jethro!exodus!NMSU.Edu!mleisher
  2. From: mleisher@NMSU.Edu
  3. Newsgroups: comp.sources.x
  4. Subject: v12i087: kterm  - kanji xterm, Part06/18
  5. Message-ID: <12971@exodus.Eng.Sun.COM>
  6. Date: 8 May 91 02:38:58 GMT
  7. References: <csx-12i082:kterm@uunet.UU.NET>
  8. Sender: news@exodus.Eng.Sun.COM
  9. Lines: 1699
  10. Approved: argv@sun.com
  11.  
  12. Submitted-by: mleisher@NMSU.Edu
  13. Posting-number: Volume 12, Issue 87
  14. Archive-name: kterm/part06
  15.  
  16. #!/bin/sh
  17. # this is kt412.06 (part 6 of kterm-4.1.2)
  18. # do not concatenate these parts, unpack them in order with /bin/sh
  19. # file kterm-4.1.2/button.c continued
  20. #
  21. if test ! -r _shar_seq_.tmp; then
  22.     echo 'Please unpack part 1 first!'
  23.     exit 1
  24. fi
  25. (read Scheck
  26.  if test "$Scheck" != 6; then
  27.     echo Please unpack part "$Scheck" next!
  28.     exit 1
  29.  else
  30.     exit 0
  31.  fi
  32. ) < _shar_seq_.tmp || exit 1
  33. if test ! -f _shar_wnt_.tmp; then
  34.     echo 'x - still skipping kterm-4.1.2/button.c'
  35. else
  36. echo 'x - continuing file kterm-4.1.2/button.c'
  37. sed 's/^X//' << 'SHAR_EOF' >> 'kterm-4.1.2/button.c' &&
  38. /*   h    i    j    k    l    m    n    o */
  39. X    48,  48,  48,  48,  48,  48,  48,  48,
  40. /*   p    q    r    s    t    u    v    w */
  41. X    48,  48,  48,  48,  48,  48,  48,  48,
  42. /*   x    y    z    {    |    }    ~  DEL */
  43. X    48,  48,  48, 123, 124, 125, 126,   1};
  44. X
  45. X
  46. int SetCharacterClassRange (low, high, value)
  47. X    register int low, high;        /* in range of [0..127] */
  48. X    register int value;            /* arbitrary */
  49. {
  50. X
  51. X    if (low < 0 || high > 127 || high < low) return (-1);
  52. X
  53. X    for (; low <= high; low++) charClass[low] = value;
  54. X
  55. X    return (0);
  56. }
  57. X
  58. X
  59. ComputeSelect(startRow, startCol, endRow, endCol, extend)
  60. int startRow, startCol, endRow, endCol;
  61. Bool extend;
  62. {
  63. X    register TScreen *screen = &term->screen;
  64. #ifdef KTERM
  65. X    register Bchr *ptr;
  66. X        Char gset;
  67. #else /* !KTERM */
  68. X    register Char *ptr;
  69. #endif /* !KTERM */
  70. X    register int length;
  71. X    register int class;
  72. X    int osc = startSCol;
  73. X
  74. X    if (Coordinate(startRow, startCol) <= Coordinate(endRow, endCol)) {
  75. X        startSRow = startRRow = startRow;
  76. X        startSCol = startRCol = startCol;
  77. X        endSRow   = endRRow   = endRow;
  78. X        endSCol   = endRCol   = endCol;
  79. X    } else {    /* Swap them */
  80. X        startSRow = startRRow = endRow;
  81. X        startSCol = startRCol = endCol;
  82. X        endSRow   = endRRow   = startRow;
  83. X        endSCol   = endRCol   = startCol;
  84. X    }    
  85. X
  86. X    switch (selectUnit) {
  87. X        case SELECTCHAR :
  88. X            if (startSCol > (LastTextCol(startSRow) + 1)) {
  89. X                startSCol = 0;
  90. X                startSRow++;
  91. X            }
  92. X            if (endSCol > (LastTextCol(endSRow) + 1)) {
  93. X                endSCol = 0;
  94. X                endSRow++;
  95. X            }
  96. X            break;
  97. X        case SELECTWORD :
  98. X            if (startSCol > (LastTextCol(startSRow) + 1)) {
  99. X                startSCol = 0;
  100. X                startSRow++;
  101. X            } else {
  102. #ifdef KTERM
  103. X                ptr = screen->buf[startSRow+screen->topline]
  104. X                 + startSCol;
  105. #ifdef MB_WSEL
  106. X                if (ptr->gset == MBC2)
  107. X                {    /* 2nd byte of a mbcs character */
  108. X                    startSCol--;
  109. X                    ptr--;
  110. X                }
  111. X                if (ptr->gset != MBC2 && (ptr->gset & MBCS) != 0)
  112. X                {    /* 1st byte of a mbcs character */
  113. X                    class = mbcsCharClass (ptr);
  114. X                    do
  115. X                    {
  116. X                        startSCol -= 2;
  117. X                        ptr -= 2;
  118. X                    } while (startSCol >= 0
  119. X                    && ptr->gset != MBC2 && (ptr->gset & MBCS) != 0
  120. X                    && class == mbcsCharClass (ptr));
  121. X                    startSCol++;
  122. X                    ptr++;
  123. X                }
  124. X                else if (ptr->gset == GSET_KANA)
  125. X                    do
  126. X                    {
  127. X                        --startSCol;
  128. X                        --ptr;
  129. X                    } while (startSCol >= 0
  130. X                    && ptr->gset == GSET_KANA);
  131. X                else
  132. X                {
  133. X                    gset = ptr->gset;
  134. X                    class = charClass[ptr->code];
  135. X                    do {
  136. X                        --startSCol;
  137. X                        --ptr;
  138. X                    } while (startSCol >= 0
  139. X                    && ptr->gset == gset
  140. X                     && charClass[ptr->code] == class);
  141. X                }
  142. #else    /* !MB_WSEL */
  143. X                class = charClass[ptr->code];
  144. X                do {
  145. X                    --startSCol;
  146. X                    --ptr;
  147. X                } while (startSCol >= 0
  148. X                 && charClass[ptr->code] == class);
  149. #endif /* !MB_WSEL */
  150. #else /* !KTERM */
  151. X                ptr = screen->buf[2*(startSRow+screen->topline)]
  152. X                 + startSCol;
  153. X                class = charClass[*ptr];
  154. X                do {
  155. X                    --startSCol;
  156. X                    --ptr;
  157. X                } while (startSCol >= 0
  158. X                 && charClass[*ptr] == class);
  159. #endif /* !KTERM */
  160. X                ++startSCol;
  161. X            }
  162. X            if (endSCol > (LastTextCol(endSRow) + 1)) {
  163. X                endSCol = 0;
  164. X                endSRow++;
  165. X            } else {
  166. X                length = LastTextCol(endSRow);
  167. #ifdef KTERM
  168. X                ptr = screen->buf[endSRow+screen->topline]
  169. X                 + endSCol;
  170. #ifdef MB_WSEL
  171. X                if (ptr->gset == MBC2)
  172. X                {    /* 2nd byte of a mbcs character */
  173. X                    endSCol--;
  174. X                    ptr--;
  175. X                }
  176. X                if (ptr->gset != MBC2 && (ptr->gset & MBCS) != 0)
  177. X                {    /* 1st byte of a mbcs character */
  178. X                    class = mbcsCharClass (ptr);
  179. X                    do
  180. X                    {
  181. X                        endSCol += 2;
  182. X                        ptr += 2;
  183. X                    } while (endSCol < length
  184. X                    && ptr->gset != MBC2 && (ptr->gset & MBCS) != 0
  185. X                    && class == mbcsCharClass (ptr));
  186. X                }
  187. X                else if (ptr->gset == GSET_KANA)
  188. X                    do
  189. X                    {
  190. X                        ++endSCol;
  191. X                        ++ptr;
  192. X                    } while (endSCol <= length
  193. X                    && ptr->gset == GSET_KANA);
  194. X                else
  195. X                {
  196. X                    gset = ptr->gset;
  197. X                    class = charClass[ptr->code];
  198. X                    do {
  199. X                        ++endSCol;
  200. X                        ++ptr;
  201. X                    } while (endSCol <= length
  202. X                    && ptr->gset == gset
  203. X                     && charClass[ptr->code] == class);
  204. X                }
  205. #else    /* !MB_WSEL */
  206. X                class = charClass[ptr->code];
  207. X                do {
  208. X                    ++endSCol;
  209. X                    ++ptr;
  210. X                } while (endSCol <= length
  211. X                 && charClass[ptr->code] == class);
  212. #endif /* !MB_WSEL */
  213. #else /* !KTERM */
  214. X                ptr = screen->buf[2*(endSRow+screen->topline)]
  215. X                 + endSCol;
  216. X                class = charClass[*ptr];
  217. X                do {
  218. X                    ++endSCol;
  219. X                    ++ptr;
  220. X                } while (endSCol <= length
  221. X                 && charClass[*ptr] == class);
  222. #endif /* !KTERM */
  223. X                /* Word select selects if pointing to any char
  224. X                   in "word", especially in that it includes
  225. X                   the last character in a word.  So no --endSCol
  226. X                   and do special eol handling */
  227. X                if (endSCol > length+1) {
  228. X                    endSCol = 0;
  229. X                    ++endSRow;
  230. X                }
  231. X            }
  232. X            break;
  233. X        case SELECTLINE :
  234. X            if (term->screen.cutToBeginningOfLine) {
  235. X                startSCol = 0;
  236. X            } else if (!extend) {
  237. X                startSCol = osc;
  238. X            }
  239. X            if (term->screen.cutNewline) {
  240. X                endSCol = 0;
  241. X                ++endSRow;
  242. X            } else {
  243. X                endSCol = LastTextCol(endSRow) + 1;
  244. X            }
  245. X            break;
  246. X    }
  247. X
  248. X    TrackText(startSRow, startSCol, endSRow, endSCol);
  249. X    return;
  250. }
  251. X
  252. #if defined(KTERM) && defined(MB_WSEL)
  253. /*
  254. X * by Kiyoshi KANAZAWA, Nov. 29, 1990.
  255. X *
  256. X * Modified by Mark Leisher Sun Mar 17 00:09:18 1991
  257. X * Added support for Chinese and Korean text.
  258. X *
  259. X * A MBCS is divided into DIGITS, LETTERS, HIRAGANA, KATAKANA, BOPOMOFO,
  260. X * GREEK, RUSSIAN, DRAWING, CHAR, BOPOMOFO, HANGUL, HANJA, HANZI, JAMOS,
  261. X * KANA, and KANJI classes for Chinese, Japanese, and Korean character
  262. X * sets.
  263. X * Many of these distinctions are not currently necessary, but are here
  264. X * for future expansion of selection capabilities for MBCS text.
  265. X *
  266. X * The CHAR class is what most of the Kanji, Hanzi, Hangul, and Hanja fall
  267. X * in.
  268. X *
  269. X * DIGITS and LETTERS are considered to be in the same character class and
  270. X * consist of 0-9, A-Z, and a-z in a MBCS.
  271. X *
  272. X * HIRAGANA and KATAKANA are considered to be in the same class as KANJI.
  273. X * In any other MBCS, they are considered to be of the KANA class.
  274. X *
  275. X * GREEK and RUSSIAN are considered separate character classes in a MBCS.
  276. X *
  277. X * DRAWING is a separate class that consists of the line drawing sections
  278. X * of a MBCS.
  279. X *
  280. X * BOPOMOFO (ZhuYinFuHao) is considered a separate character class in a
  281. X * Chinese MBCS.
  282. X *
  283. X * HANGUL, HANJA, HANZI, JAMOS, and KANJI are considered to have the same
  284. X * character class.
  285. X *
  286. X * All other code points in a MBCS are considered to be individual
  287. X * character classes.
  288. X */
  289. X
  290. #define MBCS_DIGITS    0
  291. #define MBCS_LETTERS    MBCS_DIGITS
  292. #define MBCS_GREEK    (MBCS_DIGITS + 1)
  293. #define MBCS_RUSSIAN    (MBCS_GREEK + 1)
  294. #define MBCS_DRAWING     (MBCS_RUSSIAN + 1)
  295. #define MBCS_BOPOMOFO    (MBCS_DRAWING + 1)
  296. #define MBCS_KANA    (MBCS_BOPOMOFO + 1)
  297. #define MBCS_CHAR    (MBCS_KANA + 1)
  298. #define MBCS_HANGUL    MBCS_CHAR
  299. #define MBCS_HANJA    MBCS_CHAR
  300. #define MBCS_HANZI    MBCS_CHAR
  301. #define MBCS_JAMOS    MBCS_CHAR
  302. #define MBCS_KANJI    MBCS_CHAR
  303. #define MBCS_HIRAGANA    MBCS_CHAR
  304. #define MBCS_KATAKANA    MBCS_CHAR
  305. X
  306. /*
  307. X * Character classes in a Big5 Chinese character set.
  308. X */
  309. static int
  310. BCMbcsCharClass(c1, c2)
  311. unsigned char c1, c2;
  312. {
  313. X    switch (c1) {
  314. X      case 0xa2:
  315. X        if (0xaf <= c2 && c2 <= 0xb8)
  316. X          return(MBCS_DIGITS);
  317. X        if (0xcf <= c2 && c2 <= 0xfe)
  318. X          return(MBCS_LETTERS);
  319. X        break;
  320. X      case 0xa3:
  321. X        if (0x40 <= c2 && c2 <= 0x43)
  322. X          return(MBCS_LETTERS);
  323. X        if (0x44 <= c2 && c2 <= 0x73)
  324. X          return(MBCS_GREEK);
  325. X        if (0xa6 <= c2 && c2 <= 0xba)
  326. X          return(MBCS_BOPOMOFO);
  327. X        break;
  328. X      default:
  329. X        if (0xa4 <= c1 && c1 <= 0xf9 && (0x40 <= c2 && c2 <= 0xfe))
  330. X          return(MBCS_HANZI);
  331. X        break;
  332. X    }
  333. X    return((c1 << 8) | c2);
  334. }
  335. X
  336. /*
  337. X * Character classes in a GB 2312 character set.
  338. X */
  339. static int
  340. GCMbcsCharClass(c1, c2)
  341. unsigned char c1, c2;
  342. {
  343. X    switch (c1) {
  344. X      case 0xa3:
  345. X        if (0xb0 <= c2 && c2 <= 0xb9)
  346. X          return(MBCS_DIGITS);
  347. X        if ((0xc1 <= c2 && c2 <= 0xda) || (0xe1 <= c2 && c2 <= 0xfa))
  348. X          return(MBCS_LETTERS);
  349. X        break;
  350. X      case 0xa4:
  351. X        if (0xa1 <= c2 && c2 <= 0xf3)
  352. X          /* HIRAGANA plane in the GB 2312 set */
  353. X          return(MBCS_KANA);
  354. X        break;
  355. X      case 0xa5:
  356. X        if (0xa1 <= c2 && c2 <= 0xf6)
  357. X          /* KATAKANA plane in the GB 2312 set */
  358. X          return(MBCS_KANA);
  359. X        break;
  360. X      case 0xa6:
  361. X        if ((0xa1 <= c2 && c2 <= 0xb8) || (0xc1 <= c2 && c2 <= 0xd8))
  362. X          return(MBCS_GREEK);
  363. X        break;
  364. X      case 0xa7:
  365. X        if ((0xa1 <= c2 && c2 <= 0xc1) || (0xd1 <= c2 && c2 <= 0xf1))
  366. X          return(MBCS_RUSSIAN);
  367. X        break;
  368. X      case 0xa8:
  369. X        if (0xc5 <= c2 && c2 <= 0xe9)
  370. X          return(MBCS_BOPOMOFO);
  371. X        break;
  372. X      case 0xa9:
  373. X        if (0xa4 <= c2 && c2 <= 0xef)
  374. X          return(MBCS_DRAWING);
  375. X        break;
  376. X      default:
  377. X        if (0xb0 <= c1 && c1 <= 0xfe && (0xa1 <= c2 && c2 <= 0xfe))
  378. X          return(MBCS_HANZI);
  379. X        break;
  380. X    }
  381. X    return((c1 << 8) | c2);
  382. }
  383. X
  384. /*
  385. X * Character classes in a JIS X0208 character set.
  386. X */
  387. static int
  388. JMbcsCharClass(c1, c2)
  389. unsigned char c1, c2;
  390. {
  391. X    switch (c1) {
  392. X      case 0x21:
  393. X        switch (c2) {
  394. X          case 0x38:
  395. X          case 0x39:
  396. X          case 0x3a:
  397. X            return (MBCS_KANJI);
  398. X          case 0x3c:
  399. X            return (MBCS_KATAKANA);
  400. X        }
  401. X        break;
  402. X      case 0x23:
  403. X        if (0x30 <= c2 && c2 <= 0x39)
  404. X          return (MBCS_DIGITS);
  405. X        if (0x41 <= c2 && c2 <= 0x5a || 0x61 <= c2 && c2 <= 0x7a)
  406. X          return (MBCS_LETTERS);
  407. X        break;
  408. X      case 0x24:
  409. X        if (0x21 <= c2 && c2 <= 0x73)
  410. X          return (MBCS_HIRAGANA);
  411. X        break;
  412. X      case 0x25:
  413. X        if (0x21 <= c2 && c2 <= 0x76)
  414. X          return (MBCS_KATAKANA);
  415. X        break;
  416. X      case 0x26:
  417. X        if (0x21 <= c2 && c2 <= 0x38 || 0x41 <= c2 && c2 <= 0x58)
  418. X          return (MBCS_GREEK);
  419. X        break;
  420. X      case 0x27:
  421. X        if (0x21 <= c2 && c2 <= 0x41 || 0x51 <= c2 && c2 <= 0x71)
  422. X          return (MBCS_RUSSIAN);
  423. X        break;
  424. X      case 0x28:
  425. X        if (0x21 <= c2 && c2 <= 0x40)
  426. X          return (MBCS_DRAWING);
  427. X        break;
  428. X      default:
  429. X        if (0x30 <= c1 && c1 <= 0x4e && 0x21 <= c2 && c2 <= 0x7e
  430. X            || c1 == 0x4f && (0x21 <= c2 || c2 <= 0x53)) /* dai_1_suijun */
  431. X          return (MBCS_KANJI);
  432. X        if (0x50 <= c1 && c1 <= 0x73 && 0x21 <= c2 && c2 <= 0x7e
  433. X            || c1 == 0x74 && (0x21 <= c2 || c2 <= 0x24)) /* dai_2_suijun */
  434. X          return (MBCS_KANJI);
  435. X        break;
  436. X    }
  437. X    return ((c1 << 8) | c2);    /* return mbcs code */
  438. }
  439. X
  440. /*
  441. X * Character classes in a KS C5601 character set.
  442. X */
  443. static int
  444. KMbcsCharClass(c1, c2)
  445. unsigned char c1, c2;
  446. {
  447. X    switch (c1) {
  448. X      case 0x23:
  449. X        if (0x39 <= c2 && c2 <= 0x3f)
  450. X          return (MBCS_DIGITS);
  451. X        if (0x41 <= c2 && c2 <= 0x5a || 0x61 <= c2 && c2 <= 0x7a)
  452. X          return (MBCS_LETTERS);
  453. X        break;
  454. X      case 0x24:
  455. X        if (0x21 <= c2 && c2 <= 0x7e)
  456. X          return (MBCS_JAMOS);
  457. X        break;
  458. X      case 0x25:
  459. X        if (0x41 <= c2 && c2 <= 0x58 || 0x61 <= c2 && c2 <= 0x78)
  460. X          return (MBCS_GREEK);
  461. X        break;
  462. X      case 0x26:
  463. X        if (0x21 <= c2 && c2 <= 0x64)
  464. X          return (MBCS_DRAWING);
  465. X        break;
  466. X      case 0x2a:
  467. X        if (0x21 <= c2 && c2 <= 0x73)
  468. X          /* HIRAGANA plane in KS C5601 set */
  469. X          return (MBCS_KANA);
  470. X        break;
  471. X      case 0x2b:
  472. X        if (0x21 <= c2 && c2 <= 0x76)
  473. X          /* KATAKANA plane in KS C5601 set */
  474. X          return (MBCS_KANA);
  475. X        break;
  476. X      case 0x2c:
  477. X        if (0x21 <= c2 && c2 <= 0x41 || 0x51 <= c2 && c2 <= 0x71)
  478. X          return (MBCS_RUSSIAN);
  479. X        break;
  480. X      default:
  481. X        if (0x30 <= c1 && c1 <= 0x48 && 0x21 <= c2 && c2 <= 0x7e)
  482. X          return (MBCS_HANGUL);
  483. X        if (0x4a <= c1 && c1 <= 0x7d && 0x21 <= c2 && c2 <= 0x7e)
  484. X          return (MBCS_HANJA);
  485. X        break;
  486. X    }
  487. X    return ((c1 << 8) | c2);    /* return mbcs code */
  488. }
  489. X
  490. static int
  491. mbcsCharClass (ptr)
  492. register Bchr *ptr;
  493. {
  494. X    register unsigned char c1, c2;
  495. X    register int fntype;
  496. X
  497. X    c1 = ptr->code;
  498. X    c2 = (ptr + 1)->code;
  499. X    fntype = FontType(&term->screen, FNUM(ptr->gset), 0);
  500. X
  501. X    switch(ptr->gset) {
  502. X      case GSET_HANGUL:
  503. X        c1 &= ~NEEDMAP;
  504. X        c2 &= ~NEEDMAP;
  505. X        return(KMbcsCharClass(c1, c2));
  506. X        break;
  507. X      case GSET_HANZI:
  508. X        /*
  509. X         * MIXED most likely means Big5 font in use.
  510. X         * If this is the case, the screen buffer holds Big5 MB text.
  511. X         */
  512. X        if (fntype == MIXED)
  513. X          return(BCMbcsCharClass(c1, c2));
  514. X        c1 |= NEEDMAP;
  515. X        c2 |= NEEDMAP;
  516. X        return(GCMbcsCharClass(c1, c2));
  517. X        break;
  518. X      case GSET_KANJI:
  519. X        c1 &= ~NEEDMAP;
  520. X        c2 &= ~NEEDMAP;
  521. X        return(JMbcsCharClass(c1, c2));
  522. X        break;
  523. X    }
  524. X    return((c1 << 8) | c2);
  525. }
  526. X
  527. #endif    /* KTERM && MBCS_WSEL */
  528. X
  529. TrackText(frow, fcol, trow, tcol)
  530. register int frow, fcol, trow, tcol;
  531. /* Guaranteed (frow, fcol) <= (trow, tcol) */
  532. {
  533. X    register int from, to;
  534. X    register TScreen *screen = &term->screen;
  535. X    int old_startrow, old_startcol, old_endrow, old_endcol;
  536. X
  537. X    /* (frow, fcol) may have been scrolled off top of display */
  538. X    if (frow < 0)
  539. X        frow = fcol = 0;
  540. X    /* (trow, tcol) may have been scrolled off bottom of display */
  541. X    if (trow > screen->max_row+1) {
  542. X        trow = screen->max_row+1;
  543. X        tcol = 0;
  544. X    }
  545. X    old_startrow = screen->startHRow;
  546. X    old_startcol = screen->startHCol;
  547. X    old_endrow = screen->endHRow;
  548. X    old_endcol = screen->endHCol;
  549. X    if (frow == old_startrow && fcol == old_startcol &&
  550. X        trow == old_endrow   && tcol == old_endcol) return;
  551. X    screen->startHRow = frow;
  552. X    screen->startHCol = fcol;
  553. X    screen->endHRow   = trow;
  554. X    screen->endHCol   = tcol;
  555. X    from = Coordinate(frow, fcol);
  556. X    to = Coordinate(trow, tcol);
  557. X    if (to <= screen->startHCoord || from > screen->endHCoord) {
  558. X        /* No overlap whatsoever between old and new hilite */
  559. X        ReHiliteText(old_startrow, old_startcol, old_endrow, old_endcol);
  560. X        ReHiliteText(frow, fcol, trow, tcol);
  561. X    } else {
  562. X        if (from < screen->startHCoord) {
  563. X            /* Extend left end */
  564. X            ReHiliteText(frow, fcol, old_startrow, old_startcol);
  565. X        } else if (from > screen->startHCoord) {
  566. X            /* Shorten left end */
  567. X            ReHiliteText(old_startrow, old_startcol, frow, fcol);
  568. X        }
  569. X        if (to > screen->endHCoord) {
  570. X            /* Extend right end */
  571. X            ReHiliteText(old_endrow, old_endcol, trow, tcol);
  572. X        } else if (to < screen->endHCoord) {
  573. X            /* Shorten right end */
  574. X            ReHiliteText(trow, tcol, old_endrow, old_endcol);
  575. X        }
  576. X    }
  577. X    screen->startHCoord = from;
  578. X    screen->endHCoord = to;
  579. }
  580. X
  581. ReHiliteText(frow, fcol, trow, tcol)
  582. register int frow, fcol, trow, tcol;
  583. /* Guaranteed that (frow, fcol) <= (trow, tcol) */
  584. {
  585. X    register TScreen *screen = &term->screen;
  586. X    register int i;
  587. X
  588. X    if (frow < 0)
  589. X        frow = fcol = 0;
  590. X    else if (frow > screen->max_row)
  591. X        return;        /* nothing to do, since trow >= frow */
  592. X
  593. X    if (trow < 0)
  594. X        return;        /* nothing to do, since frow <= trow */
  595. X    else if (trow > screen->max_row) {
  596. X        trow = screen->max_row;
  597. X        tcol = screen->max_col+1;
  598. X    }
  599. X    if (frow == trow && fcol == tcol)
  600. X        return;
  601. X
  602. X    if(frow != trow) {    /* do multiple rows */
  603. X        if((i = screen->max_col - fcol + 1) > 0) {     /* first row */
  604. X            ScrnRefresh(screen, frow, fcol, 1, i, True);
  605. X        }
  606. X        if((i = trow - frow - 1) > 0) {               /* middle rows*/
  607. X            ScrnRefresh(screen, frow+1, 0,i, screen->max_col+1, True);
  608. X        }
  609. X        if(tcol > 0 && trow <= screen->max_row) {      /* last row */
  610. X            ScrnRefresh(screen, trow, 0, 1, tcol, True);
  611. X        }
  612. X    } else {        /* do single row */
  613. X        ScrnRefresh(screen, frow, fcol, 1, tcol - fcol, True);
  614. X    }
  615. }
  616. X
  617. SaltTextAway(crow, ccol, row, col, params, num_params)
  618. /*register*/ int crow, ccol, row, col;
  619. String *params;            /* selections */
  620. Cardinal num_params;
  621. /* Guaranteed that (crow, ccol) <= (row, col), and that both points are valid
  622. X   (may have row = screen->max_row+1, col = 0) */
  623. {
  624. X    register TScreen *screen = &term->screen;
  625. X    register int i, j = 0;
  626. #ifdef KTERM
  627. X    Ichr *line, *lp;
  628. X    Bchr *ch = screen->buf[row + screen->topline];
  629. #else /* !KTERM */
  630. X    char *line, *lp;
  631. #endif /* !KTERM */
  632. X    static _OwnSelection();
  633. X
  634. X    if (crow == row && ccol > col) {
  635. X        int tmp = ccol;
  636. X        ccol = col;
  637. X        col = tmp;
  638. X    }
  639. X
  640. X    --col;
  641. X    /* first we need to know how long the string is before we can save it*/
  642. X
  643. #ifdef KTERM
  644. X    if (ch[ccol].gset == MBC2)
  645. X        ccol--;
  646. X    if (ch[col].gset & MBCS && ch[col].gset != MBC2) /* MBC1 */
  647. X        col++;
  648. #endif /* !KTERM */
  649. X    if ( row == crow ) j = Length(screen, crow, ccol, col);
  650. X    else {    /* two cases, cut is on same line, cut spans multiple lines */
  651. X        j += Length(screen, crow, ccol, screen->max_col) + 1;
  652. X        for(i = crow + 1; i < row; i++) 
  653. X            j += Length(screen, i, 0, screen->max_col) + 1;
  654. X        if (col >= 0)
  655. X            j += Length(screen, row, 0, col);
  656. X    }
  657. X    
  658. X    /* now get some memory to save it in */
  659. X
  660. X    if (screen->selection_size <= j) {
  661. #ifdef KTERM
  662. X        if((line = (Ichr *)malloc((unsigned)((j + 1) * sizeof(Ichr)))) == (Ichr *)NULL)
  663. #else /* !KTERM */
  664. X        if((line = malloc((unsigned) j + 1)) == (char *)NULL)
  665. #endif /* !KTERM */
  666. X        SysError(ERROR_BMALLOC2);
  667. X        XtFree(screen->selection);
  668. X        screen->selection = line;
  669. X        screen->selection_size = j + 1;
  670. X    } else line = screen->selection;
  671. X    if (!line || j < 0) return;
  672. X
  673. #ifdef KTERM
  674. X    line[j].code = '\0';        /* make sure it is null terminated */
  675. X    line[j].gset = 0;
  676. #else /* !KTERM */
  677. X    line[j] = '\0';        /* make sure it is null terminated */
  678. #endif /* !KTERM */
  679. X    lp = line;        /* lp points to where to save the text */
  680. X    if ( row == crow ) lp = SaveText(screen, row, ccol, col, lp);
  681. X    else {
  682. X            lp = SaveText(screen, crow, ccol, screen->max_col, lp);
  683. X
  684. X            for(i = crow +1; i < row; i++)
  685. X              /*
  686. X               * If any real EOL's occur in the text, SaveText takes care
  687. X               * of inserting them into the saved line.
  688. X               * TAB's are also preserved in SaveText.
  689. X               */
  690. X              lp = SaveText(screen, i, 0, screen->max_col, lp);
  691. X
  692. X            if (col >= 0)
  693. X              lp = SaveText(screen, row, 0, col, lp);
  694. X        }
  695. #ifdef KTERM
  696. X    lp->code = '\0';        /* make sure we have end marked */
  697. X    lp->gset = 0;
  698. #else /* !KTERM */
  699. X    *lp = '\0';        /* make sure we have end marked */
  700. #endif /* !KTERM */
  701. X    
  702. #ifdef KTERM
  703. X    /*
  704. X     * (lp - line) should be used to express the length of the converted
  705. X     * Kanji string. j is only its original length.
  706. X     */
  707. X    screen->selection_length = lp - line;
  708. #else /* !KTERM */
  709. X    screen->selection_length = j;
  710. #endif /* !KTERM */
  711. X    _OwnSelection(term, params, num_params);
  712. }
  713. X
  714. #ifdef KTERM_HANZI
  715. /*
  716. X * Changed function name from convNonStandardHanziToGB to simplify.
  717. X * Version 4.1.1->4.1.2
  718. X */
  719. extern Ichr *convNSHzToGB();
  720. #endif /* KTERM_HANZI */
  721. X
  722. static Boolean ConvertSelection(w, selection, target,
  723. X                type, value, length, format)
  724. Widget w;
  725. Atom *selection, *target, *type;
  726. caddr_t *value;
  727. unsigned long *length;
  728. int *format;
  729. {
  730. X    Display* d = XtDisplay(w);
  731. X    XtermWidget xterm = (XtermWidget)w;
  732. #ifdef KTERM_HANZI
  733. X    Ichr *tmp_selection;
  734. #endif /* KTERM_HANZI */
  735. X
  736. X    if (xterm->screen.selection == NULL) return False; /* can this happen? */
  737. X
  738. X    if (*target == XA_TARGETS(d)) {
  739. X    Atom* targetP;
  740. X    Atom* std_targets;
  741. X    unsigned long std_length;
  742. X    XmuConvertStandardSelection(
  743. X            w, xterm->screen.selection_time, selection,
  744. X            target, type, (caddr_t*)&std_targets, &std_length, format
  745. X           );
  746. X    *length = std_length + 5;
  747. X    *value = (caddr_t)XtMalloc(sizeof(Atom)*(*length));
  748. X    targetP = *(Atom**)value;
  749. X    *targetP++ = XA_STRING;
  750. X    *targetP++ = XA_TEXT(d);
  751. X    *targetP++ = XA_COMPOUND_TEXT(d);
  752. X    *targetP++ = XA_LENGTH(d);
  753. X    *targetP++ = XA_LIST_LENGTH(d);
  754. X    bcopy((char*)std_targets, (char*)targetP, sizeof(Atom)*std_length);
  755. X    XtFree((char*)std_targets);
  756. X    *type = XA_ATOM;
  757. X    *format = 32;
  758. X    return True;
  759. X    }
  760. X
  761. X    if (*target == XA_STRING ||
  762. X    *target == XA_TEXT(d) ||
  763. X    *target == XA_COMPOUND_TEXT(d)) {
  764. #ifdef KTERM
  765. X    if (*target == XA_COMPOUND_TEXT(d) || *target == XA_TEXT(d)) {
  766. X        *type = XA_COMPOUND_TEXT(d);
  767. #ifdef KTERM_HANZI
  768. X            if (xterm->flags & BIG5_HANZI)
  769. X              tmp_selection =
  770. X                convNSHzToGB(xterm->screen.selection, BIGtoGB);
  771. X            if (xterm->flags & BIG5_HANZI)
  772. X              *length = convCStoCT(tmp_selection, NULL);
  773. X            else
  774. #endif /* KTERM_HANZI */
  775. X        *length = convCStoCT(xterm->screen.selection, NULL);
  776. X        *value = (caddr_t)XtMalloc(*length + 1);
  777. #ifdef KTERM_HANZI
  778. X            if (xterm->flags & BIG5_HANZI)
  779. X              (void)convCStoCT(tmp_selection, (Char *)*value);
  780. X            else
  781. #endif /* KTERM_HANZI */
  782. X        (void)convCStoCT(xterm->screen.selection, (Char *)*value);
  783. X    } else {
  784. X        *type = XA_STRING;
  785. X        *length = convCStoLatin1(xterm->screen.selection, NULL);
  786. X        *value = (caddr_t)XtMalloc(*length + 1);
  787. X        (void)convCStoLatin1(xterm->screen.selection, (Char *)*value);
  788. X    }
  789. #else /* !KTERM */
  790. X    if (*target == XA_COMPOUND_TEXT(d))
  791. X        *type = *target;
  792. X    else
  793. X        *type = XA_STRING;
  794. X    *value = xterm->screen.selection;
  795. X    *length = xterm->screen.selection_length;
  796. #endif /* !KTERM */
  797. X    *format = 8;
  798. X    return True;
  799. X    }
  800. X    if (*target == XA_LIST_LENGTH(d)) {
  801. X    *value = XtMalloc(4);
  802. X    if (sizeof(long) == 4)
  803. X        *(long*)*value = 1;
  804. X    else {
  805. X        long temp = 1;
  806. X        bcopy( ((char*)&temp)+sizeof(long)-4, (char*)*value, 4);
  807. X    }
  808. X    *type = XA_INTEGER;
  809. X    *length = 1;
  810. X    *format = 32;
  811. X    return True;
  812. X    }
  813. X    if (*target == XA_LENGTH(d)) {
  814. X    *value = XtMalloc(4);
  815. X    if (sizeof(long) == 4)
  816. #ifdef KTERM
  817. X        *(long*)*value = convCStoCT(xterm->screen.selection, NULL);
  818. #else /* !KTERM */
  819. X        *(long*)*value = xterm->screen.selection_length;
  820. #endif /* !KTERM */
  821. X    else {
  822. #ifdef KTERM
  823. X        long temp = convCStoCT(xterm->screen.selection, NULL);
  824. #else /* !KTERM */
  825. X        long temp = xterm->screen.selection_length;
  826. #endif /* !KTERM */
  827. X        bcopy( ((char*)&temp)+sizeof(long)-4, (char*)*value, 4);
  828. X    }
  829. X    *type = XA_INTEGER;
  830. X    *length = 1;
  831. X    *format = 32;
  832. X    return True;
  833. X    }
  834. X    if (XmuConvertStandardSelection(w, xterm->screen.selection_time, selection,
  835. X                    target, type, value, length, format))
  836. X    return True;
  837. X
  838. X    /* else */
  839. X    return False;
  840. X
  841. }
  842. X
  843. X
  844. static void LoseSelection(w, selection)
  845. X  Widget w;
  846. X  Atom *selection;
  847. {
  848. X    register TScreen* screen = &((XtermWidget)w)->screen;
  849. X    register Atom* atomP;
  850. X    int i;
  851. X    for (i = 0, atomP = screen->selection_atoms;
  852. X     i < screen->selection_count; i++, atomP++)
  853. X    {
  854. X    if (*selection == *atomP) *atomP = (Atom)0;
  855. X    switch (*atomP) {
  856. X      case XA_CUT_BUFFER0:
  857. X      case XA_CUT_BUFFER1:
  858. X      case XA_CUT_BUFFER2:
  859. X      case XA_CUT_BUFFER3:
  860. X      case XA_CUT_BUFFER4:
  861. X      case XA_CUT_BUFFER5:
  862. X      case XA_CUT_BUFFER6:
  863. X      case XA_CUT_BUFFER7:    *atomP = (Atom)0;
  864. X    }
  865. X    }
  866. X
  867. X    for (i = screen->selection_count; i; i--) {
  868. X    if (screen->selection_atoms[i-1] != 0) break;
  869. X    }
  870. X    screen->selection_count = i;
  871. X
  872. X    for (i = 0, atomP = screen->selection_atoms;
  873. X     i < screen->selection_count; i++, atomP++)
  874. X    {
  875. X    if (*atomP == (Atom)0) {
  876. X        *atomP = screen->selection_atoms[--screen->selection_count];
  877. X    }
  878. X    }
  879. X
  880. X    if (screen->selection_count == 0)
  881. X    TrackText(0, 0, 0, 0);
  882. }
  883. X
  884. X
  885. #ifndef KTERM
  886. /* ARGSUSED */
  887. static void SelectionDone(w, selection, target)
  888. Widget w;
  889. Atom *selection, *target;
  890. {
  891. X    /* empty proc so Intrinsics know we want to keep storage */
  892. }
  893. #endif /* !KTERM */
  894. X
  895. X
  896. static /* void */ _OwnSelection(term, selections, count)
  897. register XtermWidget term;
  898. String *selections;
  899. Cardinal count;
  900. {
  901. X    Atom* atoms = term->screen.selection_atoms;
  902. X    int i;
  903. X    Boolean have_selection = False;
  904. X
  905. X    if (term->screen.selection_length < 0) return;
  906. X
  907. X    if (count > term->screen.sel_atoms_size) {
  908. X    XtFree((char*)atoms);
  909. X    atoms = (Atom*)XtMalloc(count*sizeof(Atom));
  910. X    term->screen.selection_atoms = atoms;
  911. X    term->screen.sel_atoms_size = count;
  912. X    }
  913. X    XmuInternStrings( XtDisplay((Widget)term), selections, count, atoms );
  914. X    for (i = 0; i < count; i++) {
  915. X    int buffer;
  916. X    switch (atoms[i]) {
  917. X      case XA_CUT_BUFFER0: buffer = 0; break;
  918. X      case XA_CUT_BUFFER1: buffer = 1; break;
  919. X      case XA_CUT_BUFFER2: buffer = 2; break;
  920. X      case XA_CUT_BUFFER3: buffer = 3; break;
  921. X      case XA_CUT_BUFFER4: buffer = 4; break;
  922. X      case XA_CUT_BUFFER5: buffer = 5; break;
  923. X      case XA_CUT_BUFFER6: buffer = 6; break;
  924. X      case XA_CUT_BUFFER7: buffer = 7; break;
  925. X      default:           buffer = -1;
  926. X    }
  927. X    if (buffer >= 0)
  928. #ifdef KTERM
  929. X    {
  930. X        /* Since type of a CUT_BUFFER is STRING, KANJI and KANA
  931. X         * characters can't be stored in a CUT_BUFFER
  932. X         */
  933. X        int nw;
  934. X        int nc = 0;
  935. X        Ichr *p;
  936. X        char *s, *q;
  937. X        p = term->screen.selection;
  938. X        for (nw = term->screen.selection_length; nw > 0; nw--, p++) {
  939. X        if (p->gset == GSET_ASCII)
  940. X            nc++;
  941. X        }
  942. X        if (nc > 0) {
  943. X        char buf[256];
  944. X        p = term->screen.selection;
  945. X        s = q = (nc > 256) ? XtMalloc(nc) : buf;
  946. X        for (nw = term->screen.selection_length; nw > 0; nw--, p++) {
  947. X            if (p->gset == GSET_ASCII)
  948. X            *q++ = p->code & 0x7f;
  949. X        }
  950. X        XStoreBuffer( XtDisplay((Widget)term), s, nc, buffer);
  951. X        if (s != buf) XtFree(s);
  952. X        } else
  953. X        XStoreBuffer( XtDisplay((Widget)term), NULL, nc, buffer);
  954. X    }
  955. #else /* !KTERM */
  956. X        XStoreBuffer( XtDisplay((Widget)term), term->screen.selection,
  957. X              term->screen.selection_length, buffer );
  958. #endif /* !KTERM */
  959. X    else if (!replyToEmacs) {
  960. X        have_selection |=
  961. X        XtOwnSelection( (Widget)term, atoms[i],
  962. X                term->screen.selection_time,
  963. #ifdef KTERM
  964. X                ConvertSelection, LoseSelection, NULL );
  965. #else /* !KTERM */
  966. X                ConvertSelection, LoseSelection, SelectionDone );
  967. #endif /* !KTERM */
  968. X    }
  969. X    }
  970. X    if (!replyToEmacs)
  971. X    term->screen.selection_count = count;
  972. X    if (!have_selection)
  973. X    TrackText(0, 0, 0, 0);
  974. }
  975. X
  976. /* void */ DisownSelection(term)
  977. register XtermWidget term;
  978. {
  979. X    Atom* atoms = term->screen.selection_atoms;
  980. X    Cardinal count = term->screen.selection_count;
  981. X    int i;
  982. X
  983. X    for (i = 0; i < count; i++) {
  984. X    int buffer;
  985. X    switch (atoms[i]) {
  986. X      case XA_CUT_BUFFER0: buffer = 0; break;
  987. X      case XA_CUT_BUFFER1: buffer = 1; break;
  988. X      case XA_CUT_BUFFER2: buffer = 2; break;
  989. X      case XA_CUT_BUFFER3: buffer = 3; break;
  990. X      case XA_CUT_BUFFER4: buffer = 4; break;
  991. X      case XA_CUT_BUFFER5: buffer = 5; break;
  992. X      case XA_CUT_BUFFER6: buffer = 6; break;
  993. X      case XA_CUT_BUFFER7: buffer = 7; break;
  994. X      default:           buffer = -1;
  995. X    }
  996. X    if (buffer < 0)
  997. X        XtDisownSelection( (Widget)term, atoms[i],
  998. X                   term->screen.selection_time );
  999. X    }
  1000. X    term->screen.selection_count = 0;
  1001. X    term->screen.startHRow = term->screen.startHCol = 0;
  1002. X    term->screen.endHRow = term->screen.endHCol = 0;
  1003. }
  1004. X
  1005. X
  1006. /* returns number of chars in line from scol to ecol out */
  1007. int Length(screen, row, scol, ecol)
  1008. register int row, scol, ecol;
  1009. register TScreen *screen;
  1010. {
  1011. #ifdef KTERM
  1012. X    register Bchr *ch;
  1013. X
  1014. X    ch = screen->buf[row + screen->topline];
  1015. X    while (ecol >= scol && (ch[ecol].code == ' ' || ch[ecol].code == 0))
  1016. X
  1017. #else /* !KTERM */
  1018. X    register Char *ch;
  1019. X
  1020. X    ch = screen->buf[2 * (row + screen->topline)];
  1021. X    while (ecol >= scol && (ch[ecol] == ' ' || ch[ecol] == 0))
  1022. #endif /* !KTERM */
  1023. X      ecol--;
  1024. X    return (ecol - scol + 1);
  1025. }
  1026. X
  1027. /* copies text into line, preallocated */
  1028. #ifdef KTERM
  1029. Ichr *SaveText(screen, row, scol, ecol, lp)
  1030. int row;
  1031. int scol, ecol;
  1032. TScreen *screen;
  1033. register Ichr *lp;        /* pointer to where to put the text */
  1034. #else /* !KTERM */
  1035. char *SaveText(screen, row, scol, ecol, lp)
  1036. int row;
  1037. int scol, ecol;
  1038. TScreen *screen;
  1039. register char *lp;        /* pointer to where to put the text */
  1040. #endif /* !KTERM */
  1041. {
  1042. X    register int i = 0;
  1043. #ifdef KTERM
  1044. X    register Bchr *ch = screen->buf[row + screen->topline];
  1045. X    register Char g;
  1046. # ifdef KTERM_HANZI
  1047. X        /*
  1048. X         * Need to check to see if a Big5 font is in use also.
  1049. X         * Otherwise, no preservation of first Big5 byte is needed.
  1050. X         */
  1051. X        register int sp_case = term->flags & BIG5_HANZI;
  1052. # endif /* KTERM_HANZI */
  1053. #else /* !KTERM */
  1054. X    register Char *ch = screen->buf[2 * (row + screen->topline)];
  1055. #endif /* !KTERM */
  1056. X    register int c;
  1057. X
  1058. X    if ((i = Length(screen, row, scol, ecol)) == 0) return(lp);
  1059. X
  1060. X    ecol = scol + i;
  1061. X        /*
  1062. X         * Just hoping that there will always be enough space allocated for
  1063. X         * new lines.
  1064. X         */
  1065. X        if (ch[ecol].attr & NL_TAG)
  1066. X          ecol++;
  1067. X    for (i = scol; i < ecol; i++) {
  1068. #ifdef KTERM
  1069. X        c = ch[i].code & ~NEEDMAP;
  1070. X        g = ch[i].gset;
  1071. X                if (ch[i].attr & TAB_TAG) {
  1072. X                    lp->code = '\t';
  1073. X                    lp->gset = GSET_ASCII;
  1074. X            i++;
  1075. X                    while(i < ecol && ch[i].code == '\0' &&
  1076. X              !(ch[i].attr & (TAB_TAG|NL_TAG)))
  1077. X                      i++;
  1078. X                    if (i < ecol &&
  1079. X            (ch[i].code != '\0' || ch[i].attr & (TAB_TAG|NL_TAG)))
  1080. X                      i--;
  1081. X                } else if (ch[i].attr & NL_TAG) {
  1082. X                    lp->code = '\n';
  1083. X                    lp->gset = GSET_ASCII;
  1084. X        } else if (c < ' ' || c == 0x7f && !(g & CS96)) {
  1085. X            lp->code = ' ';
  1086. X            lp->gset = GSET_ASCII;
  1087. X        } else {
  1088. # ifdef KTERM_HANZI
  1089. X                    /*
  1090. X                     * Big5 text is a special case in which the
  1091. X                     * high order bit on the first byte needs to
  1092. X                     * be preserved when cutting/copying by selection.
  1093. X                     * This is because it is a mixed 7 and 8-bit
  1094. X                     * format.
  1095. X                     * If the first byte is not preserved, then the
  1096. X                     * conversion to Compound Text doesn't work
  1097. X                     * right and junk gets stored to the selection.
  1098. X                     */
  1099. X            lp->code = (sp_case) ? ch[i].code : c;
  1100. # else /* !KTERM_HANZI */
  1101. X                        lp->code = c;
  1102. # endif /* !KTERM_HANZI */
  1103. X            lp->gset = g;
  1104. X        }
  1105. X        lp++;
  1106. #else /* !KTERM */
  1107. X        if ((c = ch[i]) == 0)
  1108. X            c = ' ';
  1109. X        else if(c < ' ') {
  1110. X            if(c == '\036')
  1111. X                c = '#';
  1112. X            else
  1113. X                c += 0x5f;
  1114. X        } else if(c == 0x7f)
  1115. X            c = 0x5f;
  1116. X        *lp++ = c;
  1117. #endif /* !KTERM */
  1118. X    }
  1119. X    return(lp);
  1120. }
  1121. X
  1122. EditorButton(event)
  1123. register XButtonEvent *event;
  1124. {
  1125. X    register TScreen *screen = &term->screen;
  1126. X    int pty = screen->respond;
  1127. X    char line[6];
  1128. X    register unsigned row, col;
  1129. X    int button; 
  1130. X
  1131. X    button = event->button - 1; 
  1132. X
  1133. X    row = (event->y - screen->border) 
  1134. X     / FontHeight(screen);
  1135. X    col = (event->x - screen->border - screen->scrollbar)
  1136. X     / FontWidth(screen);
  1137. X    (void) strcpy(line, "\033[M");
  1138. X    if (screen->send_mouse_pos == 1) {
  1139. X        line[3] = ' ' + button;
  1140. X    } else {
  1141. X        line[3] = ' ' + (KeyState(event->state) << 2) + 
  1142. X            ((event->type == ButtonPress)? button:3);
  1143. X    }
  1144. X    line[4] = ' ' + col + 1;
  1145. X    line[5] = ' ' + row + 1;
  1146. X    v_write(pty, line, 6);
  1147. }
  1148. X
  1149. X
  1150. /*ARGSUSED*/
  1151. void HandleGINInput (w, event, param_list, nparamsp)
  1152. X    Widget w;
  1153. X    XEvent *event;
  1154. X    String *param_list;
  1155. X    Cardinal *nparamsp;
  1156. {
  1157. X    if (term->screen.TekGIN && *nparamsp == 1) {
  1158. X    int c = param_list[0][0];
  1159. X    switch (c) {
  1160. X      case 'l': case 'm': case 'r':
  1161. X      case 'L': case 'M': case 'R':
  1162. X        break;
  1163. X      default:
  1164. X        Bell ();            /* let them know they goofed */
  1165. X        c = 'l';            /* provide a default */
  1166. X    }
  1167. X    TekEnqMouse (c | 0x80);
  1168. X    TekGINoff();
  1169. X    } else {
  1170. X    Bell ();
  1171. X    }
  1172. }
  1173. X
  1174. X
  1175. /* ARGSUSED */
  1176. void HandleSecure(w, event, params, param_count)
  1177. X    Widget w;
  1178. X    XEvent *event;        /* unused */
  1179. X    String *params;        /* [0] = volume */
  1180. X    Cardinal *param_count;    /* 0 or 1 */
  1181. {
  1182. X    Time time = CurrentTime;
  1183. X
  1184. X    if ((event->xany.type == KeyPress) ||
  1185. X    (event->xany.type == KeyRelease))
  1186. X    time = event->xkey.time;
  1187. X    else if ((event->xany.type == ButtonPress) ||
  1188. X         (event->xany.type == ButtonRelease))
  1189. X      time = event->xbutton.time;
  1190. X    DoSecureKeyboard (time);
  1191. }
  1192. SHAR_EOF
  1193. echo 'File kterm-4.1.2/button.c is complete' &&
  1194. chmod 0664 kterm-4.1.2/button.c ||
  1195. echo 'restore of kterm-4.1.2/button.c failed'
  1196. Wc_c="`wc -c < 'kterm-4.1.2/button.c'`"
  1197. test 55853 -eq "$Wc_c" ||
  1198.     echo 'kterm-4.1.2/button.c: original size 55853, current size' "$Wc_c"
  1199. rm -f _shar_wnt_.tmp
  1200. fi
  1201. # ============= kterm-4.1.2/charproc.c ==============
  1202. if test -f 'kterm-4.1.2/charproc.c' -a X"$1" != X"-c"; then
  1203.     echo 'x - skipping kterm-4.1.2/charproc.c (File already exists)'
  1204.     rm -f _shar_wnt_.tmp
  1205. else
  1206. > _shar_wnt_.tmp
  1207. echo 'x - extracting kterm-4.1.2/charproc.c (Text)'
  1208. sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/charproc.c' &&
  1209. /*
  1210. X * $XConsortium: charproc.c,v 1.123 90/03/12 10:30:21 jim Exp $
  1211. X * $Kagotani: /usr/src.yoshi/X/KTerm/4.1.0/RCS/charproc.c,v 1.1 90/06/27 09:38:31 kagotani Rel $
  1212. X *
  1213. X * $Header: /usr/local/src/X11/contrib/clients/kterm-4.1.2/RCS/charproc.c,v 1.8 1991/03/17 23:46:43 mleisher Exp $
  1214. X */
  1215. X
  1216. /*
  1217. X * Modified for Hanzi support:
  1218. X * Mark Leisher mleisher@nmsu.edu Fri Nov  9 09:22:33 1990
  1219. X */
  1220. X
  1221. #include <X11/copyright.h>
  1222. #include <X11/Xlib.h>
  1223. #include <X11/Xatom.h>
  1224. #include <X11/Xmu/Atoms.h>
  1225. X
  1226. /*
  1227. X * Copyright 1988 Massachusetts Institute of Technology
  1228. X * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
  1229. X *
  1230. X *                         All Rights Reserved
  1231. X *
  1232. X * Permission to use, copy, modify, and distribute this software and its
  1233. X * documentation for any purpose and without fee is hereby granted,
  1234. X * provided that the above copyright notice appear in all copies and that
  1235. X * both that copyright notice and this permission notice appear in
  1236. X * supporting documentation, and that the name of Digital Equipment
  1237. X * Corporation not be used in advertising or publicity pertaining to
  1238. X * distribution of the software without specific, written prior permission.
  1239. X *
  1240. X *
  1241. X * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  1242. X * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  1243. X * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  1244. X * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  1245. X * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  1246. X * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  1247. X * SOFTWARE.
  1248. X */
  1249. X
  1250. X
  1251. /* charproc.c */
  1252. X
  1253. #ifdef att
  1254. #ifndef STREAMSCONN
  1255. #define STREAMSCONN
  1256. #endif
  1257. #endif
  1258. X
  1259. #include <stdio.h>
  1260. #include <X11/Xos.h>
  1261. #ifndef CRAY
  1262. #include <sgtty.h>
  1263. #endif
  1264. #include <ctype.h>
  1265. #include <errno.h>
  1266. #include <setjmp.h>
  1267. #if defined(macII) || defined(CRAY)
  1268. #undef FIOCLEX                    /* redefined from sgtty.h */
  1269. #undef FIONCLEX                    /* redefined from sgtty.h */
  1270. #endif
  1271. #include "ptyx.h"
  1272. #include "VTparse.h"
  1273. #include "data.h"
  1274. #include <X11/Xutil.h>
  1275. #include "error.h"
  1276. #include "main.h"
  1277. #include <X11/cursorfont.h>
  1278. #include <X11/StringDefs.h>
  1279. #include "menu.h"
  1280. X
  1281. #ifdef KTERM_HANZI
  1282. #include "hzutil.h"
  1283. #endif /* KTERM_HANZI */
  1284. X
  1285. #ifdef KTERM_HANGUL
  1286. #include "hgutil.h"
  1287. #endif /* KTERM_HANGUL */
  1288. X
  1289. #if !defined(EWOULDBLOCK) && defined(EAGAIN)
  1290. #define EWOULDBLOCK EAGAIN
  1291. #endif
  1292. X
  1293. extern Widget toplevel;
  1294. extern void exit(), bcopy();
  1295. static void VTallocbuf();
  1296. X
  1297. #define    DEFAULT        -1
  1298. #define    TEXT_BUF_SIZE    256
  1299. #define TRACKTIMESEC    4L
  1300. #define TRACKTIMEUSEC    0L
  1301. X
  1302. #define XtNalwaysHighlight    "alwaysHighlight"
  1303. #define    XtNboldFont        "boldFont"
  1304. #define    XtNc132            "c132"
  1305. #define XtNcharClass        "charClass"
  1306. #define    XtNcurses        "curses"
  1307. #define    XtNcursorColor        "cursorColor"
  1308. #ifdef    COLOR_TEXT    /* mukawa */
  1309. #define    XtNcolor0        "color0"
  1310. #define    XtNcolor1        "color1"
  1311. #define    XtNcolor2        "color2"
  1312. #define    XtNcolor3        "color3"
  1313. #define    XtNcolor4        "color4"
  1314. #define    XtNcolor5        "color5"
  1315. #define    XtNcolor6        "color6"
  1316. #define    XtNcolor7        "color7"
  1317. #endif    /* COLOR_TEXT */
  1318. #define XtNcutNewline        "cutNewline"
  1319. #define XtNcutToBeginningOfLine    "cutToBeginningOfLine"
  1320. #define XtNeightBitInput    "eightBitInput"
  1321. #define XtNgeometry        "geometry"
  1322. #define XtNtekGeometry        "tekGeometry"
  1323. #define    XtNinternalBorder    "internalBorder"
  1324. #define    XtNjumpScroll        "jumpScroll"
  1325. #define    XtNlogFile        "logFile"
  1326. #define    XtNlogging        "logging"
  1327. #define    XtNlogInhibit        "logInhibit"
  1328. #define    XtNloginShell        "loginShell"
  1329. #define    XtNmarginBell        "marginBell"
  1330. #define    XtNpointerColor        "pointerColor"
  1331. #define XtNpointerColorBackground "pointerColorBackground"
  1332. #define    XtNpointerShape        "pointerShape"
  1333. #define XtNmultiClickTime    "multiClickTime"
  1334. #define    XtNmultiScroll        "multiScroll"
  1335. #define    XtNnMarginBell        "nMarginBell"
  1336. #define    XtNreverseWrap        "reverseWrap"
  1337. #define    XtNsaveLines        "saveLines"
  1338. #define    XtNscrollBar        "scrollBar"
  1339. #define XtNscrollTtyOutput    "scrollTtyOutput"
  1340. #define    XtNscrollKey        "scrollKey"
  1341. #define XtNscrollLines        "scrollLines"
  1342. #define XtNscrollPos        "scrollPos"
  1343. #define    XtNsignalInhibit    "signalInhibit"
  1344. #ifdef STATUSLINE
  1345. #define    XtNstatusLine        "statusLine"
  1346. #define    XtNstatusNormal        "statusNormal"
  1347. #endif /* STATUSLINE */
  1348. #define    XtNtekInhibit        "tekInhibit"
  1349. #define XtNtekSmall        "tekSmall"
  1350. #define    XtNtekStartup        "tekStartup"
  1351. #define XtNtiteInhibit        "titeInhibit"
  1352. #define    XtNvisualBell        "visualBell"
  1353. #define XtNallowSendEvents    "allowSendEvents"
  1354. #ifdef KTERM
  1355. #define    XtNromanKanaFont    "romanKanaFont"
  1356. #define    XtNromanKanaBoldFont    "romanKanaBoldFont"
  1357. # ifdef KTERM_KANJI
  1358. #define    XtNkanjiFont        "kanjiFont"
  1359. #define    XtNkanjiBoldFont    "kanjiBoldFont"
  1360. #define    XtNkanjiMode        "kanjiMode"
  1361. #  ifdef KTERM_HANZI
  1362. #define XtNhanziFont        "hanziFont"
  1363. #define XtNhanziBoldFont    "hanziBoldFont"
  1364. #define XtNhanziMode        "hanziMode"
  1365. #define XtNhanziGbToBigTable    "hanziGbToBigTable"
  1366. #define XtNhanziBigToGbTable    "hanziBigToGbTable"
  1367. #  endif /* KTERM_HANZI */
  1368. #  ifdef KTERM_HANGUL
  1369. #define XtNhangulFont        "hangulFont"
  1370. #define XtNhangulBoldFont    "hangulBoldFont"
  1371. #define XtNhangulMode        "hangulMode"
  1372. #define XtNhangulNtoKSTable    "hangulNtoKSTable"
  1373. #  endif /* KTERM_HANGUL */
  1374. #define XtNlanguage        "language"
  1375. # endif /* KTERM_KANJI */
  1376. #define    XtNfontList        "fontList"
  1377. #define    XtNboldFontList        "boldFontList"
  1378. #define    XtNlineSpace        "lineSpace"
  1379. #endif /* KTERM */
  1380. X
  1381. #define XtCAlwaysHighlight    "AlwaysHighlight"
  1382. #define    XtCC132            "C132"
  1383. #define XtCCharClass        "CharClass"
  1384. #define    XtCCurses        "Curses"
  1385. #define XtCCutNewline        "CutNewline"
  1386. #define XtCCutToBeginningOfLine    "CutToBeginningOfLine"
  1387. #define XtCEightBitInput    "EightBitInput"
  1388. #define XtCGeometry        "Geometry"
  1389. #define    XtCJumpScroll        "JumpScroll"
  1390. #define    XtCLogfile        "Logfile"
  1391. #define    XtCLogging        "Logging"
  1392. #define    XtCLogInhibit        "LogInhibit"
  1393. #define    XtCLoginShell        "LoginShell"
  1394. #define    XtCMarginBell        "MarginBell"
  1395. #define XtCMultiClickTime    "MultiClickTime"
  1396. #define    XtCMultiScroll        "MultiScroll"
  1397. #define    XtCColumn        "Column"
  1398. #define    XtCReverseWrap        "ReverseWrap"
  1399. #define XtCSaveLines        "SaveLines"
  1400. #define    XtCScrollBar        "ScrollBar"
  1401. #define XtCScrollLines        "ScrollLines"
  1402. #define XtCScrollPos         "ScrollPos"
  1403. #define    XtCScrollCond        "ScrollCond"
  1404. #define    XtCSignalInhibit    "SignalInhibit"
  1405. #ifdef STATUSLINE
  1406. #define    XtCStatusLine        "StatusLine"
  1407. #define    XtCStatusNormal        "StatusNormal"
  1408. #endif /* STATUSLINE */
  1409. #define    XtCTekInhibit        "TekInhibit"
  1410. #define XtCTekSmall        "TekSmall"
  1411. #define    XtCTekStartup        "TekStartup"
  1412. #define XtCTiteInhibit        "TiteInhibit"
  1413. #define    XtCVisualBell        "VisualBell"
  1414. #define XtCAllowSendEvents    "AllowSendEvents"
  1415. #ifdef KTERM
  1416. #define    XtCRomanKanaFont    "RomanKanaFont"
  1417. # ifdef KTERM_KANJI
  1418. #define    XtCKanjiFont        "KanjiFont"
  1419. #define    XtCKanjiMode        "KanjiMode"
  1420. #  ifdef KTERM_HANZI
  1421. #define XtCHanziFont        "HanziFont"
  1422. #define XtCHanziMode        "HanziMode"
  1423. #define XtCHanziGbToBigTable    "HanziGbToBigTable"
  1424. #define XtCHanziBigToGbTable    "HanziBigToGbTable"
  1425. #  endif /* KTERM_HANZI */
  1426. #  ifdef KTERM_HANGUL
  1427. #define XtCHangulFont        "HangulFont"
  1428. #define XtCHangulMode        "HangulMode"
  1429. #define XtCHangulNtoKSTable    "HangulNtoKSTable"
  1430. #  endif /* KTERM_HANGUL */
  1431. #define XtCLanguage        "Language"
  1432. # endif /* KTERM_KANJI */
  1433. #define    XtCFontList        "FontList"
  1434. #define    XtCLineSpace        "LineSpace"
  1435. #endif /* KTERM */
  1436. X
  1437. #define    doinput()        (bcnt-- > 0 ? *bptr++ : in_put())
  1438. X
  1439. #ifndef lint
  1440. static char rcs_id[] = "$XConsortium: charproc.c,v 1.123 90/03/12 10:30:21 jim Exp $";
  1441. #endif    /* lint */
  1442. X
  1443. static int nparam;
  1444. static ANSI reply;
  1445. static int param[NPARAM];
  1446. X
  1447. static unsigned long ctotal;
  1448. static unsigned long ntotal;
  1449. static jmp_buf vtjmpbuf;
  1450. X
  1451. extern int groundtable[];
  1452. extern int csitable[];
  1453. extern int dectable[];
  1454. extern int eigtable[];
  1455. extern int esctable[];
  1456. extern int iestable[];
  1457. extern int igntable[];
  1458. extern int scrtable[];
  1459. extern int scstable[];
  1460. #ifdef KTERM_KANJI
  1461. extern int mbcstable[];
  1462. static Char pending_byte;
  1463. #endif /* KTERM_KANJI */
  1464. X
  1465. X
  1466. /* event handlers */
  1467. extern void HandleKeyPressed(), HandleEightBitKeyPressed();
  1468. extern void HandleStringEvent();
  1469. extern void HandleEnterWindow();
  1470. extern void HandleLeaveWindow();
  1471. extern void HandleFocusChange();
  1472. static void HandleKeymapChange();
  1473. extern void HandleInsertSelection();
  1474. extern void HandleSelectStart(), HandleKeyboardSelectStart();
  1475. extern void HandleSelectExtend(), HandleSelectSet();
  1476. extern void HandleSelectEnd(), HandleKeyboardSelectEnd();
  1477. extern void HandleStartExtend(), HandleKeyboardStartExtend();
  1478. static void HandleBell();
  1479. static void HandleIgnore();
  1480. extern void HandleSecure();
  1481. extern void HandleScrollForward();
  1482. extern void HandleScrollBack();
  1483. extern void HandleCreateMenu(), HandlePopupMenu();
  1484. extern void HandleSetFont();
  1485. extern void SetVTFont();
  1486. #ifdef KTERM_KCONV
  1487. extern void BeginConversion();
  1488. #endif /* KTERM_KCONV */
  1489. X
  1490. /*
  1491. X * NOTE: VTInitialize zeros out the entire ".screen" component of the 
  1492. X * XtermWidget, so make sure to add an assignment statement in VTInitialize() 
  1493. X * for each new ".screen" field added to this resource list.
  1494. X */
  1495. X
  1496. /* Defaults */
  1497. static  Boolean    defaultFALSE       = FALSE;
  1498. static  Boolean    defaultTRUE       = TRUE;
  1499. static  int    defaultBorderWidth = DEFBORDERWIDTH;
  1500. static  int    defaultIntBorder   = DEFBORDER;
  1501. static  int    defaultSaveLines   = SAVELINES;
  1502. static    int    defaultScrollLines = SCROLLLINES;
  1503. static  int    defaultNMarginBell = N_MARGINBELL;
  1504. static  int    defaultMultiClickTime = MULTICLICKTIME;
  1505. #ifdef KTERM
  1506. static  int    defaultLineSpace    = LINESPACE;
  1507. #endif /* KTERM */
  1508. static    char *    _Font_Selected_ = "yes";  /* string is arbitrary */
  1509. X
  1510. /*
  1511. X * Warning, the following must be kept under 1024 bytes or else some 
  1512. X * compilers (particularly AT&T 6386 SVR3.2) will barf).  Workaround is to
  1513. X * declare a static buffer and copy in at run time (the the Athena text widget
  1514. X * does).  Yuck.
  1515. X */
  1516. #ifdef KTERM_KCONV
  1517. static char defaultTranslations[] =
  1518. "\
  1519. X  Ctrl <KeyPress> Kanji:    begin-conversion(JAPANESE_CONVERSION) \n\
  1520. X  Shift <KeyPress> Prior:    scroll-back(1,halfpage) \n\
  1521. X  Shift <KeyPress> Next:    scroll-forw(1,halfpage) \n\
  1522. X  Shift <KeyPress> Select:    select-cursor-start() select-cursor-end(PRIMARY, CUT_BUFFER0) \n\
  1523. X  Shift <KeyPress> Insert:    insert-selection(PRIMARY, CUT_BUFFER0) \n\
  1524. X       ~Meta<KeyPress>:     insert-seven-bit()    \n\
  1525. X        Meta<KeyPress>:     insert-eight-bit()    \n\
  1526. X Ctrl ~Meta<Btn1Down>:          popup-menu(mainMenu) \n\
  1527. X      ~Meta <Btn1Down>:        select-start()    \n\
  1528. X      ~Meta <Btn1Motion>:    select-extend() \n\
  1529. X Ctrl ~Meta <Btn2Down>:         popup-menu(vtMenu) \n\
  1530. ~Ctrl ~Meta <Btn2Down>:        ignore()    \n\
  1531. ~Ctrl ~Meta <Btn2Up>:        insert-selection(PRIMARY, CUT_BUFFER0) \n\
  1532. X Ctrl ~Meta <Btn3Down>:         popup-menu(fontMenu) \n\
  1533. ~Ctrl ~Meta <Btn3Down>:        start-extend()    \n\
  1534. X      ~Meta <Btn3Motion>:    select-extend()    \n\
  1535. ~Ctrl ~Meta <BtnUp>:        select-end(PRIMARY, CUT_BUFFER0) \n\
  1536. X        <BtnDown>:        bell(0)        \
  1537. ";
  1538. #else /* !KTERM_KCONV */
  1539. static char defaultTranslations[] =
  1540. "\
  1541. X  Shift <KeyPress> Prior:    scroll-back(1,halfpage) \n\
  1542. X  Shift <KeyPress> Next:    scroll-forw(1,halfpage) \n\
  1543. X  Shift <KeyPress> Select:    select-cursor-start() select-cursor-end(PRIMARY, CUT_BUFFER0) \n\
  1544. X  Shift <KeyPress> Insert:    insert-selection(PRIMARY, CUT_BUFFER0) \n\
  1545. X       ~Meta<KeyPress>:     insert-seven-bit()    \n\
  1546. X        Meta<KeyPress>:     insert-eight-bit()    \n\
  1547. X Ctrl ~Meta<Btn1Down>:          popup-menu(mainMenu) \n\
  1548. X      ~Meta <Btn1Down>:        select-start()    \n\
  1549. X      ~Meta <Btn1Motion>:    select-extend() \n\
  1550. X Ctrl ~Meta <Btn2Down>:         popup-menu(vtMenu) \n\
  1551. ~Ctrl ~Meta <Btn2Down>:        ignore()    \n\
  1552. ~Ctrl ~Meta <Btn2Up>:        insert-selection(PRIMARY, CUT_BUFFER0) \n\
  1553. X Ctrl ~Meta <Btn3Down>:         popup-menu(fontMenu) \n\
  1554. ~Ctrl ~Meta <Btn3Down>:        start-extend()    \n\
  1555. X      ~Meta <Btn3Motion>:    select-extend()    \n\
  1556. ~Ctrl ~Meta <BtnUp>:        select-end(PRIMARY, CUT_BUFFER0) \n\
  1557. X        <BtnDown>:        bell(0)        \
  1558. ";
  1559. #endif /* !KTERM_KCONV */
  1560. X
  1561. static XtActionsRec actionsList[] = { 
  1562. #ifdef KTERM_KCONV
  1563. X    { "begin-conversion", BeginConversion },
  1564. #endif /* KTERM_KCONV */
  1565. X    { "bell",          HandleBell },
  1566. X    { "create-menu",      HandleCreateMenu },
  1567. X    { "ignore",          HandleIgnore },
  1568. X    { "insert",          HandleKeyPressed },  /* alias for insert-seven-bit */
  1569. X    { "insert-seven-bit", HandleKeyPressed },
  1570. X    { "insert-eight-bit", HandleEightBitKeyPressed },
  1571. X    { "insert-selection", HandleInsertSelection },
  1572. X    { "keymap",       HandleKeymapChange },
  1573. X    { "popup-menu",      HandlePopupMenu },
  1574. X    { "secure",          HandleSecure },
  1575. X    { "select-start",      HandleSelectStart },
  1576. X    { "select-extend",      HandleSelectExtend },
  1577. X    { "select-end",      HandleSelectEnd },
  1578. X    { "select-set",      HandleSelectSet },
  1579. X    { "select-cursor-start",      HandleKeyboardSelectStart },
  1580. X    { "select-cursor-end",      HandleKeyboardSelectEnd },
  1581. X    { "set-vt-font",      HandleSetFont },
  1582. X    { "start-extend",      HandleStartExtend },
  1583. X    { "start-cursor-extend",      HandleKeyboardStartExtend },
  1584. X    { "string",          HandleStringEvent },
  1585. X    { "scroll-forw",      HandleScrollForward },
  1586. X    { "scroll-back",      HandleScrollBack },
  1587. X    /* menu actions */
  1588. X    { "allow-send-events",    HandleAllowSends },
  1589. X    { "set-visual-bell",    HandleVisualBell },
  1590. X    { "set-logging",        HandleLogging },
  1591. X    { "redraw",            HandleRedraw },
  1592. X    { "send-signal",        HandleSendSignal },
  1593. X    { "quit",            HandleQuit },
  1594. X    { "set-scrollbar",        HandleScrollbar },
  1595. X    { "set-jumpscroll",        HandleJumpscroll },
  1596. X    { "set-reverse-video",    HandleReverseVideo },
  1597. X    { "set-autowrap",        HandleAutoWrap },
  1598. X    { "set-reversewrap",    HandleReverseWrap },
  1599. X    { "set-autolinefeed",    HandleAutoLineFeed },
  1600. X    { "set-appcursor",        HandleAppCursor },
  1601. X    { "set-appkeypad",        HandleAppKeypad },
  1602. X    { "set-scroll-on-key",    HandleScrollKey },
  1603. X    { "set-scroll-on-tty-output",    HandleScrollTtyOutput },
  1604. X    { "set-allow132",        HandleAllow132 },
  1605. X    { "set-cursesemul",        HandleCursesEmul },
  1606. X    { "set-marginbell",        HandleMarginBell },
  1607. X    { "set-altscreen",        HandleAltScreen },
  1608. X    { "soft-reset",        HandleSoftReset },
  1609. X    { "hard-reset",        HandleHardReset },
  1610. X    { "set-terminal-type",    HandleSetTerminalType },
  1611. X    { "set-visibility",        HandleVisibility },
  1612. X    { "set-tek-text",        HandleSetTekText },
  1613. X    { "tek-page",        HandleTekPage },
  1614. X    { "tek-reset",        HandleTekReset },
  1615. X    { "tek-copy",        HandleTekCopy },
  1616. #ifdef STATUSLINE
  1617. X    { "set-statusline",        HandleStatusLine },
  1618. X    { "set-reversestatus",    HandleStatusReverse },
  1619. #endif /* STATUSLINE */
  1620. #ifdef KTERM_KANJI
  1621. X    { "set-kanji-mode",        HandleSetKanjiMode },
  1622. #endif /* KTERM_KANJI */
  1623. };
  1624. X
  1625. static XtResource resources[] = {
  1626. #ifdef KTERM
  1627. {XtNfont, XtCFont, XtRString, sizeof(char *),
  1628. X    XtOffset(XtermWidget, misc._f_n[F_ISO8859_1]), XtRString,
  1629. X    (caddr_t) NULL},
  1630. {XtNboldFont, XtCFont, XtRString, sizeof(char *),
  1631. X    XtOffset(XtermWidget, misc._f_b[F_ISO8859_1]), XtRString,
  1632. X    (caddr_t) NULL},
  1633. {XtNromanKanaFont, XtCRomanKanaFont, XtRString, sizeof(char *),
  1634. X    XtOffset(XtermWidget, misc._f_n[F_JISX0201_0]), XtRString,
  1635. X    (caddr_t) NULL},
  1636. {XtNromanKanaBoldFont, XtCRomanKanaFont, XtRString, sizeof(char *),
  1637. X    XtOffset(XtermWidget, misc._f_b[F_JISX0201_0]), XtRString,
  1638. X    (caddr_t) NULL},
  1639. #  ifdef KTERM_KANJI
  1640. {XtNkanjiFont, XtCKanjiFont, XtRString, sizeof(char *),
  1641. X    XtOffset(XtermWidget, misc._f_n[F_JISX0208_0]), XtRString,
  1642. X    (caddr_t) NULL},
  1643. {XtNkanjiBoldFont, XtCKanjiFont, XtRString, sizeof(char *),
  1644. X    XtOffset(XtermWidget, misc._f_b[F_JISX0208_0]), XtRString,
  1645. X    (caddr_t) NULL},
  1646. {XtNkanjiMode, XtCKanjiMode, XtRString, sizeof(char *),
  1647. X    XtOffset(XtermWidget, misc.k_m), XtRString,
  1648. X    (caddr_t) NULL},
  1649. {XtNfontList, XtCFontList, XtRString, sizeof(char *),
  1650. X    XtOffset(XtermWidget, misc.fontlist), XtRString,
  1651. X    (caddr_t) NULL},
  1652. {XtNboldFontList, XtCFontList, XtRString, sizeof(char *),
  1653. X    XtOffset(XtermWidget, misc.bfontlist), XtRString,
  1654. X    (caddr_t) NULL},
  1655. {XtNlanguage, XtCLanguage, XtRString, sizeof(char *),
  1656. X    XtOffset(XtermWidget, misc.lang), XtRString,
  1657. X    (caddr_t) NULL},
  1658. #  endif /* KTERM_KANJI */
  1659. #  ifdef KTERM_HANZI
  1660. {XtNhanziFont, XtCHanziFont, XtRString, sizeof(char *),
  1661. X    XtOffset(XtermWidget, misc._f_n[F_GB2312_0]), XtRString,
  1662. X    (caddr_t) NULL},
  1663. {XtNhanziBoldFont, XtCHanziFont, XtRString, sizeof(char *),
  1664. X    XtOffset(XtermWidget, misc._f_b[F_GB2312_0]), XtRString,
  1665. X    (caddr_t) NULL},
  1666. {XtNhanziMode, XtCHanziMode, XtRString, sizeof(char *),
  1667. X    XtOffset(XtermWidget, misc.hz_m), XtRString,
  1668. X    (caddr_t) NULL},
  1669. /*
  1670. X * The following two resources need to be set in the default app
  1671. X * resources file or the users app resources file.  They are
  1672. X * directory and filename info on the Big5 <-> GuoBiao conversion
  1673. X * tables
  1674. X */
  1675. {XtNhanziGbToBigTable, XtCHanziGbToBigTable, XtRString, sizeof(char *),
  1676. X   XtOffset(XtermWidget, misc.hz_gb2big_tbl), XtRString,
  1677. X   (caddr_t) NULL},
  1678. {XtNhanziBigToGbTable, XtCHanziBigToGbTable, XtRString, sizeof(char *),
  1679. X   XtOffset(XtermWidget, misc.hz_big2gb_tbl), XtRString,
  1680. X   (caddr_t) NULL},
  1681. #  endif /* KTERM_HANZI */
  1682. #  ifdef KTERM_HANGUL
  1683. {XtNhangulFont, XtCHangulFont, XtRString, sizeof(char *),
  1684. X    XtOffset(XtermWidget, misc._f_n[F_KSC5601_0]), XtRString,
  1685. X    (caddr_t) NULL},
  1686. {XtNhangulBoldFont, XtCHangulFont, XtRString, sizeof(char *),
  1687. X    XtOffset(XtermWidget, misc._f_b[F_KSC5601_0]), XtRString,
  1688. X    (caddr_t) NULL},
  1689. {XtNhangulMode, XtCHangulMode, XtRString, sizeof(char *),
  1690. SHAR_EOF
  1691. true || echo 'restore of kterm-4.1.2/charproc.c failed'
  1692. fi
  1693. echo 'End of kterm-4.1.2 part 6'
  1694. echo 'File kterm-4.1.2/charproc.c is continued in part 7'
  1695. echo 7 > _shar_seq_.tmp
  1696. exit 0
  1697.  
  1698.  
  1699. -----------------------------------------------------------------------------
  1700. mleisher@nmsu.edu                      "I laughed.
  1701. Mark Leisher                                I cried.
  1702. Computing Research Lab                          I fell down.
  1703. New Mexico State University                        It changed my life."
  1704. Las Cruces, NM                     - Rich [Cowboy Feng's Space Bar and Grille]
  1705.  
  1706. --
  1707. Dan Heller
  1708. O'Reilly && Associates       Z-Code Software    Comp-sources-x:
  1709. Senior Writer                President          comp-sources.x@uunet.uu.net
  1710. argv@ora.com                 argv@zipcode.com
  1711.