Mercurial > vim
comparison src/popupwin.c @ 16890:5131023c5728 v8.1.1446
patch 8.1.1446: popup window callback not implemented yet
commit https://github.com/vim/vim/commit/9eaac896501bcd6abdd430a90293eae8101df24a
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jun 1 22:49:29 2019 +0200
patch 8.1.1446: popup window callback not implemented yet
Problem: Popup window callback not implemented yet.
Solution: Implement the callback.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 01 Jun 2019 23:00:06 +0200 |
parents | ec61b6b79865 |
children | 60c9ac14a2ec |
comparison
equal
deleted
inserted
replaced
16889:b6d0ad5822b1 | 16890:5131023c5728 |
---|---|
197 di = dict_find(dict, (char_u *)"wrap", -1); | 197 di = dict_find(dict, (char_u *)"wrap", -1); |
198 if (di != NULL) | 198 if (di != NULL) |
199 { | 199 { |
200 nr = dict_get_number(dict, (char_u *)"wrap"); | 200 nr = dict_get_number(dict, (char_u *)"wrap"); |
201 wp->w_p_wrap = nr != 0; | 201 wp->w_p_wrap = nr != 0; |
202 } | |
203 | |
204 di = dict_find(dict, (char_u *)"callback", -1); | |
205 if (di != NULL) | |
206 { | |
207 callback_T callback = get_callback(&di->di_tv); | |
208 | |
209 if (callback.cb_name != NULL) | |
210 set_callback(&wp->w_close_cb, &callback); | |
202 } | 211 } |
203 | 212 |
204 di = dict_find(dict, (char_u *)"filter", -1); | 213 di = dict_find(dict, (char_u *)"filter", -1); |
205 if (di != NULL) | 214 if (di != NULL) |
206 { | 215 { |
630 return TRUE; | 639 return TRUE; |
631 return FALSE; | 640 return FALSE; |
632 } | 641 } |
633 | 642 |
634 /* | 643 /* |
644 * Invoke the close callback for window "wp" with value "result". | |
645 * Careful: The callback may make "wp" invalid! | |
646 */ | |
647 static void | |
648 invoke_popup_callback(win_T *wp, typval_T *result) | |
649 { | |
650 typval_T rettv; | |
651 int dummy; | |
652 typval_T argv[3]; | |
653 | |
654 argv[0].v_type = VAR_NUMBER; | |
655 argv[0].vval.v_number = (varnumber_T)wp->w_id; | |
656 | |
657 if (result != NULL && result->v_type != VAR_UNKNOWN) | |
658 copy_tv(result, &argv[1]); | |
659 else | |
660 { | |
661 argv[1].v_type = VAR_NUMBER; | |
662 argv[1].vval.v_number = 0; | |
663 } | |
664 | |
665 argv[2].v_type = VAR_UNKNOWN; | |
666 | |
667 call_callback(&wp->w_close_cb, -1, | |
668 &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); | |
669 if (result != NULL) | |
670 clear_tv(&argv[1]); | |
671 clear_tv(&rettv); | |
672 } | |
673 | |
674 /* | |
635 * popup_close({id}) | 675 * popup_close({id}) |
636 */ | 676 */ |
637 void | 677 void |
638 f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) | 678 f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) |
639 { | 679 { |
640 int id = (int)tv_get_number(argvars); | 680 int id = (int)tv_get_number(argvars); |
641 | 681 win_T *wp = find_popup_win(id); |
642 popup_close(id); | 682 |
683 if (wp != NULL) | |
684 { | |
685 if (wp->w_close_cb.cb_name != NULL) | |
686 // Careful: This may make "wp" invalid. | |
687 invoke_popup_callback(wp, &argvars[1]); | |
688 | |
689 popup_close(id); | |
690 } | |
643 } | 691 } |
644 | 692 |
645 /* | 693 /* |
646 * popup_hide({id}) | 694 * popup_hide({id}) |
647 */ | 695 */ |
686 redraw_all_later(NOT_VALID); | 734 redraw_all_later(NOT_VALID); |
687 } | 735 } |
688 | 736 |
689 /* | 737 /* |
690 * Close a popup window by Window-id. | 738 * Close a popup window by Window-id. |
739 * Does not invoke the callback. | |
691 */ | 740 */ |
692 void | 741 void |
693 popup_close(int id) | 742 popup_close(int id) |
694 { | 743 { |
695 win_T *wp; | 744 win_T *wp; |