mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	Merge pull request #9494 from leonerd/leonerd/vterm-color-struct
Changes for new VTermColor struct (libvterm 0.1)
This commit is contained in:
		| @@ -152,9 +152,6 @@ static VTermScreenCallbacks vterm_screen_callbacks = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| static PMap(ptr_t) *invalidated_terminals; | static PMap(ptr_t) *invalidated_terminals; | ||||||
| static Map(int, int) *color_indexes; |  | ||||||
| static int default_vt_fg, default_vt_bg; |  | ||||||
| static VTermColor default_vt_bg_rgb; |  | ||||||
|  |  | ||||||
| void terminal_init(void) | void terminal_init(void) | ||||||
| { | { | ||||||
| @@ -162,36 +159,6 @@ void terminal_init(void) | |||||||
|   time_watcher_init(&main_loop, &refresh_timer, NULL); |   time_watcher_init(&main_loop, &refresh_timer, NULL); | ||||||
|   // refresh_timer_cb will redraw the screen which can call vimscript |   // refresh_timer_cb will redraw the screen which can call vimscript | ||||||
|   refresh_timer.events = multiqueue_new_child(main_loop.events); |   refresh_timer.events = multiqueue_new_child(main_loop.events); | ||||||
|  |  | ||||||
|   // initialize a rgb->color index map for cterm attributes(VTermScreenCell |  | ||||||
|   // only has RGB information and we need color indexes for terminal UIs) |  | ||||||
|   color_indexes = map_new(int, int)(); |  | ||||||
|   VTerm *vt = vterm_new(24, 80); |  | ||||||
|   VTermState *state = vterm_obtain_state(vt); |  | ||||||
|  |  | ||||||
|   for (int color_index = 255; color_index >= 0; color_index--) { |  | ||||||
|     VTermColor color; |  | ||||||
|     // Some of the default 16 colors has the same color as the later |  | ||||||
|     // 240 colors. To avoid collisions, we will use the custom colors |  | ||||||
|     // below in non true color mode. |  | ||||||
|     if (color_index < 16) { |  | ||||||
|       color.red = 0; |  | ||||||
|       color.green = 0; |  | ||||||
|       color.blue = (uint8_t)(color_index + 1); |  | ||||||
|     } else { |  | ||||||
|       vterm_state_get_palette_color(state, color_index, &color); |  | ||||||
|     } |  | ||||||
|     map_put(int, int)(color_indexes, |  | ||||||
|                       RGB_(color.red, color.green, color.blue), |  | ||||||
|                       color_index + 1); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   VTermColor fg, bg; |  | ||||||
|   vterm_state_get_default_colors(state, &fg, &bg); |  | ||||||
|   default_vt_fg = RGB_(fg.red, fg.green, fg.blue); |  | ||||||
|   default_vt_bg = RGB_(bg.red, bg.green, bg.blue); |  | ||||||
|   default_vt_bg_rgb = bg; |  | ||||||
|   vterm_free(vt); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void terminal_teardown(void) | void terminal_teardown(void) | ||||||
| @@ -200,14 +167,12 @@ void terminal_teardown(void) | |||||||
|   multiqueue_free(refresh_timer.events); |   multiqueue_free(refresh_timer.events); | ||||||
|   time_watcher_close(&refresh_timer, NULL); |   time_watcher_close(&refresh_timer, NULL); | ||||||
|   pmap_free(ptr_t)(invalidated_terminals); |   pmap_free(ptr_t)(invalidated_terminals); | ||||||
|   map_free(int, int)(color_indexes); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // public API {{{ | // public API {{{ | ||||||
|  |  | ||||||
| Terminal *terminal_open(TerminalOptions opts) | Terminal *terminal_open(TerminalOptions opts) | ||||||
| { | { | ||||||
|   bool true_color = ui_rgb_attached(); |  | ||||||
|   // Create a new terminal instance and configure it |   // Create a new terminal instance and configure it | ||||||
|   Terminal *rv = xcalloc(1, sizeof(Terminal)); |   Terminal *rv = xcalloc(1, sizeof(Terminal)); | ||||||
|   rv->opts = opts; |   rv->opts = opts; | ||||||
| @@ -255,19 +220,6 @@ Terminal *terminal_open(TerminalOptions opts) | |||||||
|   rv->sb_size = (size_t)curbuf->b_p_scbk; |   rv->sb_size = (size_t)curbuf->b_p_scbk; | ||||||
|   rv->sb_buffer = xmalloc(sizeof(ScrollbackLine *) * rv->sb_size); |   rv->sb_buffer = xmalloc(sizeof(ScrollbackLine *) * rv->sb_size); | ||||||
|  |  | ||||||
|   if (!true_color) { |  | ||||||
|     // Change the first 16 colors so we can easily get the correct color |  | ||||||
|     // index from them. |  | ||||||
|     for (int i = 0; i < 16; i++) { |  | ||||||
|       VTermColor color; |  | ||||||
|       color.red = 0; |  | ||||||
|       color.green = 0; |  | ||||||
|       color.blue = (uint8_t)(i + 1); |  | ||||||
|       vterm_state_set_palette_color(state, i, &color); |  | ||||||
|     } |  | ||||||
|     return rv; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   vterm_state_set_bold_highbright(state, true); |   vterm_state_set_bold_highbright(state, true); | ||||||
|  |  | ||||||
|   // Configure the color palette. Try to get the color from: |   // Configure the color palette. Try to get the color from: | ||||||
| @@ -286,9 +238,10 @@ Terminal *terminal_open(TerminalOptions opts) | |||||||
|  |  | ||||||
|       if (color_val != -1) { |       if (color_val != -1) { | ||||||
|         VTermColor color; |         VTermColor color; | ||||||
|         color.red = (uint8_t)((color_val >> 16) & 0xFF); |         vterm_color_rgb(&color, | ||||||
|         color.green = (uint8_t)((color_val >> 8) & 0xFF); |                         (uint8_t)((color_val >> 16) & 0xFF), | ||||||
|         color.blue = (uint8_t)((color_val >> 0) & 0xFF); |                         (uint8_t)((color_val >> 8) & 0xFF), | ||||||
|  |                         (uint8_t)((color_val >> 0) & 0xFF)); | ||||||
|         vterm_state_set_palette_color(state, i, &color); |         vterm_state_set_palette_color(state, i, &color); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| @@ -613,11 +566,19 @@ void terminal_receive(Terminal *term, char *data, size_t len) | |||||||
|   vterm_screen_flush_damage(term->vts); |   vterm_screen_flush_damage(term->vts); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int get_rgb(VTermState *state, VTermColor color) | ||||||
|  | { | ||||||
|  |   vterm_state_convert_color_to_rgb(state, &color); | ||||||
|  |   return RGB_(color.rgb.red, color.rgb.green, color.rgb.blue); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr, | void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr, | ||||||
|                                   int *term_attrs) |                                   int *term_attrs) | ||||||
| { | { | ||||||
|   int height, width; |   int height, width; | ||||||
|   vterm_get_size(term->vt, &height, &width); |   vterm_get_size(term->vt, &height, &width); | ||||||
|  |   VTermState *state = vterm_obtain_state(term->vt); | ||||||
|   assert(linenr); |   assert(linenr); | ||||||
|   int row = linenr_to_row(term, linenr); |   int row = linenr_to_row(term, linenr); | ||||||
|   if (row >= height) { |   if (row >= height) { | ||||||
| @@ -628,19 +589,18 @@ void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr, | |||||||
|  |  | ||||||
|   for (int col = 0; col < width; col++) { |   for (int col = 0; col < width; col++) { | ||||||
|     VTermScreenCell cell; |     VTermScreenCell cell; | ||||||
|     fetch_cell(term, row, col, &cell); |     bool color_valid = fetch_cell(term, row, col, &cell); | ||||||
|  |     bool fg_default = !color_valid || VTERM_COLOR_IS_DEFAULT_FG(&cell.fg); | ||||||
|  |     bool bg_default = !color_valid || VTERM_COLOR_IS_DEFAULT_BG(&cell.bg); | ||||||
|  |  | ||||||
|     // Get the rgb value set by libvterm. |     // Get the rgb value set by libvterm. | ||||||
|     int vt_fg = RGB_(cell.fg.red, cell.fg.green, cell.fg.blue); |     int vt_fg = fg_default ? -1 : get_rgb(state, cell.fg); | ||||||
|     int vt_bg = RGB_(cell.bg.red, cell.bg.green, cell.bg.blue); |     int vt_bg = bg_default ? -1 : get_rgb(state, cell.bg); | ||||||
|     vt_fg = vt_fg != default_vt_fg ? vt_fg : - 1; |  | ||||||
|     vt_bg = vt_bg != default_vt_bg ? vt_bg : - 1; |     int vt_fg_idx = ((!fg_default && VTERM_COLOR_IS_INDEXED(&cell.fg)) | ||||||
|     // Since libvterm does not expose the color index used by the program, we |                      ? cell.fg.indexed.idx + 1 : 0); | ||||||
|     // use the rgb value to find the appropriate index in the cache computed by |     int vt_bg_idx = ((!bg_default && VTERM_COLOR_IS_INDEXED(&cell.bg)) | ||||||
|     // `terminal_init`. |                      ? cell.bg.indexed.idx + 1 : 0); | ||||||
|     int vt_fg_idx = vt_fg != -1 ? |  | ||||||
|                     map_get(int, int)(color_indexes, vt_fg) : 0; |  | ||||||
|     int vt_bg_idx = vt_bg != -1 ? |  | ||||||
|                     map_get(int, int)(color_indexes, vt_bg) : 0; |  | ||||||
|  |  | ||||||
|     int hl_attrs = (cell.attrs.bold ? HL_BOLD : 0) |     int hl_attrs = (cell.attrs.bold ? HL_BOLD : 0) | ||||||
|                  | (cell.attrs.italic ? HL_ITALIC : 0) |                  | (cell.attrs.italic ? HL_ITALIC : 0) | ||||||
| @@ -649,7 +609,7 @@ void terminal_get_line_attributes(Terminal *term, win_T *wp, int linenr, | |||||||
|  |  | ||||||
|     int attr_id = 0; |     int attr_id = 0; | ||||||
|  |  | ||||||
|     if (hl_attrs || vt_fg != -1 || vt_bg != -1) { |     if (hl_attrs ||!fg_default || !bg_default) { | ||||||
|       attr_id = hl_get_term_attr(&(HlAttrs) { |       attr_id = hl_get_term_attr(&(HlAttrs) { | ||||||
|         .cterm_ae_attr = (int16_t)hl_attrs, |         .cterm_ae_attr = (int16_t)hl_attrs, | ||||||
|         .cterm_fg_color = vt_fg_idx, |         .cterm_fg_color = vt_fg_idx, | ||||||
| @@ -1113,7 +1073,7 @@ static void fetch_row(Terminal *term, int row, int end_col) | |||||||
|   term->textbuf[line_len] = 0; |   term->textbuf[line_len] = 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void fetch_cell(Terminal *term, int row, int col, | static bool fetch_cell(Terminal *term, int row, int col, | ||||||
|                        VTermScreenCell *cell) |                        VTermScreenCell *cell) | ||||||
| { | { | ||||||
|   if (row < 0) { |   if (row < 0) { | ||||||
| @@ -1125,13 +1085,14 @@ static void fetch_cell(Terminal *term, int row, int col, | |||||||
|       *cell = (VTermScreenCell) { |       *cell = (VTermScreenCell) { | ||||||
|         .chars = { 0 }, |         .chars = { 0 }, | ||||||
|         .width = 1, |         .width = 1, | ||||||
|         .bg = default_vt_bg_rgb |  | ||||||
|       }; |       }; | ||||||
|  |       return false; | ||||||
|     } |     } | ||||||
|   } else { |   } else { | ||||||
|     vterm_screen_get_cell(term->vts, (VTermPos){.row = row, .col = col}, |     vterm_screen_get_cell(term->vts, (VTermPos){.row = row, .col = col}, | ||||||
|         cell); |         cell); | ||||||
|   } |   } | ||||||
|  |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| // queue a terminal instance for refresh | // queue a terminal instance for refresh | ||||||
|   | |||||||
| @@ -640,11 +640,11 @@ describe('TUI', function() | |||||||
|     screen:set_option('rgb', true) |     screen:set_option('rgb', true) | ||||||
|     screen:set_default_attr_ids({ |     screen:set_default_attr_ids({ | ||||||
|       [1] = {reverse = true}, |       [1] = {reverse = true}, | ||||||
|       [2] = {foreground = 13}, |       [2] = {foreground = tonumber('0x4040ff')}, | ||||||
|       [3] = {bold = true, reverse = true}, |       [3] = {bold = true, reverse = true}, | ||||||
|       [4] = {bold = true}, |       [4] = {bold = true}, | ||||||
|       [5] = {reverse = true, foreground = 4}, |       [5] = {reverse = true, foreground = tonumber('0xe0e000')}, | ||||||
|       [6] = {foreground = 4}, |       [6] = {foreground = tonumber('0xe0e000')}, | ||||||
|       [7] = {reverse = true, foreground = Screen.colors.SeaGreen4}, |       [7] = {reverse = true, foreground = Screen.colors.SeaGreen4}, | ||||||
|       [8] = {foreground = Screen.colors.SeaGreen4}, |       [8] = {foreground = Screen.colors.SeaGreen4}, | ||||||
|       [9] = {bold = true, foreground = Screen.colors.Blue1}, |       [9] = {bold = true, foreground = Screen.colors.Blue1}, | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								third-party/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								third-party/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							| @@ -160,8 +160,8 @@ set(UNIBILIUM_SHA256 29815283c654277ef77a3adcc8840db79ddbb20a0f0b0c8f648bd8cd49a | |||||||
| set(LIBTERMKEY_URL http://www.leonerd.org.uk/code/libtermkey/libtermkey-0.21.1.tar.gz) | set(LIBTERMKEY_URL http://www.leonerd.org.uk/code/libtermkey/libtermkey-0.21.1.tar.gz) | ||||||
| set(LIBTERMKEY_SHA256 cecbf737f35d18f433c8d7864f63c0f878af41f8bd0255a3ebb16010dc044d5f) | set(LIBTERMKEY_SHA256 cecbf737f35d18f433c8d7864f63c0f878af41f8bd0255a3ebb16010dc044d5f) | ||||||
|  |  | ||||||
| set(LIBVTERM_URL https://github.com/neovim/libvterm/archive/b45b648cab73f9667bde7c0c6045b285e22b3ecd.tar.gz) | set(LIBVTERM_URL https://github.com/neovim/libvterm/archive/4a5fa43e0dbc0db4fe67d40d788d60852864df9e.tar.gz) | ||||||
| set(LIBVTERM_SHA256 37cc123deff29327efa654358c2ebaaf8589da03754ca5adb8ec47be386a0433) | set(LIBVTERM_SHA256 49b3cf2dcb988b887671b1011cfeac98ff81bb5c23fb4ac34b91a59524992935) | ||||||
|  |  | ||||||
| set(LUV_VERSION 1.30.0-0) | set(LUV_VERSION 1.30.0-0) | ||||||
| set(LUV_URL https://github.com/luvit/luv/archive/${LUV_VERSION}.tar.gz) | set(LUV_URL https://github.com/luvit/luv/archive/${LUV_VERSION}.tar.gz) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Björn Linse
					Björn Linse