To: vim_dev@googlegroups.com Subject: Patch 7.4.1770 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.1770 Problem: Cannot use true color in the terminal. Solution: Add the 'guicolors' option. (Nikolai Pavlov) Files: runtime/doc/options.txt, runtime/doc/term.txt, runtime/doc/various.txt, src/auto/configure, src/config.h.in, src/configure.in, src/eval.c, src/globals.h, src/hardcopy.c, src/option.c, src/option.h, src/proto/term.pro, src/screen.c, src/structs.h, src/syntax.c, src/term.c, src/term.h, src/version.c, src/vim.h *** ../vim-7.4.1769/runtime/doc/options.txt 2016-04-03 22:07:35.262508752 +0200 --- runtime/doc/options.txt 2016-04-21 20:44:51.112092398 +0200 *************** *** 3470,3475 **** --- 3477,3494 ---- This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. + *'guicolors'* *'gcol'* + 'guicolors' 'gcol' boolean (default off) + global + {not in Vi} + {not available when compiled without the + |+termtruecolor| feature} + When on, uses |highlight-guifg| and |highlight-guibg| attributes in + the terminal (thus using 24-bit color). Requires a ISO-8613-3 + compatible terminal. + If setting this option does not work (produces a colorless UI) + reading |xterm-true-color| might help. + *'guicursor'* *'gcr'* *E545* *E546* *E548* *E549* 'guicursor' 'gcr' string (default "n-v-c:block-Cursor/lCursor, ve:ver35-Cursor, *** ../vim-7.4.1769/runtime/doc/term.txt 2015-03-31 18:30:09.135370959 +0200 --- runtime/doc/term.txt 2016-04-21 20:47:54.498251130 +0200 *************** *** 301,306 **** --- 301,312 ---- |xterm-8bit| |v:termresponse| |'ttymouse'| |xterm-codes| t_u7 request cursor position (for xterm) *t_u7* *'t_u7'* see |'ambiwidth'| + t_RB request terminal background color *t_RB* *'t_RB'* + see |'ambiwidth'| + t_8f set foreground color (R, G, B) *t_8f* *'t_8f'* + |xterm-true-color| + t_8b set background color (R, G, B) *t_8b* *'t_8b'* + |xterm-true-color| KEY CODES Note: Use the <> form if possible *************** *** 415,421 **** produce different codes, depending on the mode it is in (8-bit, VT102, VT220, etc.). The result is that codes like are no longer needed. Note: This is only done on startup. If the xterm options are changed after ! Vim has started, the escape sequences may not be recognized any more. *xterm-resize* Window resizing with xterm only works if the allowWindowOps resource is --- 421,443 ---- produce different codes, depending on the mode it is in (8-bit, VT102, VT220, etc.). The result is that codes like are no longer needed. Note: This is only done on startup. If the xterm options are changed after ! Vim has started, the escape sequences may not be recognized anymore. ! ! *xterm-true-color* ! Vim supports using true colors in the terminal (taken from |highlight-guifg| ! and |highlight-guibg|), given that terminal supports this. To make this ! work, 'guicolors' option needs to be set. ! ! Sometimes setting 'guicolors' is not enough and one has to set the |t_8f| and ! |t_8b| options explicitly. Default values of these options are ! `^[[38;2;%lu;%lu;%lum` and `^[[48;2;%lu;%lu;%lum` (replace `^[` with real ! escape) respectively, but it is only set when `$TERM` is `xterm`. Some ! terminals accept the same sequences, but with all semicolons replaced by ! colons (this is actually more compatible, but less widely supported). These ! options contain printf strings, with |printf()| (actually, its C equivalent ! hence `l` modifier) invoked with the t_ option value and three unsigned long ! integers that may have any value between 0 and 255 (inclusive) representing ! red, green and blue colors respectively. *xterm-resize* Window resizing with xterm only works if the allowWindowOps resource is *** ../vim-7.4.1769/runtime/doc/various.txt 2014-08-06 14:52:05.039236174 +0200 --- runtime/doc/various.txt 2016-04-21 20:10:04.017297905 +0200 *************** *** 291,296 **** --- 303,309 ---- in the normal, big and huge versions of Vim. *+feature-list* + *+acl* |ACL| support included *+ARP* Amiga only: ARP support included B *+arabic* |Arabic| language support N *+autocmd* |:autocmd|, automatic commands *************** *** 302,307 **** --- 315,321 ---- B *++builtin_terms* maximal terminals builtin |builtin-terms| N *+byte_offset* support for 'o' flag in 'statusline' option, "go" and ":goto" commands. + m *+channel* inter process communication |channel| N *+cindent* |'cindent'|, C indenting N *+clientserver* Unix and Win32: Remote invocation |clientserver| *+clipboard* |clipboard| support *************** *** 324,331 **** *+dnd* Support for DnD into the "~ register |quote_~|. B *+emacs_tags* |emacs-tags| files N *+eval* expression evaluation |eval.txt| ! N *+ex_extra* Vim's extra Ex commands: |:center|, |:left|, ! |:normal|, |:retab| and |:right| N *+extra_search* |'hlsearch'| and |'incsearch'| options. B *+farsi* |farsi| language N *+file_in_path* |gf|, |CTRL-W_f| and || --- 338,344 ---- *+dnd* Support for DnD into the "~ register |quote_~|. B *+emacs_tags* |emacs-tags| files N *+eval* expression evaluation |eval.txt| ! N *+ex_extra* always on now, used to be for Vim's extra Ex commands N *+extra_search* |'hlsearch'| and |'incsearch'| options. B *+farsi* |farsi| language N *+file_in_path* |gf|, |CTRL-W_f| and || *************** *** 345,350 **** --- 358,364 ---- *+iconv* Compiled with the |iconv()| function *+iconv/dyn* Likewise |iconv-dynamic| |/dyn| N *+insert_expand* |insert_expand| Insert mode completion + m *+job* starting and stopping jobs |job| N *+jumplist* |jumplist| B *+keymap* |'keymap'| B *+langmap* |'langmap'| *************** *** 363,368 **** --- 377,383 ---- N *+mouseshape* |'mouseshape'| B *+mouse_dec* Unix only: Dec terminal mouse handling |dec-mouse| N *+mouse_gpm* Unix only: Linux console mouse handling |gpm-mouse| + N *+mouse_jsbterm* JSB mouse handling |jsbterm-mouse| B *+mouse_netterm* Unix only: netterm mouse handling |netterm-mouse| N *+mouse_pterm* QNX only: pterm mouse handling |qnx-terminal| N *+mouse_sysmouse* Unix only: *BSD console mouse handling |sysmouse| *************** *** 396,402 **** N *+scrollbind* |'scrollbind'| B *+signs* |:sign| N *+smartindent* |'smartindent'| - m *+sniff* SniFF interface |sniff| N *+startuptime* |--startuptime| argument N *+statusline* Options 'statusline', 'rulerformat' and special formats of 'titlestring' and 'iconstring' --- 411,416 ---- *************** *** 410,424 **** m *+tcl/dyn* Tcl interface |tcl-dynamic| |/dyn| *+terminfo* uses |terminfo| instead of termcap N *+termresponse* support for |t_RV| and |v:termresponse| N *+textobjects* |text-objects| selection *+tgetent* non-Unix only: able to use external termcap N *+title* Setting the window 'title' and 'icon' N *+toolbar* |gui-toolbar| N *+user_commands* User-defined commands. |user-commands| N *+viminfo* |'viminfo'| N *+vertsplit* Vertically split windows |:vsplit| N *+virtualedit* |'virtualedit'| ! S *+visual* Visual mode |Visual-mode| N *+visualextra* extra Visual mode commands |blockwise-operators| N *+vreplace* |gR| and |gr| N *+wildignore* |'wildignore'| --- 424,440 ---- m *+tcl/dyn* Tcl interface |tcl-dynamic| |/dyn| *+terminfo* uses |terminfo| instead of termcap N *+termresponse* support for |t_RV| and |v:termresponse| + m *+termtruecolor* 24-bit color in xterm-compatible terminals support N *+textobjects* |text-objects| selection *+tgetent* non-Unix only: able to use external termcap + N *+timers* the |timer_start()| function N *+title* Setting the window 'title' and 'icon' N *+toolbar* |gui-toolbar| N *+user_commands* User-defined commands. |user-commands| N *+viminfo* |'viminfo'| N *+vertsplit* Vertically split windows |:vsplit| N *+virtualedit* |'virtualedit'| ! S *+visual* Visual mode |Visual-mode| Always enabled since 7.4.200. N *+visualextra* extra Visual mode commands |blockwise-operators| N *+vreplace* |gR| and |gr| N *+wildignore* |'wildignore'| *** ../vim-7.4.1769/src/auto/configure 2016-04-21 18:20:03.662235811 +0200 --- src/auto/configure 2016-04-21 20:31:50.435951237 +0200 *************** *** 810,815 **** --- 810,816 ---- enable_rubyinterp with_ruby_command enable_cscope + enable_termtruecolor enable_workshop enable_netbeans enable_channel *************** *** 1476,1481 **** --- 1477,1483 ---- --enable-tclinterp=OPTS Include Tcl interpreter. default=no OPTS=no/yes/dynamic --enable-rubyinterp=OPTS Include Ruby interpreter. default=no OPTS=no/yes/dynamic --enable-cscope Include cscope interface. + --enable-termtruecolor Include support for 24-bit colors in ISO-8613-3 compatible terminals --enable-workshop Include Sun Visual Workshop support. --disable-netbeans Disable NetBeans integration support. --disable-channel Disable process communication support. *************** *** 7216,7221 **** --- 7218,7239 ---- fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-termtruecolor argument" >&5 + $as_echo_n "checking --enable-termtruecolor argument... " >&6; } + # Check whether --enable-termtruecolor was given. + if test "${enable_termtruecolor+set}" = set; then : + enableval=$enable_termtruecolor; + else + enable_termtruecolor="no" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_termtruecolor" >&5 + $as_echo "$enable_termtruecolor" >&6; } + if test "$enable_termtruecolor" = "yes"; then + $as_echo "#define FEAT_TERMTRUECOLOR 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking --enable-workshop argument" >&5 $as_echo_n "checking --enable-workshop argument... " >&6; } # Check whether --enable-workshop was given. *** ../vim-7.4.1769/src/config.h.in 2016-03-11 22:52:00.726438199 +0100 --- src/config.h.in 2016-04-21 20:16:18.193479176 +0200 *************** *** 362,367 **** --- 362,370 ---- /* Define for linking via dlopen() or LoadLibrary() */ #undef DYNAMIC_TCL + /* Define if you want 24-bit colors in ISO-8613-3 compatible terminals. */ + #undef FEAT_TERMTRUECOLOR + /* Define if you want to add support for ACL */ #undef HAVE_POSIX_ACL #undef HAVE_SOLARIS_ZFS_ACL *** ../vim-7.4.1769/src/configure.in 2016-04-21 18:20:03.658235853 +0200 --- src/configure.in 2016-04-21 20:10:04.025297824 +0200 *************** *** 1926,1931 **** --- 1926,1940 ---- AC_DEFINE(FEAT_CSCOPE) fi + AC_MSG_CHECKING(--enable-termtruecolor argument) + AC_ARG_ENABLE(termtruecolor, + [ --enable-termtruecolor Include support for 24-bit colors in ISO-8613-3 compatible terminals], , + [enable_termtruecolor="no"]) + AC_MSG_RESULT($enable_termtruecolor) + if test "$enable_termtruecolor" = "yes"; then + AC_DEFINE(FEAT_TERMTRUECOLOR) + fi + AC_MSG_CHECKING(--enable-workshop argument) AC_ARG_ENABLE(workshop, [ --enable-workshop Include Sun Visual Workshop support.], , *** ../vim-7.4.1769/src/eval.c 2016-04-21 19:38:00.405291024 +0200 --- src/eval.c 2016-04-21 20:10:04.029297783 +0200 *************** *** 14044,14049 **** --- 14044,14052 ---- #ifdef FEAT_TERMRESPONSE "termresponse", #endif + #ifdef FEAT_TERMTRUECOLOR + "termtruecolor", + #endif #ifdef FEAT_TEXTOBJ "textobjects", #endif *** ../vim-7.4.1769/src/globals.h 2016-04-14 16:22:01.161150961 +0200 --- src/globals.h 2016-04-21 20:10:04.029297783 +0200 *************** *** 369,374 **** --- 369,378 ---- EXTERN int cterm_normal_fg_color INIT(= 0); EXTERN int cterm_normal_fg_bold INIT(= 0); EXTERN int cterm_normal_bg_color INIT(= 0); + #ifdef FEAT_TERMTRUECOLOR + EXTERN long_u cterm_normal_fg_gui_color INIT(= INVALCOLOR); + EXTERN long_u cterm_normal_bg_gui_color INIT(= INVALCOLOR); + #endif #ifdef FEAT_AUTOCMD EXTERN int autocmd_busy INIT(= FALSE); /* Is apply_autocmds() busy? */ *** ../vim-7.4.1769/src/hardcopy.c 2016-04-03 14:56:48.441552044 +0200 --- src/hardcopy.c 2016-04-21 20:10:04.029297783 +0200 *************** *** 164,170 **** #if (defined(FEAT_MBYTE) && defined(FEAT_POSTSCRIPT)) || defined(PROTO) /* ! * Parse 'printoptions' and set the flags in "printer_opts". * Returns an error message or NULL; */ char_u * --- 164,170 ---- #if (defined(FEAT_MBYTE) && defined(FEAT_POSTSCRIPT)) || defined(PROTO) /* ! * Parse 'printmbfont' and set the flags in "mbfont_opts". * Returns an error message or NULL; */ char_u * *************** *** 307,314 **** pattr->underline = (highlight_has_attr(hl_id, HL_UNDERLINE, modec) != NULL); pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL); ! # ifdef FEAT_GUI ! if (gui.in_use) { bg_color = highlight_gui_color_rgb(hl_id, FALSE); if (bg_color == PRCOLOR_BLACK) --- 307,314 ---- pattr->underline = (highlight_has_attr(hl_id, HL_UNDERLINE, modec) != NULL); pattr->undercurl = (highlight_has_attr(hl_id, HL_UNDERCURL, modec) != NULL); ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) ! if (USE_24BIT) { bg_color = highlight_gui_color_rgb(hl_id, FALSE); if (bg_color == PRCOLOR_BLACK) *** ../vim-7.4.1769/src/option.c 2016-04-20 16:19:10.030987632 +0200 --- src/option.c 2016-04-21 20:18:49.531933705 +0200 *************** *** 1305,1311 **** {(char_u *)NULL, (char_u *)0L} #endif SCRIPTID_INIT}, ! {"guicursor", "gcr", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP, #ifdef CURSOR_SHAPE (char_u *)&p_guicursor, PV_NONE, { --- 1305,1320 ---- {(char_u *)NULL, (char_u *)0L} #endif SCRIPTID_INIT}, ! {"guicolors", "gcol", P_BOOL|P_VI_DEF|P_VIM|P_RCLR, ! #ifdef FEAT_TERMTRUECOLOR ! (char_u *)&p_guicolors, PV_NONE, ! {(char_u *)FALSE, (char_u *)FALSE} ! #else ! (char_u*)NULL, PV_NONE, ! {(char_u *)FALSE, (char_u *)FALSE} ! #endif ! SCRIPTID_INIT}, ! {"guicursor", "gcr", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP, #ifdef CURSOR_SHAPE (char_u *)&p_guicursor, PV_NONE, { *************** *** 3011,3016 **** --- 3020,3027 ---- p_term("t_xs", T_XS) p_term("t_ZH", T_CZH) p_term("t_ZR", T_CZR) + p_term("t_8f", T_8F) + p_term("t_8b", T_8B) /* terminal key codes are not in here */ *************** *** 8353,8358 **** --- 8364,8380 ---- #endif + #ifdef FEAT_TERMTRUECOLOR + /* 'guicolors' */ + else if ((int *)varp == &p_guicolors) + { + # ifdef FEAT_GUI + if (!gui.in_use && !gui.starting) + # endif + highlight_gui_started(); + } + #endif + /* * End of handling side effects for bool options. */ *** ../vim-7.4.1769/src/option.h 2016-03-19 22:11:47.436674835 +0100 --- src/option.h 2016-04-21 20:10:04.033297743 +0200 *************** *** 527,532 **** --- 527,535 ---- EXTERN char_u *p_header; /* 'printheader' */ #endif EXTERN int p_prompt; /* 'prompt' */ + #ifdef FEAT_TERMTRUECOLOR + EXTERN int p_guicolors; /* 'guicolors' */ + #endif #ifdef FEAT_GUI EXTERN char_u *p_guifont; /* 'guifont' */ # ifdef FEAT_XFONTSET *** ../vim-7.4.1769/src/proto/term.pro 2016-01-19 13:21:55.849334247 +0100 --- src/proto/term.pro 2016-04-21 20:31:37.160087046 +0200 *************** *** 1,4 **** --- 1,7 ---- /* term.c */ + guicolor_T termtrue_mch_get_color(char_u *name); + guicolor_T termtrue_get_color(char_u *name); + long_u termtrue_mch_get_rgb(guicolor_T color); int set_termname(char_u *term); void set_mouse_termcode(int n, char_u *s); void del_mouse_termcode(int n); *************** *** 22,27 **** --- 25,32 ---- void term_set_winsize(int width, int height); void term_fg_color(int n); void term_bg_color(int n); + void term_fg_rgb_color(long_u rgb); + void term_bg_rgb_color(long_u rgb); void term_settitle(char_u *title); void ttest(int pairs); void add_long_to_buf(long_u val, char_u *dst); *** ../vim-7.4.1769/src/screen.c 2016-04-14 19:48:54.805601567 +0200 --- src/screen.c 2016-04-21 20:10:04.033297743 +0200 *************** *** 7828,7834 **** { if (attr > HL_ALL) /* special HL attr. */ { ! if (t_colors > 1) aep = syn_cterm_attr2entry(attr); else aep = syn_term_attr2entry(attr); --- 7828,7834 ---- { if (attr > HL_ALL) /* special HL attr. */ { ! if (IS_CTERM) aep = syn_cterm_attr2entry(attr); else aep = syn_term_attr2entry(attr); *************** *** 7839,7846 **** } if ((attr & HL_BOLD) && T_MD != NULL) /* bold */ out_str(T_MD); ! else if (aep != NULL && t_colors > 1 && aep->ae_u.cterm.fg_color ! && cterm_normal_fg_bold) /* If the Normal FG color has BOLD attribute and the new HL * has a FG color defined, clear BOLD. */ out_str(T_ME); --- 7839,7854 ---- } if ((attr & HL_BOLD) && T_MD != NULL) /* bold */ out_str(T_MD); ! else if (aep != NULL && cterm_normal_fg_bold && ! #ifdef FEAT_TERMTRUECOLOR ! (p_guicolors ? ! (aep->ae_u.cterm.fg_rgb != INVALCOLOR): ! #endif ! (t_colors > 1 && aep->ae_u.cterm.fg_color) ! #ifdef FEAT_TERMTRUECOLOR ! ) ! #endif ! ) /* If the Normal FG color has BOLD attribute and the new HL * has a FG color defined, clear BOLD. */ out_str(T_ME); *************** *** 7860,7876 **** */ if (aep != NULL) { ! if (t_colors > 1) { ! if (aep->ae_u.cterm.fg_color) ! term_fg_color(aep->ae_u.cterm.fg_color - 1); ! if (aep->ae_u.cterm.bg_color) ! term_bg_color(aep->ae_u.cterm.bg_color - 1); } else { ! if (aep->ae_u.term.start != NULL) ! out_str(aep->ae_u.term.start); } } } --- 7868,7896 ---- */ if (aep != NULL) { ! #ifdef FEAT_TERMTRUECOLOR ! if (p_guicolors) { ! if (aep->ae_u.cterm.fg_rgb != INVALCOLOR) ! term_fg_rgb_color(aep->ae_u.cterm.fg_rgb); ! if (aep->ae_u.cterm.bg_rgb != INVALCOLOR) ! term_bg_rgb_color(aep->ae_u.cterm.bg_rgb); } else + #endif { ! if (t_colors > 1) ! { ! if (aep->ae_u.cterm.fg_color) ! term_fg_color(aep->ae_u.cterm.fg_color - 1); ! if (aep->ae_u.cterm.bg_color) ! term_bg_color(aep->ae_u.cterm.bg_color - 1); ! } ! else ! { ! if (aep->ae_u.term.start != NULL) ! out_str(aep->ae_u.term.start); ! } } } } *************** *** 7904,7917 **** { attrentry_T *aep; ! if (t_colors > 1) { /* * Assume that t_me restores the original colors! */ aep = syn_cterm_attr2entry(screen_attr); ! if (aep != NULL && (aep->ae_u.cterm.fg_color ! || aep->ae_u.cterm.bg_color)) do_ME = TRUE; } else --- 7924,7946 ---- { attrentry_T *aep; ! if (IS_CTERM) { /* * Assume that t_me restores the original colors! */ aep = syn_cterm_attr2entry(screen_attr); ! if (aep != NULL && ! #ifdef FEAT_TERMTRUECOLOR ! (p_guicolors ? ! (aep->ae_u.cterm.fg_rgb != INVALCOLOR || ! aep->ae_u.cterm.bg_rgb != INVALCOLOR): ! #endif ! (aep->ae_u.cterm.fg_color || aep->ae_u.cterm.bg_color) ! #ifdef FEAT_TERMTRUECOLOR ! ) ! #endif ! ) do_ME = TRUE; } else *************** *** 7959,7973 **** if (do_ME || (screen_attr & (HL_BOLD | HL_INVERSE))) out_str(T_ME); ! if (t_colors > 1) { ! /* set Normal cterm colors */ ! if (cterm_normal_fg_color != 0) ! term_fg_color(cterm_normal_fg_color - 1); ! if (cterm_normal_bg_color != 0) ! term_bg_color(cterm_normal_bg_color - 1); ! if (cterm_normal_fg_bold) ! out_str(T_MD); } } } --- 7988,8014 ---- if (do_ME || (screen_attr & (HL_BOLD | HL_INVERSE))) out_str(T_ME); ! #ifdef FEAT_TERMTRUECOLOR ! if (p_guicolors) { ! if (cterm_normal_fg_gui_color != INVALCOLOR) ! term_fg_rgb_color(cterm_normal_fg_gui_color); ! if (cterm_normal_bg_gui_color != INVALCOLOR) ! term_bg_rgb_color(cterm_normal_bg_gui_color); ! } ! else ! #endif ! { ! if (t_colors > 1) ! { ! /* set Normal cterm colors */ ! if (cterm_normal_fg_color != 0) ! term_fg_color(cterm_normal_fg_color - 1); ! if (cterm_normal_bg_color != 0) ! term_bg_color(cterm_normal_bg_color - 1); ! if (cterm_normal_fg_bold) ! out_str(T_MD); ! } } } } *************** *** 7981,7990 **** void reset_cterm_colors(void) { ! if (t_colors > 1) { /* set Normal cterm colors */ if (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0) { out_str(T_OP); screen_attr = -1; --- 8022,8038 ---- void reset_cterm_colors(void) { ! if (IS_CTERM) { /* set Normal cterm colors */ + #ifdef FEAT_TERMTRUECOLOR + if (p_guicolors ? + (cterm_normal_fg_gui_color != INVALCOLOR + || cterm_normal_bg_gui_color != INVALCOLOR): + (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0)) + #else if (cterm_normal_fg_color > 0 || cterm_normal_bg_color > 0) + #endif { out_str(T_OP); screen_attr = -1; *************** *** 8228,8234 **** #ifdef FEAT_GUI !gui.in_use && #endif ! t_colors <= 1); for (row = start_row; row < end_row; ++row) { #ifdef FEAT_MBYTE --- 8276,8282 ---- #ifdef FEAT_GUI !gui.in_use && #endif ! !IS_CTERM); for (row = start_row; row < end_row; ++row) { #ifdef FEAT_MBYTE *************** *** 8911,8916 **** --- 8959,8967 ---- #ifdef FEAT_GUI || gui.in_use #endif + #ifdef FEAT_TERMTRUECOLOR + || (p_guicolors && cterm_normal_bg_gui_color != INVALCOLOR) + #endif || cterm_normal_bg_color == 0 || *T_UT != NUL)); } *************** *** 10242,10247 **** --- 10293,10301 ---- #ifdef FEAT_GUI && !gui.in_use #endif + #ifdef FEAT_TERMTRUECOLOR + && !p_guicolors + #endif ); redraw_tabline = FALSE; *** ../vim-7.4.1769/src/structs.h 2016-04-08 17:07:09.546160667 +0200 --- src/structs.h 2016-04-21 20:10:04.033297743 +0200 *************** *** 84,90 **** # ifdef FEAT_XCLIPBOARD # include # endif ! # define guicolor_T int /* avoid error in prototypes */ #endif /* --- 84,92 ---- # ifdef FEAT_XCLIPBOARD # include # endif ! # define guicolor_T long_u /* avoid error in prototypes and ! * make FEAT_TERMTRUECOLOR work */ ! # define INVALCOLOR ((guicolor_T)0x1ffffff) #endif /* *************** *** 911,916 **** --- 913,922 ---- /* These colors need to be > 8 bits to hold 256. */ short_u fg_color; /* foreground color number */ short_u bg_color; /* background color number */ + # ifdef FEAT_TERMTRUECOLOR + long_u fg_rgb; /* foreground color RGB */ + long_u bg_rgb; /* background color RGB */ + # endif } cterm; # ifdef FEAT_GUI struct *** ../vim-7.4.1769/src/syntax.c 2016-04-02 19:01:53.471779187 +0200 --- src/syntax.c 2016-04-21 20:25:45.423683979 +0200 *************** *** 33,42 **** int sg_cterm_fg; /* terminal fg color number + 1 */ int sg_cterm_bg; /* terminal bg color number + 1 */ int sg_cterm_attr; /* Screen attr for color term mode */ - #ifdef FEAT_GUI /* for when using the GUI */ guicolor_T sg_gui_fg; /* GUI foreground color handle */ guicolor_T sg_gui_bg; /* GUI background color handle */ guicolor_T sg_gui_sp; /* GUI special color handle */ GuiFont sg_font; /* GUI font handle */ #ifdef FEAT_XFONTSET --- 33,44 ---- int sg_cterm_fg; /* terminal fg color number + 1 */ int sg_cterm_bg; /* terminal bg color number + 1 */ int sg_cterm_attr; /* Screen attr for color term mode */ /* for when using the GUI */ + #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) guicolor_T sg_gui_fg; /* GUI foreground color handle */ guicolor_T sg_gui_bg; /* GUI background color handle */ + #endif + #ifdef FEAT_GUI guicolor_T sg_gui_sp; /* GUI special color handle */ GuiFont sg_font; /* GUI font handle */ #ifdef FEAT_XFONTSET *************** *** 97,106 **** static int hl_has_settings(int idx, int check_link); static void highlight_clear(int idx); ! #ifdef FEAT_GUI static void gui_do_one_color(int idx, int do_menu, int do_tooltip); - static int set_group_colors(char_u *name, guicolor_T *fgp, guicolor_T *bgp, int do_menu, int use_norm, int do_tooltip); static guicolor_T color_name2handle(char_u *name); static GuiFont font_name2handle(char_u *name); # ifdef FEAT_XFONTSET static GuiFontset fontset_name2handle(char_u *name, int fixed_width); --- 99,110 ---- static int hl_has_settings(int idx, int check_link); static void highlight_clear(int idx); ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) static void gui_do_one_color(int idx, int do_menu, int do_tooltip); static guicolor_T color_name2handle(char_u *name); + #endif + #ifdef FEAT_GUI + static int set_group_colors(char_u *name, guicolor_T *fgp, guicolor_T *bgp, int do_menu, int use_norm, int do_tooltip); static GuiFont font_name2handle(char_u *name); # ifdef FEAT_XFONTSET static GuiFontset fontset_name2handle(char_u *name, int fixed_width); *************** *** 7333,7340 **** for (idx = 0; idx < highlight_ga.ga_len; ++idx) highlight_clear(idx); init_highlight(TRUE, TRUE); ! #ifdef FEAT_GUI ! if (gui.in_use) highlight_gui_started(); #endif highlight_changed(); --- 7337,7344 ---- for (idx = 0; idx < highlight_ga.ga_len; ++idx) highlight_clear(idx); init_highlight(TRUE, TRUE); ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) ! if (USE_24BIT) highlight_gui_started(); #endif highlight_changed(); *************** *** 7788,7797 **** if (!init) HL_TABLE()[idx].sg_set |= SG_GUI; ! # ifdef FEAT_GUI /* In GUI guifg colors are only used when recognized */ i = color_name2handle(arg); ! if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use) { HL_TABLE()[idx].sg_gui_fg = i; # endif --- 7792,7807 ---- if (!init) HL_TABLE()[idx].sg_set |= SG_GUI; ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) /* In GUI guifg colors are only used when recognized */ i = color_name2handle(arg); ! if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 ! # ifdef FEAT_GUI ! || !(USE_24BIT) ! # else ! || !p_guicolors ! # endif ! ) { HL_TABLE()[idx].sg_gui_fg = i; # endif *************** *** 7800,7806 **** HL_TABLE()[idx].sg_gui_fg_name = vim_strsave(arg); else HL_TABLE()[idx].sg_gui_fg_name = NULL; ! # ifdef FEAT_GUI # ifdef FEAT_GUI_X11 if (is_menu_group) gui.menu_fg_pixel = i; --- 7810,7816 ---- HL_TABLE()[idx].sg_gui_fg_name = vim_strsave(arg); else HL_TABLE()[idx].sg_gui_fg_name = NULL; ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) # ifdef FEAT_GUI_X11 if (is_menu_group) gui.menu_fg_pixel = i; *************** *** 7825,7834 **** if (!init) HL_TABLE()[idx].sg_set |= SG_GUI; ! # ifdef FEAT_GUI /* In GUI guifg colors are only used when recognized */ i = color_name2handle(arg); ! if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !gui.in_use) { HL_TABLE()[idx].sg_gui_bg = i; # endif --- 7835,7844 ---- if (!init) HL_TABLE()[idx].sg_set |= SG_GUI; ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) /* In GUI guifg colors are only used when recognized */ i = color_name2handle(arg); ! if (i != INVALCOLOR || STRCMP(arg, "NONE") == 0 || !USE_24BIT) { HL_TABLE()[idx].sg_gui_bg = i; # endif *************** *** 7837,7843 **** HL_TABLE()[idx].sg_gui_bg_name = vim_strsave(arg); else HL_TABLE()[idx].sg_gui_bg_name = NULL; ! # ifdef FEAT_GUI # ifdef FEAT_GUI_X11 if (is_menu_group) gui.menu_bg_pixel = i; --- 7847,7853 ---- HL_TABLE()[idx].sg_gui_bg_name = vim_strsave(arg); else HL_TABLE()[idx].sg_gui_bg_name = NULL; ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) # ifdef FEAT_GUI_X11 if (is_menu_group) gui.menu_bg_pixel = i; *************** *** 7997,8003 **** * Need to update all groups, because they might be using "bg" * and/or "fg", which have been changed now. */ ! if (gui.in_use) highlight_gui_started(); #endif } --- 8007,8015 ---- * Need to update all groups, because they might be using "bg" * and/or "fg", which have been changed now. */ ! #endif ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) ! if (USE_24BIT) highlight_gui_started(); #endif } *************** *** 8068,8073 **** --- 8080,8089 ---- cterm_normal_fg_color = 0; cterm_normal_fg_bold = 0; cterm_normal_bg_color = 0; + # ifdef FEAT_TERMTRUECOLOR + cterm_normal_fg_gui_color = INVALCOLOR; + cterm_normal_bg_gui_color = INVALCOLOR; + # endif #endif } *************** *** 8118,8126 **** vim_free(HL_TABLE()[idx].sg_gui_sp_name); HL_TABLE()[idx].sg_gui_sp_name = NULL; #endif ! #ifdef FEAT_GUI HL_TABLE()[idx].sg_gui_fg = INVALCOLOR; HL_TABLE()[idx].sg_gui_bg = INVALCOLOR; HL_TABLE()[idx].sg_gui_sp = INVALCOLOR; gui_mch_free_font(HL_TABLE()[idx].sg_font); HL_TABLE()[idx].sg_font = NOFONT; --- 8134,8144 ---- vim_free(HL_TABLE()[idx].sg_gui_sp_name); HL_TABLE()[idx].sg_gui_sp_name = NULL; #endif ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) HL_TABLE()[idx].sg_gui_fg = INVALCOLOR; HL_TABLE()[idx].sg_gui_bg = INVALCOLOR; + #endif + #ifdef FEAT_GUI HL_TABLE()[idx].sg_gui_sp = INVALCOLOR; gui_mch_free_font(HL_TABLE()[idx].sg_font); HL_TABLE()[idx].sg_font = NOFONT; *************** *** 8140,8146 **** #endif } ! #if defined(FEAT_GUI) || defined(PROTO) /* * Set the normal foreground and background colors according to the "Normal" * highlighting group. For X11 also set "Menu", "Scrollbar", and --- 8158,8164 ---- #endif } ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO) /* * Set the normal foreground and background colors according to the "Normal" * highlighting group. For X11 also set "Menu", "Scrollbar", and *************** *** 8149,8192 **** void set_normal_colors(void) { ! if (set_group_colors((char_u *)"Normal", ! &gui.norm_pixel, &gui.back_pixel, ! FALSE, TRUE, FALSE)) ! { ! gui_mch_new_colors(); ! must_redraw = CLEAR; ! } ! #ifdef FEAT_GUI_X11 ! if (set_group_colors((char_u *)"Menu", ! &gui.menu_fg_pixel, &gui.menu_bg_pixel, ! TRUE, FALSE, FALSE)) ! { ! # ifdef FEAT_MENU ! gui_mch_new_menu_colors(); # endif - must_redraw = CLEAR; - } - # ifdef FEAT_BEVAL - if (set_group_colors((char_u *)"Tooltip", - &gui.tooltip_fg_pixel, &gui.tooltip_bg_pixel, - FALSE, FALSE, TRUE)) { ! # ifdef FEAT_TOOLBAR ! gui_mch_new_tooltip_colors(); # endif - must_redraw = CLEAR; } #endif ! if (set_group_colors((char_u *)"Scrollbar", ! &gui.scroll_fg_pixel, &gui.scroll_bg_pixel, ! FALSE, FALSE, FALSE)) { ! gui_new_scrollbar_colors(); ! must_redraw = CLEAR; } #endif } /* * Set the colors for "Normal", "Menu", "Tooltip" or "Scrollbar". */ --- 8167,8244 ---- void set_normal_colors(void) { ! #ifdef FEAT_GUI ! # ifdef FEAT_TERMTRUECOLOR ! if (gui.in_use) # endif { ! if (set_group_colors((char_u *)"Normal", ! &gui.norm_pixel, &gui.back_pixel, ! FALSE, TRUE, FALSE)) ! { ! gui_mch_new_colors(); ! must_redraw = CLEAR; ! } ! # ifdef FEAT_GUI_X11 ! if (set_group_colors((char_u *)"Menu", ! &gui.menu_fg_pixel, &gui.menu_bg_pixel, ! TRUE, FALSE, FALSE)) ! { ! # ifdef FEAT_MENU ! gui_mch_new_menu_colors(); ! # endif ! must_redraw = CLEAR; ! } ! # ifdef FEAT_BEVAL ! if (set_group_colors((char_u *)"Tooltip", ! &gui.tooltip_fg_pixel, &gui.tooltip_bg_pixel, ! FALSE, FALSE, TRUE)) ! { ! # ifdef FEAT_TOOLBAR ! gui_mch_new_tooltip_colors(); ! # endif ! must_redraw = CLEAR; ! } ! # endif ! if (set_group_colors((char_u *)"Scrollbar", ! &gui.scroll_fg_pixel, &gui.scroll_bg_pixel, ! FALSE, FALSE, FALSE)) ! { ! gui_new_scrollbar_colors(); ! must_redraw = CLEAR; ! } # endif } #endif ! #ifdef FEAT_TERMTRUECOLOR ! # ifdef FEAT_GUI ! else ! # endif { ! int idx; ! ! idx = syn_name2id((char_u *)"Normal") - 1; ! if (idx >= 0) ! { ! gui_do_one_color(idx, FALSE, FALSE); ! ! if (HL_TABLE()[idx].sg_gui_fg != INVALCOLOR) ! { ! cterm_normal_fg_gui_color = HL_TABLE()[idx].sg_gui_fg; ! must_redraw = CLEAR; ! } ! if (HL_TABLE()[idx].sg_gui_bg != INVALCOLOR) ! { ! cterm_normal_bg_gui_color = HL_TABLE()[idx].sg_gui_bg; ! must_redraw = CLEAR; ! } ! } } #endif } + #endif + #if defined(FEAT_GUI) || defined(PROTO) /* * Set the colors for "Normal", "Menu", "Tooltip" or "Scrollbar". */ *************** *** 8299,8322 **** } /* - * Return the handle for a color name. - * Returns INVALCOLOR when failed. - */ - static guicolor_T - color_name2handle(char_u *name) - { - if (STRCMP(name, "NONE") == 0) - return INVALCOLOR; - - if (STRICMP(name, "fg") == 0 || STRICMP(name, "foreground") == 0) - return gui.norm_pixel; - if (STRICMP(name, "bg") == 0 || STRICMP(name, "background") == 0) - return gui.back_pixel; - - return gui_get_color(name); - } - - /* * Return the handle for a font name. * Returns NOFONT when failed. */ --- 8351,8356 ---- *************** *** 8439,8444 **** --- 8473,8524 ---- #endif /* FEAT_GUI */ + #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO) + /* + * Return the handle for a color name. + * Returns INVALCOLOR when failed. + */ + static guicolor_T + color_name2handle(char_u *name) + { + if (STRCMP(name, "NONE") == 0) + return INVALCOLOR; + + if (STRICMP(name, "fg") == 0 || STRICMP(name, "foreground") == 0) + { + #if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI) + if (gui.in_use) + #endif + #ifdef FEAT_GUI + return gui.norm_pixel; + #endif + #if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI) + else + #endif + #ifdef FEAT_TERMTRUECOLOR + return cterm_normal_fg_gui_color; + #endif + } + if (STRICMP(name, "bg") == 0 || STRICMP(name, "background") == 0) + { + #if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI) + if (gui.in_use) + #endif + #ifdef FEAT_GUI + return gui.back_pixel; + #endif + #if defined(FEAT_TERMTRUECOLOR) && defined(FEAT_GUI) + else + #endif + #ifdef FEAT_TERMTRUECOLOR + return cterm_normal_bg_gui_color; + #endif + } + + return GUI_GET_COLOR(name); + } + #endif + /* * Table with the specifications for an attribute number. * Note that this table is used by ALL buffers. This is required because the *************** *** 8514,8521 **** && aep->ae_u.cterm.fg_color == taep->ae_u.cterm.fg_color && aep->ae_u.cterm.bg_color ! == taep->ae_u.cterm.bg_color) ! )) return i + ATTR_OFF; } --- 8594,8608 ---- && aep->ae_u.cterm.fg_color == taep->ae_u.cterm.fg_color && aep->ae_u.cterm.bg_color ! == taep->ae_u.cterm.bg_color ! #ifdef FEAT_TERMTRUECOLOR ! && aep->ae_u.cterm.fg_rgb ! == taep->ae_u.cterm.fg_rgb ! && aep->ae_u.cterm.bg_rgb ! == taep->ae_u.cterm.bg_rgb ! #endif ! ! ))) return i + ATTR_OFF; } *************** *** 8580,8585 **** --- 8667,8676 ---- { taep->ae_u.cterm.fg_color = aep->ae_u.cterm.fg_color; taep->ae_u.cterm.bg_color = aep->ae_u.cterm.bg_color; + #ifdef FEAT_TERMTRUECOLOR + taep->ae_u.cterm.fg_rgb = aep->ae_u.cterm.fg_rgb; + taep->ae_u.cterm.bg_rgb = aep->ae_u.cterm.bg_rgb; + #endif } ++table->ga_len; return (table->ga_len - 1 + ATTR_OFF); *************** *** 8671,8677 **** } #endif ! if (t_colors > 1) { if (char_attr > HL_ALL) char_aep = syn_cterm_attr2entry(char_attr); --- 8762,8768 ---- } #endif ! if (IS_CTERM) { if (char_attr > HL_ALL) char_aep = syn_cterm_attr2entry(char_attr); *************** *** 8696,8701 **** --- 8787,8798 ---- new_en.ae_u.cterm.fg_color = spell_aep->ae_u.cterm.fg_color; if (spell_aep->ae_u.cterm.bg_color > 0) new_en.ae_u.cterm.bg_color = spell_aep->ae_u.cterm.bg_color; + #ifdef FEAT_TERMTRUECOLOR + if (spell_aep->ae_u.cterm.fg_rgb != INVALCOLOR) + new_en.ae_u.cterm.fg_rgb = spell_aep->ae_u.cterm.fg_rgb; + if (spell_aep->ae_u.cterm.bg_rgb != INVALCOLOR) + new_en.ae_u.cterm.bg_rgb = spell_aep->ae_u.cterm.bg_rgb; + #endif } } return get_attr_entry(&cterm_attr_table, &new_en); *************** *** 8757,8766 **** aep = syn_gui_attr2entry(attr); else #endif ! if (t_colors > 1) ! aep = syn_cterm_attr2entry(attr); ! else ! aep = syn_term_attr2entry(attr); if (aep == NULL) /* highlighting not set */ return 0; --- 8854,8863 ---- aep = syn_gui_attr2entry(attr); else #endif ! if (IS_CTERM) ! aep = syn_cterm_attr2entry(attr); ! else ! aep = syn_term_attr2entry(attr); if (aep == NULL) /* highlighting not set */ return 0; *************** *** 8959,8971 **** return NULL; if (modec == 'g') { ! # ifdef FEAT_GUI /* return font name */ if (font) return HL_TABLE()[id - 1].sg_font_name; /* return #RRGGBB form (only possible when GUI is running) */ ! if (gui.in_use && what[2] == '#') { guicolor_T color; long_u rgb; --- 9056,9070 ---- return NULL; if (modec == 'g') { ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) ! # ifdef FEAT_GUI /* return font name */ if (font) return HL_TABLE()[id - 1].sg_font_name; + # endif /* return #RRGGBB form (only possible when GUI is running) */ ! if ((USE_24BIT) && what[2] == '#') { guicolor_T color; long_u rgb; *************** *** 8974,8992 **** if (fg) color = HL_TABLE()[id - 1].sg_gui_fg; else if (sp) color = HL_TABLE()[id - 1].sg_gui_sp; else color = HL_TABLE()[id - 1].sg_gui_bg; if (color == INVALCOLOR) return NULL; ! rgb = gui_mch_get_rgb(color); sprintf((char *)buf, "#%02x%02x%02x", (unsigned)(rgb >> 16), (unsigned)(rgb >> 8) & 255, (unsigned)rgb & 255); return buf; } ! #endif if (fg) return (HL_TABLE()[id - 1].sg_gui_fg_name); if (sp) --- 9073,9095 ---- if (fg) color = HL_TABLE()[id - 1].sg_gui_fg; else if (sp) + # ifdef FEAT_GUI color = HL_TABLE()[id - 1].sg_gui_sp; + # else + color = INVALCOLOR; + # endif else color = HL_TABLE()[id - 1].sg_gui_bg; if (color == INVALCOLOR) return NULL; ! rgb = GUI_MCH_GET_RGB(color); sprintf((char *)buf, "#%02x%02x%02x", (unsigned)(rgb >> 16), (unsigned)(rgb >> 8) & 255, (unsigned)rgb & 255); return buf; } ! # endif if (fg) return (HL_TABLE()[id - 1].sg_gui_fg_name); if (sp) *************** *** 9011,9018 **** } #endif ! #if (defined(FEAT_SYN_HL) && defined(FEAT_GUI) && defined(FEAT_PRINTER)) \ ! || defined(PROTO) /* * Return color name of highlight group "id" as RGB value. */ --- 9114,9122 ---- } #endif ! #if (defined(FEAT_SYN_HL) \ ! && (defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR)) \ ! && defined(FEAT_PRINTER)) || defined(PROTO) /* * Return color name of highlight group "id" as RGB value. */ *************** *** 9034,9040 **** if (color == INVALCOLOR) return 0L; ! return gui_mch_get_rgb(color); } #endif --- 9138,9144 ---- if (color == INVALCOLOR) return 0L; ! return GUI_MCH_GET_RGB(color); } #endif *************** *** 9150,9162 **** * For the color term mode: If there are other than "normal" * highlighting attributes, need to allocate an attr number. */ ! if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0) sgp->sg_cterm_attr = sgp->sg_cterm; else { at_en.ae_attr = sgp->sg_cterm; at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg; at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg; sgp->sg_cterm_attr = get_attr_entry(&cterm_attr_table, &at_en); } } --- 9254,9275 ---- * For the color term mode: If there are other than "normal" * highlighting attributes, need to allocate an attr number. */ ! if (sgp->sg_cterm_fg == 0 && sgp->sg_cterm_bg == 0 ! # ifdef FEAT_TERMTRUECOLOR ! && sgp->sg_gui_fg == INVALCOLOR ! && sgp->sg_gui_bg == INVALCOLOR ! # endif ! ) sgp->sg_cterm_attr = sgp->sg_cterm; else { at_en.ae_attr = sgp->sg_cterm; at_en.ae_u.cterm.fg_color = sgp->sg_cterm_fg; at_en.ae_u.cterm.bg_color = sgp->sg_cterm_bg; + # ifdef FEAT_TERMTRUECOLOR + at_en.ae_u.cterm.fg_rgb = GUI_MCH_GET_RGB(sgp->sg_gui_fg); + at_en.ae_u.cterm.bg_rgb = GUI_MCH_GET_RGB(sgp->sg_gui_bg); + # endif sgp->sg_cterm_attr = get_attr_entry(&cterm_attr_table, &at_en); } } *************** *** 9307,9316 **** vim_memset(&(HL_TABLE()[highlight_ga.ga_len]), 0, sizeof(struct hl_group)); HL_TABLE()[highlight_ga.ga_len].sg_name = name; HL_TABLE()[highlight_ga.ga_len].sg_name_u = vim_strsave_up(name); ! #ifdef FEAT_GUI HL_TABLE()[highlight_ga.ga_len].sg_gui_bg = INVALCOLOR; HL_TABLE()[highlight_ga.ga_len].sg_gui_fg = INVALCOLOR; HL_TABLE()[highlight_ga.ga_len].sg_gui_sp = INVALCOLOR; #endif ++highlight_ga.ga_len; --- 9420,9431 ---- vim_memset(&(HL_TABLE()[highlight_ga.ga_len]), 0, sizeof(struct hl_group)); HL_TABLE()[highlight_ga.ga_len].sg_name = name; HL_TABLE()[highlight_ga.ga_len].sg_name_u = vim_strsave_up(name); ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) HL_TABLE()[highlight_ga.ga_len].sg_gui_bg = INVALCOLOR; HL_TABLE()[highlight_ga.ga_len].sg_gui_fg = INVALCOLOR; + # ifdef FEAT_GUI HL_TABLE()[highlight_ga.ga_len].sg_gui_sp = INVALCOLOR; + # endif #endif ++highlight_ga.ga_len; *************** *** 9349,9355 **** attr = sgp->sg_gui_attr; else #endif ! if (t_colors > 1) attr = sgp->sg_cterm_attr; else attr = sgp->sg_term_attr; --- 9464,9470 ---- attr = sgp->sg_gui_attr; else #endif ! if (IS_CTERM) attr = sgp->sg_cterm_attr; else attr = sgp->sg_term_attr; *************** *** 9403,9409 **** return hl_id; } ! #ifdef FEAT_GUI /* * Call this function just after the GUI has started. * It finds the font and color handles for the highlighting groups. --- 9518,9524 ---- return hl_id; } ! #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) /* * Call this function just after the GUI has started. * It finds the font and color handles for the highlighting groups. *************** *** 9414,9420 **** int idx; /* First get the colors from the "Normal" and "Menu" group, if set */ ! set_normal_colors(); for (idx = 0; idx < highlight_ga.ga_len; ++idx) gui_do_one_color(idx, FALSE, FALSE); --- 9529,9540 ---- int idx; /* First get the colors from the "Normal" and "Menu" group, if set */ ! # if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) ! # ifdef FEAT_TERMTRUECOLOR ! if (USE_24BIT) ! # endif ! set_normal_colors(); ! # endif for (idx = 0; idx < highlight_ga.ga_len; ++idx) gui_do_one_color(idx, FALSE, FALSE); *************** *** 9430,9441 **** { int didit = FALSE; ! if (HL_TABLE()[idx].sg_font_name != NULL) ! { ! hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu, do_tooltip, TRUE); ! didit = TRUE; ! } if (HL_TABLE()[idx].sg_gui_fg_name != NULL) { HL_TABLE()[idx].sg_gui_fg = --- 9550,9566 ---- { int didit = FALSE; ! # ifdef FEAT_GUI ! # ifdef FEAT_TERMTRUECOLOR ! if (gui.in_use) ! # endif ! if (HL_TABLE()[idx].sg_font_name != NULL) ! { ! hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu, do_tooltip, TRUE); ! didit = TRUE; ! } ! # endif if (HL_TABLE()[idx].sg_gui_fg_name != NULL) { HL_TABLE()[idx].sg_gui_fg = *************** *** 9448,9463 **** color_name2handle(HL_TABLE()[idx].sg_gui_bg_name); didit = TRUE; } if (HL_TABLE()[idx].sg_gui_sp_name != NULL) { HL_TABLE()[idx].sg_gui_sp = color_name2handle(HL_TABLE()[idx].sg_gui_sp_name); didit = TRUE; } if (didit) /* need to get a new attr number */ set_hl_attr(idx); } - #endif /* --- 9573,9589 ---- color_name2handle(HL_TABLE()[idx].sg_gui_bg_name); didit = TRUE; } + # ifdef FEAT_GUI if (HL_TABLE()[idx].sg_gui_sp_name != NULL) { HL_TABLE()[idx].sg_gui_sp = color_name2handle(HL_TABLE()[idx].sg_gui_sp_name); didit = TRUE; } + # endif if (didit) /* need to get a new attr number */ set_hl_attr(idx); } #endif /* *** ../vim-7.4.1769/src/term.c 2016-03-19 22:11:47.432674878 +0100 --- src/term.c 2016-04-21 20:39:13.499478450 +0200 *************** *** 77,82 **** --- 77,85 ---- static struct builtin_term *find_builtin_term(char_u *name); static void parse_builtin_tcap(char_u *s); static void term_color(char_u *s, int n); + #ifdef FEAT_TERMTRUECOLOR + static void term_rgb_color(char_u *s, long_u rgb); + #endif static void gather_termleader(void); #ifdef FEAT_TERMRESPONSE static void req_codes_from_term(void); *************** *** 382,390 **** # else {(int)KS_CRI, "\033[%dC"}, # endif ! #if defined(BEOS_DR8) {(int)KS_DB, ""}, /* hack! see screen.c */ ! #endif {K_UP, "\033[A"}, {K_DOWN, "\033[B"}, --- 385,393 ---- # else {(int)KS_CRI, "\033[%dC"}, # endif ! # if defined(BEOS_DR8) {(int)KS_DB, ""}, /* hack! see screen.c */ ! # endif {K_UP, "\033[A"}, {K_DOWN, "\033[B"}, *************** *** 790,797 **** # endif # endif ! # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) || defined(__EMX__) {(int)KS_NAME, "xterm"}, {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")}, {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")}, # ifdef TERMINFO --- 793,802 ---- # endif # endif ! # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) || defined(__EMX__) || defined(FEAT_TERMTRUECOLOR) {(int)KS_NAME, "xterm"}, + # endif + # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS) || defined(__EMX__) {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")}, {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")}, # ifdef TERMINFO *************** *** 939,944 **** --- 944,953 ---- {TERMCAP2KEY('F', 'Q'), IF_EB("\033[57;*~", ESC_STR "[57;*~")}, /* F36 */ {TERMCAP2KEY('F', 'R'), IF_EB("\033[58;*~", ESC_STR "[58;*~")}, /* F37 */ # endif + # ifdef FEAT_TERMTRUECOLOR + {(int)KS_8F, IF_EB("\033[38;2;%lu;%lu;%lum", ESC_STR "[38;2;%lu;%lu;%lum")}, + {(int)KS_8B, IF_EB("\033[48;2;%lu;%lu;%lum", ESC_STR "[48;2;%lu;%lu;%lum")}, + # endif # if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) /* *************** *** 1257,1262 **** --- 1266,1436 ---- }; /* end of builtin_termcaps */ + #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) + # define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) + struct rgbcolor_table_S { + char_u *color_name; + guicolor_T color; + }; + static struct rgbcolor_table_S rgb_table[] = { + {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, + {(char_u *)"blue", RGB(0x00, 0x00, 0xD4)}, + {(char_u *)"brown", RGB(0x80, 0x40, 0x40)}, + {(char_u *)"cyan", RGB(0x02, 0xAB, 0xEA)}, + {(char_u *)"darkblue", RGB(0x00, 0x00, 0x80)}, + {(char_u *)"darkcyan", RGB(0x00, 0x80, 0x80)}, + {(char_u *)"darkgray", RGB(0x80, 0x80, 0x80)}, + {(char_u *)"darkgreen", RGB(0x00, 0x80, 0x00)}, + {(char_u *)"darkgrey", RGB(0x80, 0x80, 0x80)}, + {(char_u *)"darkmagenta", RGB(0x80, 0x00, 0x80)}, + {(char_u *)"darkred", RGB(0x80, 0x00, 0x00)}, + {(char_u *)"darkyellow", RGB(0xBB, 0xBB, 0x00)}, + {(char_u *)"gray", RGB(0xC0, 0xC0, 0xC0)}, + {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, + {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, + {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, + {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, + {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, + {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, + {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, + {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, + {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, + {(char_u *)"green", RGB(0x00, 0x64, 0x11)}, + {(char_u *)"grey", RGB(0xC0, 0xC0, 0xC0)}, + {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, + {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, + {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, + {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, + {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, + {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, + {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, + {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, + {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, + {(char_u *)"lightblue", RGB(0xA0, 0xA0, 0xFF)}, + {(char_u *)"lightcyan", RGB(0xA0, 0xFF, 0xFF)}, + {(char_u *)"lightgray", RGB(0xE0, 0xE0, 0xE0)}, + {(char_u *)"lightgreen", RGB(0xA0, 0xFF, 0xA0)}, + {(char_u *)"lightgrey", RGB(0xE0, 0xE0, 0xE0)}, + {(char_u *)"lightmagenta",RGB(0xF0, 0xA0, 0xF0)}, + {(char_u *)"lightred", RGB(0xFF, 0xA0, 0xA0)}, + {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xA0)}, + {(char_u *)"magenta", RGB(0xF2, 0x08, 0x84)}, + {(char_u *)"orange", RGB(0xFC, 0x80, 0x00)}, + {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, + {(char_u *)"red", RGB(0xDD, 0x08, 0x06)}, + {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, + {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, + {(char_u *)"violet", RGB(0x8D, 0x38, 0xC9)}, + {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, + {(char_u *)"yellow", RGB(0xFC, 0xF3, 0x05)}, + }; + + static int + hex_digit(int c) + { + if (isdigit(c)) + return c - '0'; + c = TOLOWER_ASC(c); + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + return 0x1ffffff; + } + + guicolor_T + termtrue_mch_get_color(char_u *name) + { + guicolor_T color; + int i; + + if (*name == '#' && strlen((char *) name) == 7) + { + color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])), + ((hex_digit(name[3])<<4) + hex_digit(name[4])), + ((hex_digit(name[5])<<4) + hex_digit(name[6]))); + if (color > 0xffffff) + return INVALCOLOR; + return color; + } + else + { + /* Check if the name is one of the colors we know */ + for (i = 0; i < sizeof(rgb_table) / sizeof(rgb_table[0]); i++) + if (STRICMP(name, rgb_table[i].color_name) == 0) + return rgb_table[i].color; + } + + /* + * Last attempt. Look in the file "$VIM/rgb.txt". + */ + { + #define LINE_LEN 100 + FILE *fd; + char line[LINE_LEN]; + char_u *fname; + int r, g, b; + + fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); + if (fname == NULL) + return INVALCOLOR; + + fd = fopen((char *)fname, "rt"); + vim_free(fname); + if (fd == NULL) + return INVALCOLOR; + + while (!feof(fd)) + { + int len; + int pos; + char *color; + + fgets(line, LINE_LEN, fd); + len = strlen(line); + + if (len <= 1 || line[len-1] != '\n') + continue; + + line[len-1] = '\0'; + + i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); + if (i != 3) + continue; + + color = line + pos; + + if (STRICMP(color, name) == 0) + { + fclose(fd); + return (guicolor_T) RGB(r, g, b); + } + } + fclose(fd); + } + + return INVALCOLOR; + } + + guicolor_T + termtrue_get_color(char_u *name) + { + guicolor_T t; + + if (*name == NUL) + return INVALCOLOR; + t = termtrue_mch_get_color(name); + + if (t == INVALCOLOR) + EMSG2(_("E254: Cannot allocate color %s"), name); + return t; + } + + long_u + termtrue_mch_get_rgb(guicolor_T color) + { + return (long_u) color; + } + #endif + /* * DEFAULT_TERM is used, when no terminal is specified with -T option or $TERM. */ *************** *** 1512,1517 **** --- 1686,1692 ---- {KS_CWP, "WP"}, {KS_CWS, "WS"}, {KS_CSI, "SI"}, {KS_CEI, "EI"}, {KS_U7, "u7"}, {KS_RBG, "RB"}, + {KS_8F, "8f"}, {KS_8B, "8b"}, {(enum SpecialKey)0, NULL} }; *************** *** 2608,2613 **** --- 2783,2815 ---- OUT_STR(tgoto((char *)s, 0, n)); } + #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) + void + term_fg_rgb_color(long_u rgb) + { + term_rgb_color(T_8F, rgb); + } + + void + term_bg_rgb_color(long_u rgb) + { + term_rgb_color(T_8B, rgb); + } + + #define RED(rgb) ((rgb>>16)&0xFF) + #define GREEN(rgb) ((rgb>> 8)&0xFF) + #define BLUE(rgb) ((rgb )&0xFF) + + static void + term_rgb_color(char_u *s, long_u rgb) + { + char buf[7+3*3+2+1+1]; + + sprintf(buf, (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb)); + OUT_STR(buf); + } + #endif + #if (defined(FEAT_TITLE) && (defined(UNIX) || defined(VMS) \ || defined(MACOS_X))) || defined(PROTO) /* *** ../vim-7.4.1769/src/term.h 2016-03-19 22:11:47.440674791 +0100 --- src/term.h 2016-04-21 20:10:04.037297702 +0200 *************** *** 87,96 **** KS_CSV, /* scroll region vertical */ #endif KS_OP, /* original color pair */ ! KS_U7 /* request cursor position */ }; ! #define KS_LAST KS_U7 /* * the terminal capabilities are stored in this array --- 87,98 ---- KS_CSV, /* scroll region vertical */ #endif KS_OP, /* original color pair */ ! KS_U7, /* request cursor position */ ! KS_8F, /* set foreground color (RGB) */ ! KS_8B /* set background color (RGB) */ }; ! #define KS_LAST KS_8B /* * the terminal capabilities are stored in this array *************** *** 166,171 **** --- 168,175 ---- #define T_RBG (term_str(KS_RBG)) /* request background RGB */ #define T_OP (term_str(KS_OP)) /* original color pair */ #define T_U7 (term_str(KS_U7)) /* request cursor position */ + #define T_8F (term_str(KS_8F)) /* set foreground color (RGB) */ + #define T_8B (term_str(KS_8B)) /* set background color (RGB) */ #define TMODE_COOK 0 /* terminal mode for external cmds and Ex mode */ #define TMODE_SLEEP 1 /* terminal mode for sleeping (cooked but no echo) */ *** ../vim-7.4.1769/src/version.c 2016-04-21 20:00:47.926966425 +0200 --- src/version.c 2016-04-21 21:04:07.640425463 +0200 *************** *** 621,626 **** --- 621,631 ---- #else "-termresponse", #endif + #ifdef FEAT_TERMTRUECOLOR + "+termtruecolor", + #else + "-termtruecolor", + #endif #ifdef FEAT_TEXTOBJ "+textobjects", #else *** ../vim-7.4.1769/src/vim.h 2016-04-14 12:46:33.616678646 +0200 --- src/vim.h 2016-04-21 20:10:04.041297662 +0200 *************** *** 1558,1563 **** --- 1558,1588 ---- #define MSG_PUTS_LONG(s) msg_puts_long_attr((char_u *)(s), 0) #define MSG_PUTS_LONG_ATTR(s, a) msg_puts_long_attr((char_u *)(s), (a)) + #ifdef FEAT_GUI + # ifdef FEAT_TERMTRUECOLOR + # define GUI_FUNCTION(f) (gui.in_use ? gui_##f : termtrue_##f) + # define USE_24BIT (gui.in_use || p_guicolors) + # else + # define GUI_FUNCTION(f) gui_##f + # define USE_24BIT gui.in_use + # endif + #else + # ifdef FEAT_TERMTRUECOLOR + # define GUI_FUNCTION(f) termtrue_##f + # define USE_24BIT p_guicolors + # endif + #endif + #ifdef FEAT_TERMTRUECOLOR + # define IS_CTERM (t_colors > 1 || p_guicolors) + #else + # define IS_CTERM (t_colors > 1) + #endif + #ifdef GUI_FUNCTION + # define GUI_MCH_GET_RGB GUI_FUNCTION(mch_get_rgb) + # define GUI_MCH_GET_COLOR GUI_FUNCTION(mch_get_color) + # define GUI_GET_COLOR GUI_FUNCTION(get_color) + #endif + /* Prefer using emsg3(), because perror() may send the output to the wrong * destination and mess up the screen. */ #ifdef HAVE_STRERROR *** ../vim-7.4.1769/src/version.c 2016-04-21 20:00:47.926966425 +0200 --- src/version.c 2016-04-21 21:04:07.640425463 +0200 *************** *** 750,751 **** --- 755,758 ---- { /* Add new patch number below this line */ + /**/ + 1770, /**/ -- Individualists unite! /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///