# HG changeset patch # User Bram Moolenaar # Date 1308438869 -7200 # Node ID fd4224d9ee09801ed1ad9341a72c4683e291bb76 # Parent 307eb4bcc51a5c13dc6d87c3132667e8898f4679 updated for version 7.3.221 Problem: Text from the clipboard is sometimes handled as linewise, but not consistently. Solution: Assume the text is linewise when it ends in a CR or NL. diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -1173,7 +1173,7 @@ selection_received_cb(GtkWidget *widget char_u *tmpbuf = NULL; guchar *tmpbuf_utf8 = NULL; int len; - int motion_type; + int motion_type = MAUTO; if (data->selection == clip_plus.gtk_sel_atom) cbd = &clip_plus; @@ -1182,7 +1182,6 @@ selection_received_cb(GtkWidget *widget text = (char_u *)data->data; len = data->length; - motion_type = MCHAR; if (text == NULL || len <= 0) { diff --git a/src/gui_mac.c b/src/gui_mac.c --- a/src/gui_mac.c +++ b/src/gui_mac.c @@ -4671,7 +4671,7 @@ clip_mch_request_selection(VimClipboard if (flavor) type = **textOfClip; else - type = (strchr(*textOfClip, '\r') != NULL) ? MLINE : MCHAR; + type = MAUTO; tempclip = lalloc(scrapSize + 1, TRUE); mch_memmove(tempclip, *textOfClip + flavor, scrapSize); diff --git a/src/ops.c b/src/ops.c --- a/src/ops.c +++ b/src/ops.c @@ -5733,7 +5733,9 @@ clip_get_selection(cbd) } } -/* Convert from the GUI selection string into the '*'/'+' register */ +/* + * Convert from the GUI selection string into the '*'/'+' register. + */ void clip_yank_selection(type, str, len, cbd) int type; @@ -6090,9 +6092,6 @@ write_reg_contents_ex(name, str, maxlen, if (yank_type == MBLOCK) yank_type = MAUTO; #endif - if (yank_type == MAUTO) - yank_type = ((len > 0 && (str[len - 1] == '\n' || str[len - 1] == '\r')) - ? MLINE : MCHAR); str_to_reg(y_current, yank_type, str, len, block_len); # ifdef FEAT_CLIPBOARD @@ -6113,13 +6112,14 @@ write_reg_contents_ex(name, str, maxlen, * is appended. */ static void -str_to_reg(y_ptr, type, str, len, blocklen) +str_to_reg(y_ptr, yank_type, str, len, blocklen) struct yankreg *y_ptr; /* pointer to yank register */ - int type; /* MCHAR, MLINE or MBLOCK */ + int yank_type; /* MCHAR, MLINE, MBLOCK, MAUTO */ char_u *str; /* string to put in register */ long len; /* length of string */ long blocklen; /* width of Visual block */ { + int type; /* MCHAR, MLINE or MBLOCK */ int lnum; long start; long i; @@ -6136,6 +6136,12 @@ str_to_reg(y_ptr, type, str, len, blockl if (y_ptr->y_array == NULL) /* NULL means empty register */ y_ptr->y_size = 0; + if (yank_type == MAUTO) + type = ((len > 0 && (str[len - 1] == NL || str[len - 1] == CAR)) + ? MLINE : MCHAR); + else + type = yank_type; + /* * Count the number of lines within the string */ diff --git a/src/os_msdos.c b/src/os_msdos.c --- a/src/os_msdos.c +++ b/src/os_msdos.c @@ -2232,7 +2232,7 @@ clip_mch_lose_selection(VimClipboard *cb void clip_mch_request_selection(VimClipboard *cbd) { - int type = MCHAR; + int type = MAUTO; char_u *pAllocated = NULL; char_u *pClipText = NULL; int clip_data_format = 0; @@ -2280,14 +2280,12 @@ clip_mch_request_selection(VimClipboard { clip_data_format = CF_TEXT; pClipText = pAllocated; - type = (vim_strchr((char*)pClipText, '\r') != NULL) ? MLINE : MCHAR; } else if ((pAllocated = Win16GetClipboardData(CF_OEMTEXT)) != NULL) { clip_data_format = CF_OEMTEXT; pClipText = pAllocated; - type = (vim_strchr((char*)pClipText, '\r') != NULL) ? MLINE : MCHAR; } /* Did we get anything? */ diff --git a/src/os_mswin.c b/src/os_mswin.c --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -1410,9 +1410,9 @@ clip_mch_request_selection(VimClipboard { char_u *temp_clipboard; - /* If the type is not known guess it. */ + /* If the type is not known detect it. */ if (metadata.type == -1) - metadata.type = (vim_strchr(str, '\n') == NULL) ? MCHAR : MLINE; + metadata.type = MAUTO; /* Translate into . */ temp_clipboard = crnl_to_nl(str, &str_size); diff --git a/src/os_qnx.c b/src/os_qnx.c --- a/src/os_qnx.c +++ b/src/os_qnx.c @@ -93,7 +93,7 @@ clip_mch_request_selection( VimClipboard clip_length = clip_header->length - 1; if( clip_text != NULL && is_type_set == FALSE ) - type = (strchr( clip_text, '\r' ) != NULL) ? MLINE : MCHAR; + type = MAUTO; } if( (clip_text != NULL) && (clip_length > 0) ) diff --git a/src/ui.c b/src/ui.c --- a/src/ui.c +++ b/src/ui.c @@ -1609,7 +1609,7 @@ add_to_input_buf_csi(char_u *str, int le #if defined(FEAT_HANGULIN) || defined(PROTO) void -push_raw_key (s, len) +push_raw_key(s, len) char_u *s; int len; { @@ -2016,7 +2016,7 @@ clip_x11_request_selection_cb(w, success long_u *length; int *format; { - int motion_type; + int motion_type = MAUTO; long_u len; char_u *p; char **text_list = NULL; @@ -2036,7 +2036,6 @@ clip_x11_request_selection_cb(w, success *(int *)success = FALSE; return; } - motion_type = MCHAR; p = (char_u *)value; len = *length; if (*type == vim_atom) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 221, +/**/ 220, /**/ 219,