comparison src/term.c @ 28739:40b087823dc7 v8.2.4894

patch 8.2.4894: MS-Windows: not using italics Commit: https://github.com/vim/vim/commit/5a7b6dc23cd16450b5773849520d513de56bccbf Author: LemonBoy <thatlemon@gmail.com> Date: Fri May 6 18:38:41 2022 +0100 patch 8.2.4894: MS-Windows: not using italics Problem: MS-Windows: not using italics. Solution: Use italics. Simplify the code. (closes https://github.com/vim/vim/issues/10359)
author Bram Moolenaar <Bram@vim.org>
date Fri, 06 May 2022 19:45:02 +0200
parents e1aff2f300be
children b01bca69b1d5
comparison
equal deleted inserted replaced
28738:1b2e88f9a1eb 28739:40b087823dc7
6603 } 6603 }
6604 } 6604 }
6605 6605
6606 # ifdef FEAT_TERMGUICOLORS 6606 # ifdef FEAT_TERMGUICOLORS
6607 # define KSSIZE 20 6607 # define KSSIZE 20
6608 struct ks_tbl_s 6608
6609 { 6609 typedef enum
6610 int code; // value of KS_ 6610 {
6611 char *vtp; // code in vtp mode 6611 CMODE_INDEXED = 0, // Use cmd.exe 4bit palette.
6612 char *vtp2; // code in vtp2 mode 6612 CMODE_RGB, // Use 24bit RGB colors using VTP.
6613 char buf[KSSIZE]; // save buffer in non-vtp mode 6613 CMODE_256COL, // Emulate xterm's 256-color palette using VTP.
6614 char vbuf[KSSIZE]; // save buffer in vtp mode 6614 CMODE_LAST,
6615 char v2buf[KSSIZE]; // save buffer in vtp2 mode 6615 } cmode_T;
6616 char arr[KSSIZE]; // real buffer 6616
6617 struct ks_tbl_S
6618 {
6619 int code; // value of KS_
6620 char *vtp; // code in RGB mode
6621 char *vtp2; // code in 256color mode
6622 char buf[CMODE_LAST][KSSIZE]; // real buffer
6617 }; 6623 };
6618 6624
6619 static struct ks_tbl_s ks_tbl[] = 6625 static struct ks_tbl_S ks_tbl[] =
6620 { 6626 {
6621 {(int)KS_ME, "\033|0m", "\033|0m"}, // normal 6627 {(int)KS_ME, "\033|0m", "\033|0m"}, // normal
6622 {(int)KS_MR, "\033|7m", "\033|7m"}, // reverse 6628 {(int)KS_MR, "\033|7m", "\033|7m"}, // reverse
6623 {(int)KS_MD, "\033|1m", "\033|1m"}, // bold 6629 {(int)KS_MD, "\033|1m", "\033|1m"}, // bold
6624 {(int)KS_SO, "\033|91m", "\033|91m"}, // standout: bright red text 6630 {(int)KS_SO, "\033|91m", "\033|91m"}, // standout: bright red text
6625 {(int)KS_SE, "\033|39m", "\033|39m"}, // standout end: default color 6631 {(int)KS_SE, "\033|39m", "\033|39m"}, // standout end: default color
6626 {(int)KS_CZH, "\033|95m", "\033|95m"}, // italic: bright magenta text 6632 {(int)KS_CZH, "\033|3m", "\033|3m"}, // italic
6627 {(int)KS_CZR, "\033|0m", "\033|0m"}, // italic end 6633 {(int)KS_CZR, "\033|0m", "\033|0m"}, // italic end
6628 {(int)KS_US, "\033|4m", "\033|4m"}, // underscore 6634 {(int)KS_US, "\033|4m", "\033|4m"}, // underscore
6629 {(int)KS_UE, "\033|24m", "\033|24m"}, // underscore end 6635 {(int)KS_UE, "\033|24m", "\033|24m"}, // underscore end
6630 # ifdef TERMINFO 6636 # ifdef TERMINFO
6631 {(int)KS_CAB, "\033|%p1%db", "\033|%p14%dm"}, // set background color 6637 {(int)KS_CAB, "\033|%p1%db", "\033|%p14%dm"}, // set background color
6662 void 6668 void
6663 swap_tcap(void) 6669 swap_tcap(void)
6664 { 6670 {
6665 # ifdef FEAT_TERMGUICOLORS 6671 # ifdef FEAT_TERMGUICOLORS
6666 static int init_done = FALSE; 6672 static int init_done = FALSE;
6667 static int curr_mode; 6673 static cmode_T curr_mode;
6668 struct ks_tbl_s *ks; 6674 struct ks_tbl_S *ks;
6669 struct builtin_term *bt; 6675 struct builtin_term *bt;
6670 int mode; 6676 cmode_T mode;
6671 enum 6677
6672 {
6673 CMODEINDEX,
6674 CMODE24,
6675 CMODE256
6676 };
6677
6678 // buffer initialization
6679 if (!init_done) 6678 if (!init_done)
6680 { 6679 {
6681 for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++) 6680 for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++)
6682 { 6681 {
6683 bt = find_first_tcap(DEFAULT_TERM, ks->code); 6682 bt = find_first_tcap(DEFAULT_TERM, ks->code);
6684 if (bt != NULL) 6683 if (bt != NULL)
6685 { 6684 {
6686 STRNCPY(ks->buf, bt->bt_string, KSSIZE); 6685 // Preserve the original value.
6687 STRNCPY(ks->vbuf, ks->vtp, KSSIZE); 6686 STRNCPY(ks->buf[CMODE_INDEXED], bt->bt_string, KSSIZE);
6688 STRNCPY(ks->v2buf, ks->vtp2, KSSIZE); 6687 STRNCPY(ks->buf[CMODE_RGB], ks->vtp, KSSIZE);
6689 6688 STRNCPY(ks->buf[CMODE_256COL], ks->vtp2, KSSIZE);
6690 STRNCPY(ks->arr, bt->bt_string, KSSIZE); 6689
6691 bt->bt_string = &ks->arr[0]; 6690 bt->bt_string = ks->buf[CMODE_INDEXED];
6692 } 6691 }
6693 } 6692 }
6694 init_done = TRUE; 6693 init_done = TRUE;
6695 curr_mode = CMODEINDEX; 6694 curr_mode = CMODE_INDEXED;
6696 } 6695 }
6697 6696
6698 if (p_tgc) 6697 if (p_tgc)
6699 mode = CMODE24; 6698 mode = CMODE_RGB;
6700 else if (t_colors >= 256) 6699 else if (t_colors >= 256)
6701 mode = CMODE256; 6700 mode = CMODE_256COL;
6702 else 6701 else
6703 mode = CMODEINDEX; 6702 mode = CMODE_INDEXED;
6703
6704 if (mode == curr_mode)
6705 return;
6704 6706
6705 for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++) 6707 for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++)
6706 { 6708 {
6707 bt = find_first_tcap(DEFAULT_TERM, ks->code); 6709 bt = find_first_tcap(DEFAULT_TERM, ks->code);
6708 if (bt != NULL) 6710 if (bt != NULL)
6709 { 6711 bt->bt_string = ks->buf[mode];
6710 switch (curr_mode) 6712 }
6711 { 6713
6712 case CMODEINDEX: 6714 curr_mode = mode;
6713 STRNCPY(&ks->buf[0], bt->bt_string, KSSIZE);
6714 break;
6715 case CMODE24:
6716 STRNCPY(&ks->vbuf[0], bt->bt_string, KSSIZE);
6717 break;
6718 default:
6719 STRNCPY(&ks->v2buf[0], bt->bt_string, KSSIZE);
6720 }
6721 }
6722 }
6723
6724 if (mode != curr_mode)
6725 {
6726 for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++)
6727 {
6728 bt = find_first_tcap(DEFAULT_TERM, ks->code);
6729 if (bt != NULL)
6730 {
6731 switch (mode)
6732 {
6733 case CMODEINDEX:
6734 STRNCPY(bt->bt_string, &ks->buf[0], KSSIZE);
6735 break;
6736 case CMODE24:
6737 STRNCPY(bt->bt_string, &ks->vbuf[0], KSSIZE);
6738 break;
6739 default:
6740 STRNCPY(bt->bt_string, &ks->v2buf[0], KSSIZE);
6741 }
6742 }
6743 }
6744
6745 curr_mode = mode;
6746 }
6747 # endif 6715 # endif
6748 } 6716 }
6749 6717
6750 #endif 6718 #endif
6751 6719