Skip to content

Commit ec7f2e4

Browse files
committed
fix bugs
now works properly
1 parent b397b32 commit ec7f2e4

File tree

3 files changed

+54
-72
lines changed

3 files changed

+54
-72
lines changed

src/clipboard.c

Lines changed: 52 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -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
37883786
clip_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
38683862
clip_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

39453926
exit:
39463927
free_callback(&callback);

src/evalfunc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11500,7 +11500,7 @@ f_setpos(typval_T *argvars, typval_T *rettv)
1150011500
/*
1150111501
* Translate a register type string to the yank type and block length
1150211502
*/
11503-
static int
11503+
int
1150411504
get_yank_type(char_u **pp, char_u *yank_type, long *block_len)
1150511505
{
1150611506
char_u *stropt = *pp;

src/proto/evalfunc.pro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@ void f_len(typval_T *argvars, typval_T *rettv);
2828
void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv);
2929
void range_list_materialize(list_T *list);
3030
long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, typval_T *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit);
31+
int get_yank_type(char_u **pp, char_u *yank_type, long *block_len);
3132
/* vim: set ft=c : */

0 commit comments

Comments
 (0)