patch 8.0.0921: terminal window cursor shape not supported in the GUI v8.0.0921
authorBram Moolenaar <Bram@vim.org>
Sat, 12 Aug 2017 20:55:58 +0000 (22:55 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Aug 2017 20:55:58 +0000 (22:55 +0200)
Problem:    Terminal window cursor shape not supported in the GUI.
Solution:   Use the terminal window cursor shape in the GUI.

src/gui.c
src/proto/syntax.pro
src/proto/terminal.pro
src/syntax.c
src/terminal.c
src/version.c

index ff81d0b749dc48f0df940a6b9cc226ce0bd2fbc1..63625bfc406a92aa95c29801090c3ed4c33e30c7 100644 (file)
--- 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
index a7f6f5484e15e37b00f53d1112e93a715d5727b1..7247c5174f13a6585df7965d877ae87bd01bcb4f 100644 (file)
@@ -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);
index a004d355ee6e5ee4e7ddea57df5414064de5e5d7..8f2bcd5c6c48fca99d06eeeaf0a9398d35ff702a 100644 (file)
@@ -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);
index 2b06b464bf6f9625784a5fd2d5e3a5636cb538fb..4c0fa3fda36d203cfbb255811b3ddca08ec0f800 100644 (file)
@@ -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)
index 020271a89e953049a8c9b9fd52ccc24f3f256f20..6d01a299c318224d468be237fffc267ed809d3aa 100644 (file)
@@ -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;
 
index 3758ab97f0f9091341bbee9d45c5a5a8d07457b2..72cd083dd92e25d10436faac9fcc132c06ed670e 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    921,
 /**/
     920,
 /**/