0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 9.0.0881: cannot get the currently showing mouse shape

Problem:    Cannot get the currently showing mouse shape.
Solution:   Add getmouseshape().
This commit is contained in:
Bram Moolenaar 2022-11-14 19:49:15 +00:00
parent 161b6ac04f
commit 24dc19cdb2
7 changed files with 51 additions and 11 deletions

View File

@ -246,6 +246,7 @@ getloclist({nr}, {what}) Dict get specific location list properties
getmarklist([{buf}]) List list of global/local marks getmarklist([{buf}]) List list of global/local marks
getmatches([{win}]) List list of current matches getmatches([{win}]) List list of current matches
getmousepos() Dict last known mouse position getmousepos() Dict last known mouse position
getmouseshape() String current mouse shape name
getpid() Number process ID of Vim getpid() Number process ID of Vim
getpos({expr}) List position of cursor, mark, etc. getpos({expr}) List position of cursor, mark, etc.
getqflist() List list of quickfix items getqflist() List list of quickfix items
@ -3879,6 +3880,12 @@ getmousepos() *getmousepos()*
When using |getchar()| the Vim variables |v:mouse_lnum|, When using |getchar()| the Vim variables |v:mouse_lnum|,
|v:mouse_col| and |v:mouse_winid| also provide these values. |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()*
getpid() Return a Number which is the process ID of the Vim process. 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 On Unix and MS-Windows this is a unique number, until Vim

View File

@ -1110,6 +1110,7 @@ Interactive: *interactive-functions*
getcharstr() get a character from the user as a string getcharstr() get a character from the user as a string
getcharmod() get modifiers for the last typed character getcharmod() get modifiers for the last typed character
getmousepos() get last known mouse position getmousepos() get last known mouse position
getmouseshape() get name of the current mouse shape
echoraw() output characters as-is echoraw() output characters as-is
feedkeys() put characters in the typeahead queue feedkeys() put characters in the typeahead queue
input() get a line from the user input() get a line from the user

View File

@ -1983,6 +1983,8 @@ static funcentry_T global_functions[] =
ret_list_dict_any, f_getmatches}, ret_list_dict_any, f_getmatches},
{"getmousepos", 0, 0, 0, NULL, {"getmousepos", 0, 0, 0, NULL,
ret_dict_number, f_getmousepos}, ret_dict_number, f_getmousepos},
{"getmouseshape", 0, 0, 0, NULL,
ret_string, f_getmouseshape},
{"getpid", 0, 0, 0, NULL, {"getpid", 0, 0, 0, NULL,
ret_number, f_getpid}, ret_number, f_getpid},
{"getpos", 1, 1, FEARG_1, arg1_string, {"getpos", 1, 1, FEARG_1, arg1_string,

View File

@ -2027,12 +2027,12 @@ cursorentry_T shape_table[SHAPE_IDX_COUNT] =
{0, 0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR}, {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 * Table with names for mouse shapes. Keep in sync with all the tables for
* mch_set_mouse_shape()!. * mch_set_mouse_shape()!.
*/ */
static char * mshape_names[] = static char *mshape_names[] =
{ {
"arrow", // default, must be the first one "arrow", // default, must be the first one
"blank", // hidden "blank", // hidden
@ -2052,7 +2052,9 @@ static char * mshape_names[] =
"up-arrow", "up-arrow",
NULL NULL
}; };
#endif
# define MSHAPE_NAMES_COUNT (ARRAY_LENGTH(mshape_names) - 1)
# endif
/* /*
* Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape' * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape'
@ -2355,7 +2357,7 @@ get_shape_idx(int mouse)
#endif #endif
# if defined(FEAT_MOUSESHAPE) || defined(PROTO) # if defined(FEAT_MOUSESHAPE) || defined(PROTO)
static int old_mouse_shape = 0; static int current_mouse_shape = 0;
/* /*
* Set the mouse shape: * Set the mouse shape:
@ -2389,18 +2391,18 @@ update_mouseshape(int shape_idx)
shape_idx = -2; shape_idx = -2;
if (shape_idx == -2 if (shape_idx == -2
&& old_mouse_shape != shape_table[SHAPE_IDX_CLINE].mshape && current_mouse_shape != shape_table[SHAPE_IDX_CLINE].mshape
&& old_mouse_shape != shape_table[SHAPE_IDX_STATUS].mshape && current_mouse_shape != shape_table[SHAPE_IDX_STATUS].mshape
&& old_mouse_shape != shape_table[SHAPE_IDX_VSEP].mshape) && current_mouse_shape != shape_table[SHAPE_IDX_VSEP].mshape)
return; return;
if (shape_idx < 0) if (shape_idx < 0)
new_mouse_shape = shape_table[get_shape_idx(TRUE)].mshape; new_mouse_shape = shape_table[get_shape_idx(TRUE)].mshape;
else else
new_mouse_shape = shape_table[shape_idx].mshape; 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); mch_set_mouse_shape(new_mouse_shape);
old_mouse_shape = new_mouse_shape; current_mouse_shape = new_mouse_shape;
} }
postponed_mouseshape = FALSE; postponed_mouseshape = FALSE;
} }
@ -2408,6 +2410,25 @@ update_mouseshape(int shape_idx)
#endif // CURSOR_SHAPE #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 * Change directory to "new_dir". Search 'cdpath' for relative directory

View File

@ -3,8 +3,8 @@ int virtual_active(void);
int getviscol(void); int getviscol(void);
int coladvance_force(colnr_T wcol); int coladvance_force(colnr_T wcol);
int getviscol2(colnr_T col, colnr_T coladd); int getviscol2(colnr_T col, colnr_T coladd);
int coladvance(colnr_T wcol); int coladvance(colnr_T wantcol);
int getvpos(pos_T *pos, colnr_T wcol); int getvpos(pos_T *pos, colnr_T wantcol);
int inc_cursor(void); int inc_cursor(void);
int inc(pos_T *lp); int inc(pos_T *lp);
int incl(pos_T *lp); int incl(pos_T *lp);
@ -47,6 +47,7 @@ int vim_stat(const char *name, stat_T *stp);
char *parse_shape_opt(int what); char *parse_shape_opt(int what);
int get_shape_idx(int mouse); int get_shape_idx(int mouse);
void update_mouseshape(int shape_idx); void update_mouseshape(int shape_idx);
void f_getmouseshape(typval_T *argvars, typval_T *rettv);
int vim_chdir(char_u *new_dir); int vim_chdir(char_u *new_dir);
int get_user_name(char_u *buf, int len); int get_user_name(char_u *buf, int len);
void free_username(void); void free_username(void);

View File

@ -2890,6 +2890,12 @@ func Test_getmousepos()
bwipe! bwipe!
endfunc endfunc
func Test_getmouseshape()
CheckFeature mouseshape
call assert_equal('arrow', getmouseshape())
endfunc
" Test for glob() " Test for glob()
func Test_glob() func Test_glob()
call assert_equal('', glob(test_null_string())) call assert_equal('', glob(test_null_string()))

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
881,
/**/ /**/
880, 880,
/**/ /**/