changeset 31093:004aee2845d2 v9.0.0881

patch 9.0.0881: cannot get the currently showing mouse shape Commit: https://github.com/vim/vim/commit/24dc19cdb2ce7cda2156d3b2eca6aee552b097dc Author: Bram Moolenaar <Bram@vim.org> Date: Mon Nov 14 19:49:15 2022 +0000 patch 9.0.0881: cannot get the currently showing mouse shape Problem: Cannot get the currently showing mouse shape. Solution: Add getmouseshape().
author Bram Moolenaar <Bram@vim.org>
date Mon, 14 Nov 2022 21:00:05 +0100
parents 190e4f52a0b0
children 3a07a6df9786
files runtime/doc/builtin.txt runtime/doc/usr_41.txt src/evalfunc.c src/misc2.c src/proto/misc2.pro src/testdir/test_functions.vim src/version.c
diffstat 7 files changed, 51 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/builtin.txt
+++ b/runtime/doc/builtin.txt
@@ -246,6 +246,7 @@ getloclist({nr}, {what})	Dict	get specif
 getmarklist([{buf}])		List	list of global/local marks
 getmatches([{win}])		List	list of current matches
 getmousepos()			Dict	last known mouse position
+getmouseshape()			String	current mouse shape name
 getpid()			Number	process ID of Vim
 getpos({expr})			List	position of cursor, mark, etc.
 getqflist()			List	list of quickfix items
@@ -3879,6 +3880,12 @@ getmousepos()						*getmousepos()*
 		When using |getchar()| the Vim variables |v:mouse_lnum|,
 		|v:mouse_col| and |v:mouse_winid| also provide these values.
 
+getmouseshape()						*getmouseshape()*
+		Returns the name of the currently showing mouse pointer.
+		When the |+mouseshape| feature is not supported or the shape
+		is unknown an empty string is returned.
+		This function is mainly intended for testing.
+
 							*getpid()*
 getpid()	Return a Number which is the process ID of the Vim process.
 		On Unix and MS-Windows this is a unique number, until Vim
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -1110,6 +1110,7 @@ Interactive:					*interactive-functions*
 	getcharstr()		get a character from the user as a string
 	getcharmod()		get modifiers for the last typed character
 	getmousepos()		get last known mouse position
+	getmouseshape()		get name of the current mouse shape
 	echoraw()		output characters as-is
 	feedkeys()		put characters in the typeahead queue
 	input()			get a line from the user
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -1983,6 +1983,8 @@ static funcentry_T global_functions[] =
 			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,
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2027,12 +2027,12 @@ cursorentry_T shape_table[SHAPE_IDX_COUN
     {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 @@ static char * mshape_names[] =
     "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 @@ get_shape_idx(int mouse)
 #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 @@ update_mouseshape(int shape_idx)
 	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 @@ update_mouseshape(int shape_idx)
 
 #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
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -3,8 +3,8 @@ int virtual_active(void);
 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 @@ int vim_stat(const char *name, stat_T *s
 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);
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -2890,6 +2890,12 @@ func Test_getmousepos()
   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()))
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    881,
+/**/
     880,
 /**/
     879,