patch 9.0.0881: cannot get the currently showing mouse shape

Problem:    Cannot get the currently showing mouse shape.
Solution:   Add getmouseshape().
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 4c9ee4c..310fa78 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1983,6 +1983,8 @@
 			ret_list_dict_any,  f_getmatches},
     {"getmousepos",	0, 0, 0,	    NULL,
 			ret_dict_number,    f_getmousepos},
+    {"getmouseshape",	0, 0, 0,	    NULL,
+			ret_string,	    f_getmouseshape},
     {"getpid",		0, 0, 0,	    NULL,
 			ret_number,	    f_getpid},
     {"getpos",		1, 1, FEARG_1,	    arg1_string,
diff --git a/src/misc2.c b/src/misc2.c
index 84c5f43..d16fb46 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2027,12 +2027,12 @@
     {0,	0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR},
 };
 
-#ifdef FEAT_MOUSESHAPE
+# ifdef FEAT_MOUSESHAPE
 /*
  * Table with names for mouse shapes.  Keep in sync with all the tables for
  * mch_set_mouse_shape()!.
  */
-static char * mshape_names[] =
+static char *mshape_names[] =
 {
     "arrow",	// default, must be the first one
     "blank",	// hidden
@@ -2052,7 +2052,9 @@
     "up-arrow",
     NULL
 };
-#endif
+
+#  define MSHAPE_NAMES_COUNT  (ARRAY_LENGTH(mshape_names) - 1)
+# endif
 
 /*
  * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape'
@@ -2355,7 +2357,7 @@
 #endif
 
 # if defined(FEAT_MOUSESHAPE) || defined(PROTO)
-static int old_mouse_shape = 0;
+static int current_mouse_shape = 0;
 
 /*
  * Set the mouse shape:
@@ -2389,18 +2391,18 @@
 	shape_idx = -2;
 
     if (shape_idx == -2
-	    && old_mouse_shape != shape_table[SHAPE_IDX_CLINE].mshape
-	    && old_mouse_shape != shape_table[SHAPE_IDX_STATUS].mshape
-	    && old_mouse_shape != shape_table[SHAPE_IDX_VSEP].mshape)
+	    && current_mouse_shape != shape_table[SHAPE_IDX_CLINE].mshape
+	    && current_mouse_shape != shape_table[SHAPE_IDX_STATUS].mshape
+	    && current_mouse_shape != shape_table[SHAPE_IDX_VSEP].mshape)
 	return;
     if (shape_idx < 0)
 	new_mouse_shape = shape_table[get_shape_idx(TRUE)].mshape;
     else
 	new_mouse_shape = shape_table[shape_idx].mshape;
-    if (new_mouse_shape != old_mouse_shape)
+    if (new_mouse_shape != current_mouse_shape)
     {
 	mch_set_mouse_shape(new_mouse_shape);
-	old_mouse_shape = new_mouse_shape;
+	current_mouse_shape = new_mouse_shape;
     }
     postponed_mouseshape = FALSE;
 }
@@ -2408,6 +2410,25 @@
 
 #endif // CURSOR_SHAPE
 
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Mainly for tests: get the name of the current mouse shape.
+ */
+    void
+f_getmouseshape(typval_T *argvars UNUSED, typval_T *rettv)
+{
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+# if defined(FEAT_MOUSESHAPE) || defined(PROTO)
+    if (current_mouse_shape >= 0
+			      && current_mouse_shape < (int)MSHAPE_NAMES_COUNT)
+	rettv->vval.v_string = vim_strsave(
+				  (char_u *)mshape_names[current_mouse_shape]);
+# endif
+}
+#endif
+
+
 
 /*
  * Change directory to "new_dir".  Search 'cdpath' for relative directory
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
index 2728ffe..3d3a5a6 100644
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -3,8 +3,8 @@
 int getviscol(void);
 int coladvance_force(colnr_T wcol);
 int getviscol2(colnr_T col, colnr_T coladd);
-int coladvance(colnr_T wcol);
-int getvpos(pos_T *pos, colnr_T wcol);
+int coladvance(colnr_T wantcol);
+int getvpos(pos_T *pos, colnr_T wantcol);
 int inc_cursor(void);
 int inc(pos_T *lp);
 int incl(pos_T *lp);
@@ -47,6 +47,7 @@
 char *parse_shape_opt(int what);
 int get_shape_idx(int mouse);
 void update_mouseshape(int shape_idx);
+void f_getmouseshape(typval_T *argvars, typval_T *rettv);
 int vim_chdir(char_u *new_dir);
 int get_user_name(char_u *buf, int len);
 void free_username(void);
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index cb07221..6f109e8 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -2890,6 +2890,12 @@
   bwipe!
 endfunc
 
+func Test_getmouseshape()
+  CheckFeature mouseshape
+
+  call assert_equal('arrow', getmouseshape())
+endfunc
+
 " Test for glob()
 func Test_glob()
   call assert_equal('', glob(test_null_string()))
diff --git a/src/version.c b/src/version.c
index f89595a..c5e7838 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    881,
+/**/
     880,
 /**/
     879,