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;