To: vim_dev@googlegroups.com Subject: Patch 9.0.0881 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.0.0881 Problem: Cannot get the currently showing mouse shape. Solution: Add getmouseshape(). 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 *** ../vim-9.0.0880/runtime/doc/builtin.txt 2022-11-12 16:07:01.777944369 +0000 --- runtime/doc/builtin.txt 2022-11-14 19:47:43.442229750 +0000 *************** *** 246,251 **** --- 246,252 ---- 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,3884 **** --- 3880,3891 ---- 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 *** ../vim-9.0.0880/runtime/doc/usr_41.txt 2022-10-07 14:31:04.320852668 +0100 --- runtime/doc/usr_41.txt 2022-11-14 19:43:32.730012439 +0000 *************** *** 1109,1114 **** --- 1110,1116 ---- 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 *** ../vim-9.0.0880/src/evalfunc.c 2022-11-12 16:07:01.777944369 +0000 --- src/evalfunc.c 2022-11-14 19:26:16.489449370 +0000 *************** *** 1983,1988 **** --- 1983,1990 ---- 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, *** ../vim-9.0.0880/src/misc2.c 2022-10-14 20:09:00.895207512 +0100 --- src/misc2.c 2022-11-14 19:39:36.393873297 +0000 *************** *** 2027,2038 **** {0, 0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR}, }; ! #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[] = { "arrow", // default, must be the first one "blank", // hidden --- 2027,2038 ---- {0, 0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR}, }; ! # 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[] = { "arrow", // default, must be the first one "blank", // hidden *************** *** 2052,2058 **** "up-arrow", NULL }; ! #endif /* * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape' --- 2052,2060 ---- "up-arrow", NULL }; ! ! # define MSHAPE_NAMES_COUNT (ARRAY_LENGTH(mshape_names) - 1) ! # endif /* * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape' *************** *** 2355,2361 **** #endif # if defined(FEAT_MOUSESHAPE) || defined(PROTO) ! static int old_mouse_shape = 0; /* * Set the mouse shape: --- 2357,2363 ---- #endif # if defined(FEAT_MOUSESHAPE) || defined(PROTO) ! static int current_mouse_shape = 0; /* * Set the mouse shape: *************** *** 2389,2406 **** 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) 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) { mch_set_mouse_shape(new_mouse_shape); ! old_mouse_shape = new_mouse_shape; } postponed_mouseshape = FALSE; } --- 2391,2408 ---- shape_idx = -2; if (shape_idx == -2 ! && 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 != current_mouse_shape) { mch_set_mouse_shape(new_mouse_shape); ! current_mouse_shape = new_mouse_shape; } postponed_mouseshape = FALSE; } *************** *** 2408,2413 **** --- 2410,2434 ---- #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 *** ../vim-9.0.0880/src/proto/misc2.pro 2022-06-27 23:15:16.000000000 +0100 --- src/proto/misc2.pro 2022-11-14 19:37:37.181807901 +0000 *************** *** 3,10 **** 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 inc_cursor(void); int inc(pos_T *lp); int incl(pos_T *lp); --- 3,10 ---- int getviscol(void); int coladvance_force(colnr_T wcol); int getviscol2(colnr_T col, colnr_T coladd); ! 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,52 **** --- 47,53 ---- 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); *** ../vim-9.0.0880/src/testdir/test_functions.vim 2022-11-13 22:13:29.848975595 +0000 --- src/testdir/test_functions.vim 2022-11-14 19:45:52.198137195 +0000 *************** *** 2890,2895 **** --- 2890,2901 ---- 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())) *** ../vim-9.0.0880/src/version.c 2022-11-14 15:31:04.045587449 +0000 --- src/version.c 2022-11-14 19:26:55.673468896 +0000 *************** *** 697,698 **** --- 697,700 ---- { /* Add new patch number below this line */ + /**/ + 881, /**/ -- hundred-and-one symptoms of being an internet addict: 66. You create a homepage with the impression to cure the afflicted...but your hidden agenda is to receive more e-mail. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///