summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-12 22:55:58 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-12 22:55:58 +0200
commit3d9bdfebf1a8c1eec1c3e1cff6fbb60b3d98f02a (patch)
tree0d2c16aa5d073a120e160703ee88e73c07c211b8
parent893029ab20a06da9c0cf29661c9f6e2ec5583dce (diff)
downloadvim-git-3d9bdfebf1a8c1eec1c3e1cff6fbb60b3d98f02a.tar.gz
patch 8.0.0921: terminal window cursor shape not supported in the GUIv8.0.0921
Problem: Terminal window cursor shape not supported in the GUI. Solution: Use the terminal window cursor shape in the GUI.
-rw-r--r--src/gui.c47
-rw-r--r--src/proto/syntax.pro1
-rw-r--r--src/proto/terminal.pro2
-rw-r--r--src/syntax.c3
-rw-r--r--src/terminal.c57
-rw-r--r--src/version.c2
6 files changed, 94 insertions, 18 deletions
diff --git a/src/gui.c b/src/gui.c
index ff81d0b74..63625bfc4 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -1051,8 +1051,12 @@ gui_update_cursor(
int cur_width = 0;
int cur_height = 0;
int old_hl_mask;
- int idx;
+ cursorentry_T *shape;
int id;
+#ifdef FEAT_TERMINAL
+ guicolor_T shape_fg = INVALCOLOR;
+ guicolor_T shape_bg = INVALCOLOR;
+#endif
guicolor_T cfg, cbg, cc; /* cursor fore-/background color */
int cattr; /* cursor attributes */
int attr;
@@ -1094,20 +1098,35 @@ gui_update_cursor(
/*
* How the cursor is drawn depends on the current mode.
+ * When in a terminal window use the shape/color specified there.
*/
- idx = get_shape_idx(FALSE);
+#ifdef FEAT_TERMINAL
+ if (use_terminal_cursor())
+ shape = term_get_cursor_shape(&shape_fg, &shape_bg);
+ else
+#endif
+ shape = &shape_table[get_shape_idx(FALSE)];
if (State & LANGMAP)
- id = shape_table[idx].id_lm;
+ id = shape->id_lm;
else
- id = shape_table[idx].id;
+ id = shape->id;
/* get the colors and attributes for the cursor. Default is inverted */
cfg = INVALCOLOR;
cbg = INVALCOLOR;
cattr = HL_INVERSE;
- gui_mch_set_blinking(shape_table[idx].blinkwait,
- shape_table[idx].blinkon,
- shape_table[idx].blinkoff);
+ gui_mch_set_blinking(shape->blinkwait,
+ shape->blinkon,
+ shape->blinkoff);
+#ifdef FEAT_TERMINAL
+ if (shape_bg != INVALCOLOR)
+ {
+ cattr = 0;
+ cfg = shape_fg;
+ cbg = shape_bg;
+ }
+ else
+#endif
if (id > 0)
{
cattr = syn_id2colors(id, &cfg, &cbg);
@@ -1202,7 +1221,7 @@ gui_update_cursor(
}
old_hl_mask = gui.highlight_mask;
- if (shape_table[idx].shape == SHAPE_BLOCK
+ if (shape->shape == SHAPE_BLOCK
#ifdef FEAT_HANGULIN
|| composing_hangul
#endif
@@ -1242,16 +1261,14 @@ gui_update_cursor(
* First draw the partial cursor, then overwrite with the text
* character, using a transparent background.
*/
- if (shape_table[idx].shape == SHAPE_VER)
+ if (shape->shape == SHAPE_VER)
{
cur_height = gui.char_height;
- cur_width = (gui.char_width * shape_table[idx].percentage
- + 99) / 100;
+ cur_width = (gui.char_width * shape->percentage + 99) / 100;
}
else
{
- cur_height = (gui.char_height * shape_table[idx].percentage
- + 99) / 100;
+ cur_height = (gui.char_height * shape->percentage + 99) / 100;
cur_width = gui.char_width;
}
#ifdef FEAT_MBYTE
@@ -1259,7 +1276,7 @@ gui_update_cursor(
LineOffset[gui.row] + screen_Columns) > 1)
{
/* Double wide character. */
- if (shape_table[idx].shape != SHAPE_VER)
+ if (shape->shape != SHAPE_VER)
cur_width += gui.char_width;
# ifdef FEAT_RIGHTLEFT
if (CURSOR_BAR_RIGHT)
@@ -1728,7 +1745,7 @@ gui_clear_block(
void
gui_update_cursor_later(void)
{
- OUT_STR(IF_EB("\033|s", ESC_STR "|s"));
+ OUT_STR(IF_EB("\033|s", ESC_STR "|s"));
}
void
diff --git a/src/proto/syntax.pro b/src/proto/syntax.pro
index a7f6f5484..7247c5174 100644
--- a/src/proto/syntax.pro
+++ b/src/proto/syntax.pro
@@ -32,6 +32,7 @@ char_u *hl_get_font_name(void);
void hl_set_font_name(char_u *font_name);
void hl_set_bg_color_name(char_u *name);
void hl_set_fg_color_name(char_u *name);
+guicolor_T color_name2handle(char_u *name);
int get_cterm_attr_idx(int attr, int fg, int bg);
int get_tgc_attr_idx(int attr, guicolor_T fg, guicolor_T bg);
int get_gui_attr_idx(int attr, guicolor_T fg, guicolor_T bg);
diff --git a/src/proto/terminal.pro b/src/proto/terminal.pro
index a004d355e..8f2bcd5c6 100644
--- a/src/proto/terminal.pro
+++ b/src/proto/terminal.pro
@@ -6,6 +6,8 @@ int term_job_running(term_T *term);
int term_in_normal_mode(void);
void term_enter_job_mode(void);
int send_keys_to_term(term_T *term, int c, int typed);
+int use_terminal_cursor(void);
+cursorentry_T *term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg);
int term_use_loop(void);
int terminal_loop(void);
void term_job_ended(job_T *job);
diff --git a/src/syntax.c b/src/syntax.c
index 2b06b464b..4c0fa3fda 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -103,7 +103,6 @@ static void highlight_clear(int idx);
#if defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)
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);
@@ -8622,7 +8621,7 @@ hl_do_font(
* Return the handle for a color name.
* Returns INVALCOLOR when failed.
*/
- static guicolor_T
+ guicolor_T
color_name2handle(char_u *name)
{
if (STRCMP(name, "NONE") == 0)
diff --git a/src/terminal.c b/src/terminal.c
index 020271a89..6d01a299c 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1163,11 +1163,57 @@ term_paste_register(int prev_c UNUSED)
}
}
+#if defined(FEAT_GUI) || defined(PROTO)
+/*
+ * Return TRUE when the cursor of the terminal should be displayed.
+ */
+ int
+use_terminal_cursor()
+{
+ return in_terminal_loop != NULL;
+}
+
+ cursorentry_T *
+term_get_cursor_shape(guicolor_T *fg, guicolor_T *bg)
+{
+ term_T *term = in_terminal_loop;
+ static cursorentry_T entry;
+
+ vim_memset(&entry, 0, sizeof(entry));
+ entry.shape = entry.mshape =
+ term->tl_cursor_shape == VTERM_PROP_CURSORSHAPE_UNDERLINE ? SHAPE_HOR :
+ term->tl_cursor_shape == VTERM_PROP_CURSORSHAPE_BAR_LEFT ? SHAPE_VER :
+ SHAPE_BLOCK;
+ entry.percentage = 20;
+ if (term->tl_cursor_blink)
+ {
+ entry.blinkwait = 700;
+ entry.blinkon = 400;
+ entry.blinkon = 250;
+ }
+ *fg = gui.back_pixel;
+ if (term->tl_cursor_color == NULL)
+ *bg = gui.norm_pixel;
+ else
+ *bg = color_name2handle(term->tl_cursor_color);
+ entry.name = "n";
+ entry.used_for = SHAPE_CURSOR;
+
+ return &entry;
+}
+#endif
+
static int did_change_cursor = FALSE;
static void
may_set_cursor_props(term_T *term)
{
+#ifdef FEAT_GUI
+ /* For the GUI the cursor properties are obtained with
+ * term_get_cursor_shape(). */
+ if (gui.in_use)
+ return;
+#endif
if (in_terminal_loop == term)
{
did_change_cursor = TRUE;
@@ -1184,6 +1230,10 @@ may_set_cursor_props(term_T *term)
static void
may_restore_cursor_props(void)
{
+#ifdef FEAT_GUI
+ if (gui.in_use)
+ return;
+#endif
if (did_change_cursor)
{
did_change_cursor = FALSE;
@@ -1241,6 +1291,8 @@ terminal_loop(void)
if (!term_use_loop())
/* job finished while waiting for a character */
break;
+ if (c == K_IGNORE)
+ continue;
#ifdef UNIX
may_send_sigint(c, curbuf->b_term->tl_job->jv_pid, 0);
@@ -1447,7 +1499,10 @@ handle_settermprop(
case VTERM_PROP_CURSORCOLOR:
vim_free(term->tl_cursor_color);
- term->tl_cursor_color = vim_strsave((char_u *)value->string);
+ if (*value->string == NUL)
+ term->tl_cursor_color = NULL;
+ else
+ term->tl_cursor_color = vim_strsave((char_u *)value->string);
may_set_cursor_props(term);
break;
diff --git a/src/version.c b/src/version.c
index 3758ab97f..72cd083dd 100644
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 921,
+/**/
920,
/**/
919,