diff options
Diffstat (limited to 'local.c')
-rw-r--r-- | local.c | 793 |
1 files changed, 0 insertions, 793 deletions
diff --git a/local.c b/local.c deleted file mode 100644 index 84a8c670..00000000 --- a/local.c +++ /dev/null @@ -1,793 +0,0 @@ -/* $Id: local.c,v 1.23 2007-11-26 20:36:30 nicm Exp $ */ - -/* - * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <sys/types.h> -#include <sys/ioctl.h> -#include <sys/stat.h> - -#include <curses.h> -#include <fcntl.h> -#include <stdlib.h> -#include <string.h> -#define TTYDEFCHARS -/* glibc requires unistd.h before termios.h for TTYDEFCHARS. */ -#include <unistd.h> -#include <termios.h> -#include <term.h> - -#include "tmux.h" - -/* - * Functions to translate input and write output to the local client terminal. - * This file should probably be called tty or terminal.c. - */ - -int local_cmp(const void *, const void *); -int local_putc(int); -void local_putp(const char *); -void local_attributes(u_char, u_char); -u_char local_translate_acs(u_char); - -/* Local key types and key codes. */ -struct local_key { - const char *name; - char *string; - size_t size; - int code; -}; -struct local_key local_keys[] = { - { "ka1", NULL, 0, KEYC_A1 }, - { "ka3", NULL, 0, KEYC_A3 }, - { "kb2", NULL, 0, KEYC_B2 }, - { "kbeg", NULL, 0, KEYC_BEG }, - { "kcbt", NULL, 0, KEYC_BTAB }, - { "kc1", NULL, 0, KEYC_C1 }, - { "kc3", NULL, 0, KEYC_C3 }, - { "kcan", NULL, 0, KEYC_CANCEL }, - { "ktbc", NULL, 0, KEYC_CATAB }, - { "kclr", NULL, 0, KEYC_CLEAR }, - { "kclo", NULL, 0, KEYC_CLOSE }, - { "kcmd", NULL, 0, KEYC_COMMAND }, - { "kcpy", NULL, 0, KEYC_COPY }, - { "kcrt", NULL, 0, KEYC_CREATE }, - { "kctab", NULL, 0, KEYC_CTAB }, - { "kdch1", NULL, 0, KEYC_DC }, - { "kdl1", NULL, 0, KEYC_DL }, - { "kcud1", NULL, 0, KEYC_DOWN }, - { "krmir", NULL, 0, KEYC_EIC }, - { "kend", NULL, 0, KEYC_END }, - { "kent", NULL, 0, KEYC_ENTER }, - { "kel", NULL, 0, KEYC_EOL }, - { "ked", NULL, 0, KEYC_EOS }, - { "kext", NULL, 0, KEYC_EXIT }, - { "kf0", NULL, 0, KEYC_F0 }, - { "kf1", NULL, 0, KEYC_F1 }, - { "kf10", NULL, 0, KEYC_F10 }, - { "kf11", NULL, 0, KEYC_F11 }, - { "kf12", NULL, 0, KEYC_F12 }, - { "kf13", NULL, 0, KEYC_F13 }, - { "kf14", NULL, 0, KEYC_F14 }, - { "kf15", NULL, 0, KEYC_F15 }, - { "kf16", NULL, 0, KEYC_F16 }, - { "kf17", NULL, 0, KEYC_F17 }, - { "kf18", NULL, 0, KEYC_F18 }, - { "kf19", NULL, 0, KEYC_F19 }, - { "kf2", NULL, 0, KEYC_F2 }, - { "kf20", NULL, 0, KEYC_F20 }, - { "kf21", NULL, 0, KEYC_F21 }, - { "kf22", NULL, 0, KEYC_F22 }, - { "kf23", NULL, 0, KEYC_F23 }, - { "kf24", NULL, 0, KEYC_F24 }, - { "kf25", NULL, 0, KEYC_F25 }, - { "kf26", NULL, 0, KEYC_F26 }, - { "kf27", NULL, 0, KEYC_F27 }, - { "kf28", NULL, 0, KEYC_F28 }, - { "kf29", NULL, 0, KEYC_F29 }, - { "kf3", NULL, 0, KEYC_F3 }, - { "kf30", NULL, 0, KEYC_F30 }, - { "kf31", NULL, 0, KEYC_F31 }, - { "kf32", NULL, 0, KEYC_F32 }, - { "kf33", NULL, 0, KEYC_F33 }, - { "kf34", NULL, 0, KEYC_F34 }, - { "kf35", NULL, 0, KEYC_F35 }, - { "kf36", NULL, 0, KEYC_F36 }, - { "kf37", NULL, 0, KEYC_F37 }, - { "kf38", NULL, 0, KEYC_F38 }, - { "kf39", NULL, 0, KEYC_F39 }, - { "kf4", NULL, 0, KEYC_F4 }, - { "kf40", NULL, 0, KEYC_F40 }, - { "kf41", NULL, 0, KEYC_F41 }, - { "kf42", NULL, 0, KEYC_F42 }, - { "kf43", NULL, 0, KEYC_F43 }, - { "kf44", NULL, 0, KEYC_F44 }, - { "kf45", NULL, 0, KEYC_F45 }, - { "kf46", NULL, 0, KEYC_F46 }, - { "kf47", NULL, 0, KEYC_F47 }, - { "kf48", NULL, 0, KEYC_F48 }, - { "kf49", NULL, 0, KEYC_F49 }, - { "kf5", NULL, 0, KEYC_F5 }, - { "kf50", NULL, 0, KEYC_F50 }, - { "kf51", NULL, 0, KEYC_F51 }, - { "kf52", NULL, 0, KEYC_F52 }, - { "kf53", NULL, 0, KEYC_F53 }, - { "kf54", NULL, 0, KEYC_F54 }, - { "kf55", NULL, 0, KEYC_F55 }, - { "kf56", NULL, 0, KEYC_F56 }, - { "kf57", NULL, 0, KEYC_F57 }, - { "kf58", NULL, 0, KEYC_F58 }, - { "kf59", NULL, 0, KEYC_F59 }, - { "kf6", NULL, 0, KEYC_F6 }, - { "kf60", NULL, 0, KEYC_F60 }, - { "kf61", NULL, 0, KEYC_F61 }, - { "kf62", NULL, 0, KEYC_F62 }, - { "kf63", NULL, 0, KEYC_F63 }, - { "kf7", NULL, 0, KEYC_F7 }, - { "kf8", NULL, 0, KEYC_F8 }, - { "kf9", NULL, 0, KEYC_F9 }, - { "kfnd", NULL, 0, KEYC_FIND }, - { "khlp", NULL, 0, KEYC_HELP }, - { "khome", NULL, 0, KEYC_HOME }, - { "kich1", NULL, 0, KEYC_IC }, - { "kil1", NULL, 0, KEYC_IL }, - { "kcub1", NULL, 0, KEYC_LEFT }, - { "kll", NULL, 0, KEYC_LL }, - { "kmrk", NULL, 0, KEYC_MARK }, - { "kmsg", NULL, 0, KEYC_MESSAGE }, - { "kmov", NULL, 0, KEYC_MOVE }, - { "knxt", NULL, 0, KEYC_NEXT }, - { "knp", NULL, 0, KEYC_NPAGE }, - { "kopn", NULL, 0, KEYC_OPEN }, - { "kopt", NULL, 0, KEYC_OPTIONS }, - { "kpp", NULL, 0, KEYC_PPAGE }, - { "kprv", NULL, 0, KEYC_PREVIOUS }, - { "kprt", NULL, 0, KEYC_PRINT }, - { "krdo", NULL, 0, KEYC_REDO }, - { "kref", NULL, 0, KEYC_REFERENCE }, - { "krfr", NULL, 0, KEYC_REFRESH }, - { "krpl", NULL, 0, KEYC_REPLACE }, - { "krst", NULL, 0, KEYC_RESTART }, - { "kres", NULL, 0, KEYC_RESUME }, - { "kcuf1", NULL, 0, KEYC_RIGHT }, - { "ksav", NULL, 0, KEYC_SAVE }, - { "kBEG", NULL, 0, KEYC_SBEG }, - { "kCAN", NULL, 0, KEYC_SCANCEL }, - { "kCMD", NULL, 0, KEYC_SCOMMAND }, - { "kCPY", NULL, 0, KEYC_SCOPY }, - { "kCRT", NULL, 0, KEYC_SCREATE }, - { "kDC", NULL, 0, KEYC_SDC }, - { "kDL", NULL, 0, KEYC_SDL }, - { "kslt", NULL, 0, KEYC_SELECT }, - { "kEND", NULL, 0, KEYC_SEND }, - { "kEOL", NULL, 0, KEYC_SEOL }, - { "kEXT", NULL, 0, KEYC_SEXIT }, - { "kind", NULL, 0, KEYC_SF }, - { "kFND", NULL, 0, KEYC_SFIND }, - { "kHLP", NULL, 0, KEYC_SHELP }, - { "kHOM", NULL, 0, KEYC_SHOME }, - { "kIC", NULL, 0, KEYC_SIC }, - { "kLFT", NULL, 0, KEYC_SLEFT }, - { "kMSG", NULL, 0, KEYC_SMESSAGE }, - { "kMOV", NULL, 0, KEYC_SMOVE }, - { "kNXT", NULL, 0, KEYC_SNEXT }, - { "kOPT", NULL, 0, KEYC_SOPTIONS }, - { "kPRV", NULL, 0, KEYC_SPREVIOUS }, - { "kPRT", NULL, 0, KEYC_SPRINT }, - { "kri", NULL, 0, KEYC_SR }, - { "kRDO", NULL, 0, KEYC_SREDO }, - { "kRPL", NULL, 0, KEYC_SREPLACE }, - { "kRIT", NULL, 0, KEYC_SRIGHT }, - { "kRES", NULL, 0, KEYC_SRSUME }, - { "kSAV", NULL, 0, KEYC_SSAVE }, - { "kSPD", NULL, 0, KEYC_SSUSPEND }, - { "khts", NULL, 0, KEYC_STAB }, - { "kUND", NULL, 0, KEYC_SUNDO }, - { "kspd", NULL, 0, KEYC_SUSPEND }, - { "kund", NULL, 0, KEYC_UNDO }, - { "kcuu1", NULL, 0, KEYC_UP }, - { "pmous", NULL, 0, KEYC_MOUSE }, - { NULL, NULL, 0, KEYC_NONE } -}; - -/* tty file descriptor and local terminal buffers. */ -int local_fd = -1; -int local_log = -1; -struct buffer *local_in; -struct buffer *local_out; -struct termios local_tio; -u_char local_attr; -u_char local_colr; - -/* Initialise local terminal. */ -int -local_init(struct buffer **in, struct buffer **out) -{ - char *tty, *path; - const char *name; - int mode, error; - struct termios tio; - struct local_key *lk; - u_int i, j; - static const char *const reqd[] = { - "carriage_return", - "change_scroll_region", - "clear_screen", - "clr_bol", - "clr_eol", - "cursor_address", - "cursor_left", - "cursor_down", - "parm_dch", - "parm_delete_line", - "parm_down_cursor", - "parm_ich", - "parm_insert_line", - "parm_left_cursor", - "parm_right_cursor", - "parm_up_cursor", - "scroll_reverse", - NULL - }; - - if ((tty = ttyname(STDIN_FILENO)) == NULL) - fatal("ttyname failed"); - if ((local_fd = open(tty, O_RDWR)) == -1) - fatal("open failed"); - if ((mode = fcntl(local_fd, F_GETFL)) == -1) - fatal("fcntl failed"); - if (fcntl(local_fd, F_SETFL, mode|O_NONBLOCK) == -1) - fatal("fcntl failed"); - - if ((name = getenv("TERM")) == NULL || *name == '\0') - name = "unknown"; - if (newterm(name, stdout, stdin) == NULL) { - log_warnx("error opening terminal: %s", name); - return (-1); - } - for (i = 0; reqd[i] != NULL; i++) { - error = 0; - - for (j = 0; strfnames[j] != NULL; j++) { - if (strcmp(strfnames[j], reqd[i]) == 0) { - if (strcodes[j] == NULL) - error = -1; - break; - } - } - if (error != -1) { - for (j = 0; numfnames[j] != NULL; j++) { - if (strcmp(numfnames[j], reqd[i]) == 0) { - if (numcodes[j] == NULL) - error = -1; - break; - } - } - } - if (error != -1) { - for (j = 0; boolfnames[j] != NULL; j++) { - if (strcmp(boolfnames[j], reqd[i]) == 0) { - if (boolcodes[j] == NULL) - error = -1; - break; - } - } - } - - if (error == -1) { - log_warnx("required capability missing: %s", reqd[i]); - return (-1); - } - } - - *in = local_in = buffer_create(BUFSIZ); - *out = local_out = buffer_create(BUFSIZ); - - if (tcgetattr(local_fd, &local_tio) != 0) - fatal("tcgetattr failed"); - memset(&tio, 0, sizeof tio); - tio.c_iflag = TTYDEF_IFLAG & ~(IXON|IXOFF|ICRNL|INLCR); - tio.c_oflag = TTYDEF_OFLAG & ~(OPOST|ONLCR|OCRNL|ONLRET); - tio.c_lflag = - TTYDEF_LFLAG & ~(IEXTEN|ICANON|ECHO|ECHOE|ECHOKE|ECHOCTL|ISIG); - tio.c_cflag = TTYDEF_CFLAG; - memcpy(&tio.c_cc, ttydefchars, sizeof tio.c_cc); - cfsetspeed(&tio, TTYDEF_SPEED); - if (tcsetattr(local_fd, TCSANOW, &tio) != 0) - fatal("tcsetattr failed"); - - if (enter_ca_mode != NULL) - local_putp(enter_ca_mode); - if (keypad_xmit != NULL) - local_putp(keypad_xmit); - if (ena_acs != NULL) - local_putp(ena_acs); - local_putp(clear_screen); - - for (lk = local_keys; lk->name != NULL; lk++) { - lk->string = tigetstr(lk->name); - if (lk->string == (char *) -1 || lk->string == (char *) 0) - lk->string = NULL; - else { - lk->size = strlen(lk->string); - log_debug("string for %s (%d): \"%s\", length %zu", - lk->name, lk->code, lk->string, lk->size); - } - } - qsort(local_keys, sizeof local_keys / - sizeof local_keys[0], sizeof local_keys[0], local_cmp); - - local_attr = 0; - local_colr = 0x88; - - if (debug_level > 2) { - xasprintf( - &path, "%s-output-%ld.log", __progname,(long) getpid()); - local_log = open( - path, O_RDWR|O_APPEND|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR); - xfree(path); - } - - return (local_fd); -} - -/* Compare keys. */ -int -local_cmp(const void *ptr1, const void *ptr2) -{ - const struct local_key *lk1 = ptr1, *lk2 = ptr2; - - if (lk1->string == NULL && lk2->string == NULL) - return (0); - if (lk1->string == NULL) - return (1); - if (lk2->string == NULL) - return (-1); - return (lk2->size - lk1->size); -} - -/* Tidy up and reset local terminal. */ -void -local_done(void) -{ - struct winsize ws; - - buffer_destroy(local_in); - buffer_destroy(local_out); - - if (tcsetattr(local_fd, TCSANOW, &local_tio) != 0) - fatal("tcsetattr failed"); - close(local_fd); - - if (local_log != -1) - close(local_log); - - if (change_scroll_region != NULL) { - if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) - fatal("ioctl(TIOCGWINSZ)"); - putp(tparm(change_scroll_region, 0, ws.ws_row - 1)); - } - - endwin(); - if (keypad_local != NULL) - putp(keypad_local); /* not local_putp */ - if (exit_ca_mode != NULL) - putp(exit_ca_mode); - putp(clear_screen); - if (cursor_normal != NULL) - putp(cursor_normal); - if (exit_attribute_mode != NULL) - putp(exit_attribute_mode); -} - -/* Put a character. Used as parameter to tputs. */ -int -local_putc(int c) -{ - u_char ch = c; - - if (c < 0 || c > (int) UCHAR_MAX) - fatalx("invalid character"); - - if (local_log != -1) - write(local_log, &ch, 1); - if (acs_chars != NULL && local_attr & ATTR_DRAWING) { - ch = local_translate_acs(ch); - if (ch == '\0') - ch = '?'; - } - - buffer_write(local_out, &ch, 1); - return (c); -} - -/* Put terminfo string. */ -void -local_putp(const char *s) -{ - if (s == NULL) - fatalx("null pointer"); - - tputs(s, 1, local_putc); -} - -/* Return waiting keys if any. */ -int -local_key(void) -{ - struct local_key *lk; - u_int i; - size_t size; - - size = BUFFER_USED(local_in); - if (size == 0) - return (KEYC_NONE); - - i = 0; - lk = local_keys; - while (lk->string != NULL) { - if (strncmp(BUFFER_OUT(local_in), lk->string, size) == 0) { - if (size < lk->size) - return (KEYC_NONE); - log_debug("got key: " - "%s %d \"%s\"", lk->name, lk->code, lk->string); - buffer_remove(local_in, lk->size); - return (lk->code); - } - - i++; - lk = local_keys + i; - } - - return (input_extract8(local_in)); -} - -/* Display output data. */ -void -local_output(struct buffer *b, size_t size) -{ - u_char ch; - uint16_t ua, ub; - - while (size != 0) { - if (size < 1) - break; - size--; - ch = input_extract8(b); - if (ch != '\e') { - switch (ch) { - case '\n': /* LF */ - local_putp(cursor_down); - break; - case '\r': /* CR */ - local_putp(carriage_return); - break; - case '\007': /* BEL */ - if (bell != NULL) - local_putp(bell); - break; - case '\010': /* BS */ - local_putp(cursor_left); - break; - default: - local_putc(ch); - break; - } - continue; - } - - if (size < 1) - fatalx("underflow"); - size--; - ch = input_extract8(b); - - log_debug("received code %hhu", ch); - switch (ch) { - case CODE_CURSORUP: - if (size < 2) - fatalx("CODE_CURSORUP underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_up_cursor, ua)); - break; - case CODE_CURSORDOWN: - if (size < 2) - fatalx("CODE_CURSORDOWN underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_down_cursor, ua)); - break; - case CODE_CURSORRIGHT: - if (size < 2) - fatalx("CODE_CURSORRIGHT underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_right_cursor, ua)); - break; - case CODE_CURSORLEFT: - if (size < 2) - fatalx("CODE_CURSORLEFT underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_left_cursor, ua)); - break; - case CODE_CURSORMOVE: - if (size < 4) - fatalx("CODE_CURSORMOVE underflow"); - size -= 4; - ua = input_extract16(b); - ub = input_extract16(b); - local_putp(tparm(cursor_address, ua - 1, ub - 1)); - break; - case CODE_CLEARENDOFLINE: - local_putp(clr_eol); - break; - case CODE_CLEARSTARTOFLINE: - local_putp(clr_bol); - break; - case CODE_CLEARLINE: - local_putp(clr_eol); /* XXX */ - break; - case CODE_INSERTLINE: - if (size < 2) - fatalx("CODE_INSERTLINE underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_insert_line, ua)); - break; - case CODE_DELETELINE: - if (size < 2) - fatalx("CODE_DELETELINE underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_delete_line, ua)); - break; - case CODE_INSERTCHARACTER: - if (size < 2) - fatalx("CODE_INSERTCHARACTER underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_ich, ua)); - break; - case CODE_DELETECHARACTER: - if (size < 2) - fatalx("CODE_DELETECHARACTER underflow"); - size -= 2; - ua = input_extract16(b); - local_putp(tparm(parm_dch, ua)); - break; - case CODE_CURSORON: - if (cursor_normal != NULL) - local_putp(cursor_normal); - break; - case CODE_CURSOROFF: - if (cursor_invisible != NULL) - local_putp(cursor_invisible); - break; - case CODE_REVERSEINDEX: - local_putp(scroll_reverse); - break; - case CODE_SCROLLREGION: - if (size < 4) - fatalx("CODE_SCROLLREGION underflow"); - size -= 4; - ua = input_extract16(b); - ub = input_extract16(b); - local_putp(tparm(change_scroll_region, ua - 1, ub - 1)); - break; - case CODE_INSERTON: - if (enter_insert_mode != NULL) - local_putp(enter_insert_mode); - break; - case CODE_INSERTOFF: - if (exit_insert_mode != NULL) - local_putp(exit_insert_mode); - break; - case CODE_KCURSOROFF: - /* - t = tigetstr("CE"); - if (t != (char *) 0 && t != (char *) -1) - local_putp(t); - */ - break; - case CODE_KCURSORON: - /* - t = tigetstr("CS"); - if (t != (char *) 0 && t != (char *) -1) - local_putp(t); - */ - break; - case CODE_KKEYPADOFF: - /* - if (keypad_local != NULL) - local_putp(keypad_local); - */ - break; - case CODE_KKEYPADON: - /* - if (keypad_xmit != NULL) - local_putp(keypad_xmit); - */ - break; - case CODE_TITLE: - if (size < 2) - fatalx("CODE_TITLE underflow"); - size -= 2; - ua = input_extract16(b); - - if (size < ua) - fatalx("CODE_TITLE underflow"); - size -= ua; - buffer_remove(b, ua); - break; - case CODE_ATTRIBUTES: - if (size < 4) - fatalx("CODE_ATTRIBUTES underflow"); - size -= 4; - ua = input_extract16(b); - ub = input_extract16(b); - - local_attributes(ua, ub); - break; - } - } -} - -void -local_attributes(u_char attr, u_char colr) -{ - u_char fg, bg; - - if (attr == local_attr && colr == local_colr) - return; - - /* If any bits are being cleared, reset everything. */ - if (local_attr & ~attr) { - if ((local_attr & ATTR_DRAWING) && - exit_alt_charset_mode != NULL) - local_putp(exit_alt_charset_mode); - local_putp(exit_attribute_mode); - local_colr = 0x88; - local_attr = 0; - } - - /* Filter out bits already set. */ - attr &= ~local_attr; - local_attr |= attr; - - if ((attr & ATTR_BRIGHT) && enter_bold_mode != NULL) - local_putp(enter_bold_mode); - if ((attr & ATTR_DIM) && enter_dim_mode != NULL) - local_putp(enter_dim_mode); - if ((attr & ATTR_ITALICS) && enter_standout_mode != NULL) - local_putp(enter_standout_mode); - if ((attr & ATTR_UNDERSCORE) && enter_underline_mode != NULL) - local_putp(enter_underline_mode); - if ((attr & ATTR_BLINK) && enter_blink_mode != NULL) - local_putp(enter_blink_mode); - if ((attr & ATTR_REVERSE) && enter_reverse_mode != NULL) - local_putp(enter_reverse_mode); - if ((attr & ATTR_HIDDEN) && enter_secure_mode != NULL) - local_putp(enter_secure_mode); - if ((attr & ATTR_DRAWING) && enter_alt_charset_mode != NULL) - local_putp(enter_alt_charset_mode); - - fg = (colr >> 4) & 0xf; - if (fg != ((local_colr >> 4) & 0xf)) { - if (tigetflag("AX") == TRUE) { - if (fg == 7) - fg = 8; - } else { - if (fg == 8) - fg = 7; - } - - if (fg == 8) - local_putp("\e[39m"); - else if (set_a_foreground != NULL) - local_putp(tparm(set_a_foreground, fg)); - } - - bg = colr & 0xf; - if (bg != (local_colr & 0xf)) { - if (tigetflag("AX") == TRUE) { - if (bg == 0) - bg = 8; - } else { - if (bg == 8) - bg = 0; - } - - if (bg == 8) - local_putp("\e[49m"); - else if (set_a_background != NULL) - local_putp(tparm(set_a_background, bg)); - } - - local_colr = colr; -} - -u_char -local_translate_acs(u_char ch) -{ - switch (ch) { - case '~': - return (ACS_BULLET); - case '}': - return (ACS_STERLING); - case '|': - return (ACS_NEQUAL); - case '{': - return (ACS_PI); - case 'z': - return (ACS_GEQUAL); - case 'y': - return (ACS_LEQUAL); - case 'x': - return (ACS_VLINE); - case 'w': - return (ACS_TTEE); - case 'v': - return (ACS_BTEE); - case 'u': - return (ACS_RTEE); - case 't': - return (ACS_LTEE); - case 's': - return (ACS_S9); - case 'r': - return (ACS_S7); - case 'q': - return (ACS_HLINE); - case 'p': - return (ACS_S3); - case 'o': - return (ACS_S1); - case 'n': - return (ACS_PLUS); - case 'm': - return (ACS_LLCORNER); - case 'l': - return (ACS_ULCORNER); - case 'k': - return (ACS_URCORNER); - case 'j': - return (ACS_LRCORNER); - case 'i': - return (ACS_LANTERN); - case 'h': - return (ACS_BOARD); - case 'g': - return (ACS_PLMINUS); - case 'f': - return (ACS_DEGREE); - case 'a': - return (ACS_CKBOARD); - case '`': - return (ACS_DIAMOND); - case '0': - return (ACS_BLOCK); - case '.': - return (ACS_DARROW); - case '-': - return (ACS_UARROW); - case ',': - return (ACS_LARROW); - case '+': - return (ACS_RARROW); - } - return (ch); -} |