comparison src/popupwin.c @ 16904:9138e2c60bf1 v8.1.1453

patch 8.1.1453: popup window "moved" property not implemented yet commit https://github.com/vim/vim/commit/3397f74ac2ac27f1eef48e950c3c8eeb0338fe55 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 2 18:40:06 2019 +0200 patch 8.1.1453: popup window "moved" property not implemented yet Problem: Popup window "moved" property not implemented yet. Solution: Implement it.
author Bram Moolenaar <Bram@vim.org>
date Sun, 02 Jun 2019 18:45:06 +0200
parents 23645f9a5ce2
children df06694b761b
comparison
equal deleted inserted replaced
16903:52ff7612af87 16904:9138e2c60bf1
282 wp->w_border_char[i] = wp->w_border_char[1]; 282 wp->w_border_char[i] = wp->w_border_char[1];
283 for (i = 1; i < 4; ++i) 283 for (i = 1; i < 4; ++i)
284 wp->w_border_char[i] = wp->w_border_char[0]; 284 wp->w_border_char[i] = wp->w_border_char[0];
285 } 285 }
286 } 286 }
287 }
288
289 di = dict_find(dict, (char_u *)"moved", -1);
290 if (di != NULL)
291 {
292 wp->w_popup_curwin = curwin;
293 wp->w_popup_lnum = curwin->w_cursor.lnum;
294 wp->w_popup_mincol = curwin->w_cursor.col;
295 wp->w_popup_maxcol = curwin->w_cursor.col;
296 if (di->di_tv.v_type == VAR_STRING && di->di_tv.vval.v_string != NULL)
297 {
298 char_u *s = di->di_tv.vval.v_string;
299 int flags = 0;
300
301 if (STRCMP(s, "word") == 0)
302 flags = FIND_IDENT | FIND_STRING;
303 else if (STRCMP(s, "WORD") == 0)
304 flags = FIND_STRING;
305 else if (STRCMP(s, "any") != 0)
306 semsg(_(e_invarg2), s);
307 if (flags != 0)
308 {
309 char_u *ptr;
310 int len = find_ident_under_cursor(&ptr, flags);
311
312 if (len > 0)
313 {
314 wp->w_popup_mincol = (int)(ptr - ml_get_curline());
315 wp->w_popup_maxcol = wp->w_popup_mincol + len - 1;
316 }
317 }
318 }
319 else if (di->di_tv.v_type == VAR_LIST
320 && di->di_tv.vval.v_list != NULL
321 && di->di_tv.vval.v_list->lv_len == 2)
322 {
323 list_T *l = di->di_tv.vval.v_list;
324
325 wp->w_popup_mincol = tv_get_number(&l->lv_first->li_tv);
326 wp->w_popup_maxcol = tv_get_number(&l->lv_first->li_next->li_tv);
327 }
328 else
329 semsg(_(e_invarg2), tv_get_string(&di->di_tv));
287 } 330 }
288 } 331 }
289 332
290 /* 333 /*
291 * Add lines to the popup from a list of strings. 334 * Add lines to the popup from a list of strings.
706 clear_tv(&argv[1]); 749 clear_tv(&argv[1]);
707 clear_tv(&rettv); 750 clear_tv(&rettv);
708 } 751 }
709 752
710 /* 753 /*
754 * Close popup "wp" and invoke any close callback for it.
755 */
756 static void
757 popup_close_and_callback(win_T *wp, typval_T *arg)
758 {
759 int id = wp->w_id;
760
761 if (wp->w_close_cb.cb_name != NULL)
762 // Careful: This may make "wp" invalid.
763 invoke_popup_callback(wp, arg);
764
765 popup_close(id);
766 }
767
768 /*
711 * popup_close({id}) 769 * popup_close({id})
712 */ 770 */
713 void 771 void
714 f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) 772 f_popup_close(typval_T *argvars, typval_T *rettv UNUSED)
715 { 773 {
716 int id = (int)tv_get_number(argvars); 774 int id = (int)tv_get_number(argvars);
717 win_T *wp = find_popup_win(id); 775 win_T *wp = find_popup_win(id);
718 776
719 if (wp != NULL) 777 if (wp != NULL)
720 { 778 popup_close_and_callback(wp, &argvars[1]);
721 if (wp->w_close_cb.cb_name != NULL)
722 // Careful: This may make "wp" invalid.
723 invoke_popup_callback(wp, &argvars[1]);
724
725 popup_close(id);
726 }
727 } 779 }
728 780
729 /* 781 /*
730 * popup_hide({id}) 782 * popup_hide({id})
731 */ 783 */
1064 res = invoke_popup_filter(wp, c); 1116 res = invoke_popup_filter(wp, c);
1065 1117
1066 return res; 1118 return res;
1067 } 1119 }
1068 1120
1121 /*
1122 * Called when the cursor moved: check if any popup needs to be closed if the
1123 * cursor moved far enough.
1124 */
1125 void
1126 popup_check_cursor_pos()
1127 {
1128 win_T *wp;
1129 typval_T tv;
1130
1131 popup_reset_handled();
1132 while ((wp = find_next_popup(TRUE)) != NULL)
1133 if (wp->w_popup_curwin != NULL
1134 && (curwin != wp->w_popup_curwin
1135 || curwin->w_cursor.lnum != wp->w_popup_lnum
1136 || curwin->w_cursor.col < wp->w_popup_mincol
1137 || curwin->w_cursor.col > wp->w_popup_maxcol))
1138 {
1139 tv.v_type = VAR_NUMBER;
1140 tv.vval.v_number = -1;
1141 popup_close_and_callback(wp, &tv);
1142 }
1143 }
1144
1069 #endif // FEAT_TEXT_PROP 1145 #endif // FEAT_TEXT_PROP