@@ -451,6 +451,22 @@ popup_show_curline(win_T *wp)
451451 wp -> w_topline = wp -> w_cursor .lnum ;
452452 else if (wp -> w_cursor .lnum >= wp -> w_botline )
453453 wp -> w_topline = wp -> w_cursor .lnum - wp -> w_height + 1 ;
454+
455+ // Don't use "firstline" now.
456+ wp -> w_firstline = 0 ;
457+ }
458+
459+ /*
460+ * Get the sign group name for window "wp".
461+ * Returns a pointer to a static buffer, overwritten on the next call.
462+ */
463+ static char_u *
464+ popup_get_sign_name (win_T * wp )
465+ {
466+ static char buf [30 ];
467+
468+ vim_snprintf (buf , sizeof (buf ), "popup-%d" , wp -> w_id );
469+ return (char_u * )buf ;
454470}
455471
456472/*
@@ -460,20 +476,31 @@ popup_show_curline(win_T *wp)
460476 static void
461477popup_highlight_curline (win_T * wp )
462478{
463- int id ;
464- char buf [ 100 ] ;
479+ int sign_id = 0 ;
480+ char_u * sign_name = popup_get_sign_name ( wp ) ;
465481
466- match_delete (wp , 1 , FALSE );
482+ buf_delete_signs (wp -> w_buffer , ( char_u * ) "popupmenu" );
467483
468484 if ((wp -> w_popup_flags & POPF_CURSORLINE ) != 0 )
469485 {
470486 popup_show_curline (wp );
471487
472- id = syn_name2id ((char_u * )"PopupSelected" );
473- vim_snprintf (buf , sizeof (buf ), "\\%%%dl.*" , (int )wp -> w_cursor .lnum );
474- match_add (wp , (char_u * )(id == 0 ? "PmenuSel" : "PopupSelected" ),
475- (char_u * )buf , 10 , 1 , NULL , NULL );
488+ if (!sign_exists_by_name (sign_name ))
489+ {
490+ char * linehl = "PopupSelected" ;
491+
492+ if (syn_name2id ((char_u * )linehl ) == 0 )
493+ linehl = "PmenuSel" ;
494+ sign_define_by_name (sign_name , NULL ,
495+ (char_u * )linehl , NULL , NULL );
496+ }
497+
498+ sign_place (& sign_id , (char_u * )"popupmenu" , sign_name ,
499+ wp -> w_buffer , wp -> w_cursor .lnum , SIGN_DEF_PRIO );
500+ redraw_win_later (wp , NOT_VALID );
476501 }
502+ else
503+ sign_undefine_by_name (sign_name , FALSE);
477504}
478505
479506/*
@@ -545,6 +572,8 @@ apply_general_options(win_T *wp, dict_T *dict)
545572 set_string_option_direct_in_win (wp , (char_u * )"wincolor" , -1 ,
546573 str , OPT_FREE |OPT_LOCAL , 0 );
547574
575+ set_string_option_direct_in_win (wp , (char_u * )"signcolumn" , -1 ,
576+ (char_u * )"no" , OPT_FREE |OPT_LOCAL , 0 );
548577 set_padding_border (dict , wp -> w_popup_padding , "padding" , 999 );
549578 set_padding_border (dict , wp -> w_popup_border , "border" , 1 );
550579
@@ -1219,7 +1248,7 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
12191248
12201249 if (argvars != NULL )
12211250 {
1222- // Check arguments look OK.
1251+ // Check that arguments look OK.
12231252 if (argvars [0 ].v_type == VAR_NUMBER )
12241253 {
12251254 buf = buflist_findnr ( argvars [0 ].vval .v_number );
@@ -1671,7 +1700,7 @@ f_popup_filter_menu(typval_T *argvars, typval_T *rettv)
16711700 ++ wp -> w_cursor .lnum ;
16721701 if (old_lnum != wp -> w_cursor .lnum )
16731702 {
1674- popup_highlight_curline (wp );
1703+ // caller will call popup_highlight_curline()
16751704 return ;
16761705 }
16771706
@@ -1849,10 +1878,12 @@ f_popup_settext(typval_T *argvars, typval_T *rettv UNUSED)
18491878 static void
18501879popup_free (win_T * wp )
18511880{
1881+ sign_undefine_by_name (popup_get_sign_name (wp ), FALSE);
18521882 wp -> w_buffer -> b_locked = FALSE;
18531883 if (wp -> w_winrow + wp -> w_height >= cmdline_row )
18541884 clear_cmdline = TRUE;
18551885 win_free_popup (wp );
1886+
18561887 redraw_all_later (NOT_VALID );
18571888 popup_mask_refresh = TRUE;
18581889}
@@ -2161,7 +2192,8 @@ f_popup_getoptions(typval_T *argvars, typval_T *rettv)
21612192 dict_add_string (dict , "title" , wp -> w_popup_title );
21622193 dict_add_number (dict , "wrap" , wp -> w_p_wrap );
21632194 dict_add_number (dict , "drag" , wp -> w_popup_drag );
2164- dict_add_number (dict , "cursorline" , (wp -> w_popup_flags & POPF_CURSORLINE ) != 0 );
2195+ dict_add_number (dict , "cursorline" ,
2196+ (wp -> w_popup_flags & POPF_CURSORLINE ) != 0 );
21652197 dict_add_string (dict , "highlight" , wp -> w_p_wcr );
21662198 if (wp -> w_scrollbar_highlight != NULL )
21672199 dict_add_string (dict , "scrollbarhighlight" ,
@@ -2321,7 +2353,7 @@ invoke_popup_filter(win_T *wp, int c)
23212353 // NOTE: The callback might close the popup, thus make "wp" invalid.
23222354 call_callback (& wp -> w_filter_cb , -1 ,
23232355 & rettv , 2 , argv , NULL , 0L , 0L , & dummy , TRUE, NULL );
2324- if (old_lnum != wp -> w_cursor .lnum )
2356+ if (win_valid_popup ( wp ) && old_lnum != wp -> w_cursor .lnum )
23252357 popup_highlight_curline (wp );
23262358
23272359 res = tv_get_number (& rettv );
0 commit comments