Mercurial > vim
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 |