@@ -3641,16 +3641,6 @@ choose_clipmethod(void)
36413641 clip_init_single (& clip_star , primary );
36423642 }
36433643
3644- # if defined(FEAT_X11 ) || defined(FEAT_WAYLAND_CLIPBOARD )
3645- if (method == CLIPMETHOD_PROVIDER )
3646- {
3647- // If we are on a system that has the plus register, use that. Otherwise
3648- // use the the star register. But we can never use both for clipboard
3649- // provider functionality.
3650- clip_star .available = FALSE;
3651- }
3652- #endif
3653-
36543644 clipmethod = method ;
36553645
36563646#ifdef FEAT_EVAL
@@ -3746,66 +3736,70 @@ clip_provider_get_callback(
37463736 typval_T provider_tv ;
37473737 typval_T action_tv ;
37483738 typval_T func_tv ;
3739+ callback_T cb ;
37493740
37503741 if (dict_get_tv (providers , (char * )provider , & provider_tv ) == FAIL )
3751- return FAIL ;
3742+ return FAIL ;
37523743 else if (provider_tv .v_type != VAR_DICT )
37533744 {
3754- clear_tv (& provider_tv );
3755- return FAIL ;
3745+ clear_tv (& provider_tv );
3746+ return FAIL ;
37563747 }
3757- else if (dict_get_tv (provider_tv .vval .v_dict , "copy" , & action_tv ) == FAIL )
3748+ else if (dict_get_tv (
3749+ provider_tv .vval .v_dict ,
3750+ (char * )function ,
3751+ & action_tv ) == FAIL )
37583752 {
3759- clear_tv (& provider_tv );
3753+ clear_tv (& provider_tv );
37603754 return FAIL ;
37613755 }
37623756 else if (action_tv .v_type != VAR_DICT )
37633757 {
3764- clear_tv (& provider_tv );
3758+ clear_tv (& provider_tv );
37653759 clear_tv (& action_tv );
37663760 return FAIL ;
37673761 }
37683762 else if (dict_get_tv (action_tv .vval .v_dict , (char * )reg , & func_tv ) == FAIL )
37693763 {
3770- clear_tv (& provider_tv );
3764+ clear_tv (& provider_tv );
37713765 clear_tv (& action_tv );
37723766 return FAIL ;
37733767 }
3774- else if ((* callback = get_callback (& func_tv )).cb_name == NULL )
3768+ else if ((cb = get_callback (& func_tv )).cb_name == NULL )
37753769 {
3776- clear_tv (& provider_tv );
3770+ clear_tv (& provider_tv );
37773771 clear_tv (& action_tv );
37783772 clear_tv (& func_tv );
37793773 return FAIL ;
37803774 }
37813775 clear_tv (& provider_tv );
37823776 clear_tv (& action_tv );
3777+
3778+ // func_tv owns the function name, so we must make a copy for the callback
3779+ set_callback (callback , & cb );
3780+ free_callback (& cb );
37833781 clear_tv (& func_tv );
37843782 return OK ;
37853783}
37863784
37873785 static void
37883786clip_provider_set_selection (Clipboard_T * cbd , char_u * provider )
37893787{
3790- char * reg = (cbd == & clip_star ) ? "*" : "+" ;
37913788 callback_T callback ;
37923789 typval_T rettv ;
3793- typval_T argvars [4 ];
3790+ typval_T argvars [3 ];
37943791 yankreg_T * y_ptr ;
37953792 char_u type [2 + NUMBUFLEN ];
37963793 list_T * list = NULL ;
37973794
37983795 if (clip_provider_get_callback (
3799- (char_u * )reg ,
3796+ (char_u * )( cbd == & clip_star ? "*" : "+" ) ,
38003797 provider ,
38013798 (char_u * )"copy" ,
38023799 & callback ) == FAIL )
38033800 return ;
38043801
3805- argvars [0 ].v_type = VAR_STRING ;
3806- argvars [0 ].vval .v_string = (char_u * )reg ;
3807-
3808- // Get register type
3802+ // Convert register type into a string
38093803 if (cbd == & clip_plus )
38103804 y_ptr = get_y_register (PLUS_REGISTER );
38113805 else
@@ -3827,8 +3821,8 @@ clip_provider_set_selection(Clipboard_T *cbd, char_u *provider)
38273821 break ;
38283822 }
38293823
3830- argvars [1 ].v_type = VAR_STRING ;
3831- argvars [1 ].vval .v_string = type ;
3824+ argvars [0 ].v_type = VAR_STRING ;
3825+ argvars [0 ].vval .v_string = type ;
38323826
38333827 /* // Get register contents by creating a list of lines */
38343828 list = list_alloc ();
@@ -3849,14 +3843,14 @@ clip_provider_set_selection(Clipboard_T *cbd, char_u *provider)
38493843
38503844 list -> lv_refcount ++ ;
38513845
3852- argvars [2 ].v_type = VAR_LIST ;
3853- argvars [2 ].v_lock = VAR_FIXED ;
3854- argvars [2 ].vval .v_list = list ;
3846+ argvars [1 ].v_type = VAR_LIST ;
3847+ argvars [1 ].v_lock = VAR_FIXED ;
3848+ argvars [1 ].vval .v_list = list ;
38553849
3856- argvars [3 ].v_type = VAR_UNKNOWN ;
3850+ argvars [2 ].v_type = VAR_UNKNOWN ;
38573851
38583852 textlock ++ ;
3859- call_callback (& callback , -1 , & rettv , 3 , argvars );
3853+ call_callback (& callback , -1 , & rettv , 2 , argvars );
38603854 clear_tv (& rettv );
38613855 textlock -- ;
38623856
@@ -3867,80 +3861,67 @@ clip_provider_set_selection(Clipboard_T *cbd, char_u *provider)
38673861 static void
38683862clip_provider_request_selection (Clipboard_T * cbd , char_u * provider )
38693863{
3870- char * reg = (cbd == & clip_star ) ? "*" : "+" ;
38713864 callback_T callback ;
3872- typval_T argvars [2 ];
3865+ typval_T argvars [1 ];
38733866 typval_T rettv ;
3874- int reg_type ;
38753867 int ret ;
3876- list_T * lines ;
3877- char_u * regtype ;
3878- yankreg_T * y_ptr ;
3868+ char_u * reg_type ;
3869+ char_u * contents ;
38793870
38803871 if (clip_provider_get_callback (
3881- (char_u * )reg ,
3872+ (char_u * )( cbd == & clip_star ? "*" : "+" ) ,
38823873 provider ,
38833874 (char_u * )"paste" ,
38843875 & callback ) == FAIL )
38853876 return ;
38863877
3887- argvars [0 ].v_type = VAR_STRING ;
3888- argvars [0 ].vval .v_string = (char_u * )reg ;
3878+ argvars [0 ].v_type = VAR_UNKNOWN ;
38893879
38903880 textlock ++ ;
3891- ret = call_callback (& callback , -1 , & rettv , 1 , argvars );
3881+ ret = call_callback (& callback , -1 , & rettv , 0 , argvars );
38923882 textlock -- ;
38933883
38943884 if (ret == FAIL )
38953885 goto exit ;
38963886 else if (rettv .v_type == VAR_TUPLE
38973887 && TUPLE_LEN (rettv .vval .v_tuple ) == 2
38983888 && TUPLE_ITEM (rettv .vval .v_tuple , 0 )-> v_type == VAR_STRING
3899- && TUPLE_ITEM (rettv .vval .v_tuple , 1 )-> v_type == VAR_LIST )
3889+ && TUPLE_ITEM (rettv .vval .v_tuple , 1 )-> v_type == VAR_STRING )
39003890 {
3901- regtype = TUPLE_ITEM (rettv .vval .v_tuple , 0 )-> vval .v_string ;
3902- lines = TUPLE_ITEM (rettv .vval .v_tuple , 0 )-> vval .v_list ;
3891+ reg_type = TUPLE_ITEM (rettv .vval .v_tuple , 0 )-> vval .v_string ;
3892+ contents = TUPLE_ITEM (rettv .vval .v_tuple , 1 )-> vval .v_string ;
39033893 }
39043894 else if (rettv .v_type == VAR_LIST
39053895 && rettv .vval .v_list -> lv_len == 2
39063896 && rettv .vval .v_list -> lv_first -> li_tv .v_type == VAR_STRING
3907- && rettv .vval .v_list -> lv_first -> li_next -> li_tv .v_type == VAR_LIST )
3897+ && rettv .vval .v_list -> lv_first -> li_next -> li_tv .v_type == VAR_STRING )
39083898 {
3909- regtype = rettv .vval .v_list -> lv_first -> li_tv .vval .v_string ;
3910- lines = rettv .vval .v_list -> lv_first -> li_next -> li_tv .vval .v_list ;
3899+ reg_type = rettv .vval .v_list -> lv_first -> li_tv .vval .v_string ;
3900+ contents = rettv .vval .v_list -> lv_first -> li_next -> li_tv .vval .v_string ;
39113901 }
39123902 else
39133903 {
3914- textlock -- ;
39153904 emsg (_ (e_clip_provider_failed_calling_paste_callback ));
39163905 goto exit ;
39173906 }
3918- textlock -- ;
39193907
3920- switch (* regtype )
39213908 {
3922- case 'v' :
3923- case 'c' :
3924- reg_type = MCHAR ;
3925- break ;
3926- case 'V' :
3927- case 'l' :
3928- reg_type = MLINE ;
3929- break ;
3930- case Ctrl_V :
3931- case 'b' :
3932- reg_type = MBLOCK ;
3933- break ;
3934- default :
3909+ char_u yank_type ;
3910+ long block_len = -1 ;
3911+ yankreg_T * y_ptr ;
3912+
3913+ if (get_yank_type (& reg_type , & yank_type , & block_len ) == FAIL )
39353914 goto exit ;
3936- };
39373915
3938- if (cbd == & clip_plus )
3939- y_ptr = get_y_register (PLUS_REGISTER );
3940- else
3941- y_ptr = get_y_register (STAR_REGISTER );
3916+ if (cbd == & clip_plus )
3917+ y_ptr = get_y_register (PLUS_REGISTER );
3918+ else
3919+ y_ptr = get_y_register (STAR_REGISTER );
39423920
3943- clip_free_selection (cbd );
3921+ clip_free_selection (cbd );
3922+
3923+ str_to_reg (y_ptr , yank_type , contents , STRLEN (contents ), block_len , FALSE);
3924+ }
39443925
39453926exit :
39463927 free_callback (& callback );
0 commit comments