0
0
mirror of https://github.com/vim/vim.git synced 2025-08-23 19:34:27 -04:00

patch 9.1.1656: MS-Windows: Patch v9.1.1652 breaks clipboard

Problem:  MS-Windows: Patch v9.1.1652 breaks clipboard
          (ddad431, after v9.1.1652)
Solution: Revert the patch

Revert "patch 9.1.1652: cannot determine non-X11/Wayland clipmethods"

This reverts commit 3e152c76adb9542af86760786d42a0beffe5354b.

fixes: #18064

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt 2025-08-20 21:07:07 +02:00
parent 3e44fbf316
commit 17b4c7cfa2
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
11 changed files with 170 additions and 147 deletions

View File

@ -1,4 +1,4 @@
*eval.txt* For Vim version 9.1. Last change: 2025 Aug 18 *eval.txt* For Vim version 9.1. Last change: 2025 Aug 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -2245,9 +2245,8 @@ v:clipmethod The current method of accessing the clipboard that is being
used. Can either have the value of: used. Can either have the value of:
wayland The Wayland protocol is being used. wayland The Wayland protocol is being used.
x11 X11 selections are being used. x11 X11 selections are being used.
gui GUI specific method is being used. none The above methods are unavailable or
none Clipboard functionality is disabled or cannot be used.
unavailable.
See 'clipmethod' for more details. See 'clipmethod' for more details.
*v:cmdarg* *cmdarg-variable* *v:cmdarg* *cmdarg-variable*

View File

@ -1,4 +1,4 @@
*options.txt* For Vim version 9.1. Last change: 2025 Aug 18 *options.txt* For Vim version 9.1. Last change: 2025 Aug 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -1891,9 +1891,9 @@ A jump table for the options with a short description can be found at |Q_op|.
{pattern}, this must be the last entry. {pattern}, this must be the last entry.
*'clipmethod'* *'cpm'* *'clipmethod'* *'cpm'*
'clipmethod' 'cpm' string (default for Unix: "wayland,x11,gui", 'clipmethod' 'cpm' string (default for Unix: "wayland,x11",
for VMS: "x11,gui", for VMS: "x11",
otherwise: "gui") otherwise: "")
global global
{only when the |+xterm_clipboard| or {only when the |+xterm_clipboard| or
|+wayland_clipboard| features are included} |+wayland_clipboard| features are included}
@ -1902,16 +1902,19 @@ A jump table for the options with a short description can be found at |Q_op|.
methods are: methods are:
wayland Wayland selections wayland Wayland selections
x11 X11 selections x11 X11 selections
gui GUI specific method
Note: This option is ignored when either the GUI is running or if Vim
is run on a system without Wayland or X11 support, such as Windows or
macOS. The GUI or system way of accessing the clipboard is always
used instead.
The option value is a list of comma separated items. The list is The option value is a list of comma separated items. The list is
parsed left to right in order, and the first method that Vim parsed left to right in order, and the first method that Vim
determines is available or is working is used as the actual method for determines is available or is working is used as the actual method for
accessing the clipboard. Setting this option to an empty value accessing the clipboard.
disables the clipboard functionality on all systems.
The current method that is being used can be found in the The current method that is being used can be found in the |v:clipmethod|
|v:clipmethod| variable. variable.
*'cmdheight'* *'ch'* *'cmdheight'* *'ch'*
'cmdheight' 'ch' number (default 1) 'cmdheight' 'ch' number (default 1)

View File

@ -1,4 +1,4 @@
*wayland.txt* For Vim version 9.1. Last change: 2025 Aug 18 *wayland.txt* For Vim version 9.1. Last change: 2025 Aug 20
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@ -22,7 +22,7 @@ multiple Wayland seats in the same Wayland session.
See |gui-wayland|. Please note that when using the GUI, Vim uses the toolkit See |gui-wayland|. Please note that when using the GUI, Vim uses the toolkit
such as GTK for accessing the clipboard, and does not access the clipboard such as GTK for accessing the clipboard, and does not access the clipboard
though Wayland. You can check this though the |v:clipmethod| variable, which though Wayland. You can check this though the |v:clipmethod| variable, which
should equal to "gui" when running the GUI. should equal to "none" when running the GUI.
Wayland commands: Wayland commands:
*:wlrestore* *:wl* *:wlrestore* *:wl*
@ -72,7 +72,7 @@ selections, see |wayland-primary-selection| for more details.
*wayland-persist* *wayland-persist*
If you use X11 cut buffers, no such things exist on Wayland. Instead to If you use X11 cut buffers, no such things exist on Wayland. Instead to
emulate such functionality, a separate clipboard manager must be used in order emulate such functionality, a separate clipboard manager must be used in order
to persist selection data when a Wayland client exits. to persist selection data when a Wayland client exists.
*wayland-and-x11* *wayland-and-x11*
If your version of Vim comes compiled with both X11 and Wayland support, then If your version of Vim comes compiled with both X11 and Wayland support, then

View File

@ -142,28 +142,32 @@ clip_update_selection(Clipboard_T *clip)
} }
static int static int
clip_gen_own_selection(Clipboard_T *cbd UNUSED) clip_gen_own_selection(Clipboard_T *cbd)
{ {
if (clipmethod == CLIPMETHOD_GUI) #if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
{ # ifdef FEAT_GUI
#ifdef FEAT_GUI if (gui.in_use)
if (gui.in_use) return clip_mch_own_selection(cbd);
return clip_mch_own_selection(cbd); else
#endif # endif
}
else if (clipmethod == CLIPMETHOD_WAYLAND)
{ {
if (clipmethod == CLIPMETHOD_WAYLAND)
{
#ifdef FEAT_WAYLAND_CLIPBOARD #ifdef FEAT_WAYLAND_CLIPBOARD
return clip_wl_own_selection(cbd); return clip_wl_own_selection(cbd);
#endif #endif
} }
else if (clipmethod == CLIPMETHOD_X11) else if (clipmethod == CLIPMETHOD_X11)
{ {
#ifdef FEAT_XCLIPBOARD #ifdef FEAT_XCLIPBOARD
return clip_xterm_own_selection(cbd); return clip_xterm_own_selection(cbd);
#endif #endif
}
} }
return FAIL; return FAIL;
#else
return clip_mch_own_selection(cbd);
#endif
} }
void void
@ -203,27 +207,31 @@ clip_own_selection(Clipboard_T *cbd)
} }
static void static void
clip_gen_lose_selection(Clipboard_T *cbd UNUSED) clip_gen_lose_selection(Clipboard_T *cbd)
{ {
if (clipmethod == CLIPMETHOD_GUI) #if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
{ # ifdef FEAT_GUI
#ifdef FEAT_GUI if (gui.in_use)
if (gui.in_use) clip_mch_lose_selection(cbd);
clip_mch_lose_selection(cbd); else
#endif # endif
}
else if (clipmethod == CLIPMETHOD_WAYLAND)
{ {
if (clipmethod == CLIPMETHOD_WAYLAND)
{
#ifdef FEAT_WAYLAND_CLIPBOARD #ifdef FEAT_WAYLAND_CLIPBOARD
clip_wl_lose_selection(cbd); clip_wl_lose_selection(cbd);
#endif #endif
} }
else if (clipmethod == CLIPMETHOD_X11) else if (clipmethod == CLIPMETHOD_X11)
{ {
#ifdef FEAT_XCLIPBOARD #ifdef FEAT_XCLIPBOARD
clip_xterm_lose_selection(cbd); clip_xterm_lose_selection(cbd);
#endif #endif
}
} }
#else
clip_mch_lose_selection(cbd);
#endif
} }
void void
@ -1249,49 +1257,57 @@ clip_gen_set_selection(Clipboard_T *cbd)
return; return;
} }
} }
if (clipmethod == CLIPMETHOD_GUI) #if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
{ # ifdef FEAT_GUI
#ifdef FEAT_GUI if (gui.in_use)
if (gui.in_use)
clip_mch_set_selection(cbd); clip_mch_set_selection(cbd);
#endif else
} # endif
else if (clipmethod == CLIPMETHOD_WAYLAND)
{ {
if (clipmethod == CLIPMETHOD_WAYLAND)
{
#ifdef FEAT_WAYLAND_CLIPBOARD #ifdef FEAT_WAYLAND_CLIPBOARD
clip_wl_set_selection(cbd); clip_wl_set_selection(cbd);
#endif #endif
} }
else if (clipmethod == CLIPMETHOD_X11) else if (clipmethod == CLIPMETHOD_X11)
{ {
#ifdef FEAT_XCLIPBOARD #ifdef FEAT_XCLIPBOARD
clip_xterm_set_selection(cbd); clip_xterm_set_selection(cbd);
#endif #endif
}
} }
#else
clip_mch_set_selection(cbd);
#endif
} }
static void static void
clip_gen_request_selection(Clipboard_T *cbd UNUSED) clip_gen_request_selection(Clipboard_T *cbd)
{ {
if (clipmethod == CLIPMETHOD_GUI) #if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
{
# ifdef FEAT_GUI # ifdef FEAT_GUI
if (gui.in_use) if (gui.in_use)
clip_mch_request_selection(cbd); clip_mch_request_selection(cbd);
else
# endif # endif
}
else if (clipmethod == CLIPMETHOD_WAYLAND)
{ {
if (clipmethod == CLIPMETHOD_WAYLAND)
{
#ifdef FEAT_WAYLAND_CLIPBOARD #ifdef FEAT_WAYLAND_CLIPBOARD
clip_wl_request_selection(cbd); clip_wl_request_selection(cbd);
#endif #endif
} }
else if (clipmethod == CLIPMETHOD_X11) else if (clipmethod == CLIPMETHOD_X11)
{ {
#ifdef FEAT_XCLIPBOARD #ifdef FEAT_XCLIPBOARD
clip_xterm_request_selection(cbd); clip_xterm_request_selection(cbd);
#endif #endif
}
} }
#else
clip_mch_request_selection(cbd);
#endif
} }
#if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) && defined(USE_SYSTEM)) \ #if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) && defined(USE_SYSTEM)) \
@ -1308,28 +1324,31 @@ clip_x11_owner_exists(Clipboard_T *cbd)
int int
clip_gen_owner_exists(Clipboard_T *cbd UNUSED) clip_gen_owner_exists(Clipboard_T *cbd UNUSED)
{ {
if (clipmethod == CLIPMETHOD_OTHER) #ifdef FEAT_XCLIPBOARD
{
# ifdef FEAT_GUI_GTK # ifdef FEAT_GUI_GTK
if (gui.in_use) if (gui.in_use)
return clip_gtk_owner_exists(cbd); return clip_gtk_owner_exists(cbd);
# endif
}
else if (clipmethod == CLIPMETHOD_WAYLAND)
{
# ifdef FEAT_WAYLAND_CLIPBOARD
return clip_wl_owner_exists(cbd);
# endif
}
else if (clipmethod == CLIPMETHOD_X11)
{
# ifdef FEAT_XCLIPBOARD
return clip_x11_owner_exists(cbd);
# endif
}
else else
return FALSE; # endif
return FALSE; {
if (clipmethod == CLIPMETHOD_WAYLAND)
{
#ifdef FEAT_WAYLAND_CLIPBOARD
return clip_wl_owner_exists(cbd);
#endif
}
else if (clipmethod == CLIPMETHOD_X11)
{
#ifdef FEAT_XCLIPBOARD
return clip_x11_owner_exists(cbd);
#endif
}
else
return FALSE;
}
#else
return TRUE;
#endif
} }
#endif #endif
@ -2716,42 +2735,25 @@ get_clipmethod(char_u *str)
if (STRCMP(buf, "wayland") == 0) if (STRCMP(buf, "wayland") == 0)
{ {
#ifdef FEAT_GUI
if (!gui.in_use)
#endif
{
#ifdef FEAT_WAYLAND_CLIPBOARD #ifdef FEAT_WAYLAND_CLIPBOARD
if (wayland_cb_is_ready()) if (wayland_cb_is_ready())
method = CLIPMETHOD_WAYLAND; method = CLIPMETHOD_WAYLAND;
#endif #endif
}
} }
else if (STRCMP(buf, "x11") == 0) else if (STRCMP(buf, "x11") == 0)
{ {
#ifdef FEAT_GUI
if (!gui.in_use)
#endif
{
#ifdef FEAT_XCLIPBOARD #ifdef FEAT_XCLIPBOARD
// x_IOerror_handler() in os_unix.c should set xterm_dpy to NULL // x_IOerror_handler() in os_unix.c should set xterm_dpy to NULL if
// if we lost connection to the X server. // we lost connection to the X server.
if (xterm_dpy != NULL) if (xterm_dpy != NULL)
{ {
// If the X connection is lost then that handler will // If the X connection is lost then that handler will longjmp
// longjmp somewhere else, in that case we will call // somewhere else, in that case we will call choose_clipmethod()
// choose_clipmethod() again from there, and this if block // again from there, and this if block won't be executed since
// won't be executed since xterm_dpy will be set to NULL. // xterm_dpy will be set to NULL.
xterm_update(); xterm_update();
method = CLIPMETHOD_X11; method = CLIPMETHOD_X11;
}
#endif
} }
}
else if (STRCMP(buf, "gui") == 0)
{
#ifdef FEAT_GUI
if (gui.in_use)
method = CLIPMETHOD_GUI;
#endif #endif
} }
else else
@ -2777,19 +2779,17 @@ exit:
/* /*
* Returns name of clipmethod in a statically allocated string. * Returns name of clipmethod in a statically allocated string.
*/ */
static char_u * static char *
clipmethod_to_str(clipmethod_T method) clipmethod_to_str(clipmethod_T method)
{ {
switch(method) switch(method)
{ {
case CLIPMETHOD_WAYLAND: case CLIPMETHOD_WAYLAND:
return (char_u *)"wayland"; return "wayland";
case CLIPMETHOD_X11: case CLIPMETHOD_X11:
return (char_u *)"x11"; return "x11";
case CLIPMETHOD_GUI:
return (char_u *)"gui";
default: default:
return (char_u *)"none"; return "none";
} }
} }
@ -2807,13 +2807,29 @@ choose_clipmethod(void)
if (method == CLIPMETHOD_FAIL) if (method == CLIPMETHOD_FAIL)
return e_invalid_argument; return e_invalid_argument;
#if defined(FEAT_GUI) && defined(FEAT_WAYLAND) // If GUI is running or we are not on a system with Wayland or X11, then always
if (method == CLIPMETHOD_GUI) // return CLIPMETHOD_NONE. System or GUI clipboard handling always overrides.
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
#if defined(FEAT_GUI)
if (gui.in_use)
{
#ifdef FEAT_WAYLAND
// We only interact with Wayland for the clipboard, we can just deinit // We only interact with Wayland for the clipboard, we can just deinit
// everything. // everything.
wayland_uninit_client(); wayland_uninit_client();
#endif #endif
method = CLIPMETHOD_NONE;
goto lose_sel_exit;
}
#endif
#else
// If on a system like windows or macos, then clipmethod is irrelevant, we
// use their way of accessing the clipboard.
method = CLIPMETHOD_NONE;
goto exit;
#endif
// Deinitialize clipboard if there is no way to access clipboard // Deinitialize clipboard if there is no way to access clipboard
if (method == CLIPMETHOD_NONE) if (method == CLIPMETHOD_NONE)
clip_init(FALSE); clip_init(FALSE);
@ -2828,16 +2844,24 @@ choose_clipmethod(void)
// Disown clipboard if we are switching to a new method // Disown clipboard if we are switching to a new method
if (clipmethod != CLIPMETHOD_NONE && method != clipmethod) if (clipmethod != CLIPMETHOD_NONE && method != clipmethod)
{ {
#if (defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)) \
&& defined(FEAT_GUI)
lose_sel_exit:
#endif
if (clip_star.owned) if (clip_star.owned)
clip_lose_selection(&clip_star); clip_lose_selection(&clip_star);
if (clip_plus.owned) if (clip_plus.owned)
clip_lose_selection(&clip_plus); clip_lose_selection(&clip_plus);
} }
#if !defined(FEAT_XCLIPBOARD) && !defined(FEAT_WAYLAND_CLIPBOARD)
exit:
#endif
clipmethod = method; clipmethod = method;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
set_vim_var_string(VV_CLIPMETHOD, clipmethod_to_str(method), -1); set_vim_var_string(VV_CLIPMETHOD, (char_u*)clipmethod_to_str(method), -1);
#endif #endif
return NULL; return NULL;

View File

@ -147,7 +147,7 @@ gui_start(char_u *arg UNUSED)
#endif #endif
} }
else else
// Reset clipmethod to CLIPMETHOD_GUI // Reset clipmethod to CLIPMETHOD_NONE
choose_clipmethod(); choose_clipmethod();
#ifdef FEAT_SOCKETSERVER #ifdef FEAT_SOCKETSERVER

View File

@ -634,11 +634,11 @@ static struct vimoption options[] =
#ifdef FEAT_CLIPBOARD #ifdef FEAT_CLIPBOARD
(char_u *)&p_cpm, PV_NONE, did_set_clipmethod, expand_set_clipmethod, (char_u *)&p_cpm, PV_NONE, did_set_clipmethod, expand_set_clipmethod,
# ifdef UNIX # ifdef UNIX
{(char_u *)"wayland,x11,gui", (char_u *)0L} {(char_u *)"wayland,x11", (char_u *)0L}
# elif defined(VMS) # elif defined(VMS)
{(char_u *)"x11,gui", (char_u *)0L} {(char_u *)"x11", (char_u *)0L}
# else # else
{(char_u *)"gui", (char_u *)0L} {(char_u *)"", (char_u *)0L}
# endif # endif
#else #else
(char_u *)NULL, PV_NONE, NULL, NULL, (char_u *)NULL, PV_NONE, NULL, NULL,

View File

@ -45,7 +45,7 @@ static char *(p_ff_values[]) = {FF_UNIX, FF_DOS, FF_MAC, NULL};
// Note: Keep this in sync with did_set_clipboard() // Note: Keep this in sync with did_set_clipboard()
static char *(p_cb_values[]) = {"unnamed", "unnamedplus", "autoselect", "autoselectplus", "autoselectml", "html", "exclude:", NULL}; static char *(p_cb_values[]) = {"unnamed", "unnamedplus", "autoselect", "autoselectplus", "autoselectml", "html", "exclude:", NULL};
// Note: Keep this in sync with get_clipmethod() // Note: Keep this in sync with get_clipmethod()
static char *(p_cpm_values[]) = {"wayland", "x11", "gui", NULL}; static char *(p_cpm_values[]) = {"wayland", "x11", NULL};
#endif #endif
#ifdef FEAT_CRYPT #ifdef FEAT_CRYPT
static char *(p_cm_values[]) = {"zip", "blowfish", "blowfish2", static char *(p_cm_values[]) = {"zip", "blowfish", "blowfish2",

View File

@ -1,12 +1,14 @@
" Tests for clipmethod " Tests for clipmethod
if has('unix') source util/window_manager.vim
source util/window_manager.vim
endif CheckFeature clipboard_working
CheckFeature xterm_clipboard
CheckFeature wayland_clipboard
CheckUnix
" Test if no available clipmethod sets v:clipmethod to none and deinits clipboard " Test if no available clipmethod sets v:clipmethod to none and deinits clipboard
func Test_no_clipmethod_sets_v_clipmethod_none() func Test_no_clipmethod_sets_v_clipmethod_none()
CheckFeature clipboard_working
CheckNotGui CheckNotGui
set clipmethod= set clipmethod=
@ -17,9 +19,6 @@ endfunc
" Test if method chosen is in line with clipmethod order " Test if method chosen is in line with clipmethod order
func Test_clipmethod_order() func Test_clipmethod_order()
CheckNotGui CheckNotGui
CheckFeature clipboard_working
CheckFeature xterm_clipboard
CheckFeature wayland_clipboard
set cpm=wayland,x11 set cpm=wayland,x11
@ -63,12 +62,12 @@ func Test_clipmethod_order()
call EndWaylandCompositor(l:wayland_display) call EndWaylandCompositor(l:wayland_display)
endfunc endfunc
" Test if clipmethod is set to 'gui' when gui is started " Test if clipmethod is set to 'none' when gui is started
func Test_clipmethod_is_gui_when_gui_started() func Test_clipmethod_is_none_when_gui()
CheckCanRunGui CheckCanRunGui
CheckFeature clipboard_working
let lines =<< trim END let lines =<< trim END
set cpm=wayland,x11
call writefile([v:clipmethod != ""], 'Cbdscript') call writefile([v:clipmethod != ""], 'Cbdscript')
gui -f gui -f
call writefile([v:clipmethod], 'Cbdscript', 'a') call writefile([v:clipmethod], 'Cbdscript', 'a')
@ -79,15 +78,12 @@ func Test_clipmethod_is_gui_when_gui_started()
call writefile(lines, 'Cbdscript', 'D') call writefile(lines, 'Cbdscript', 'D')
call system($'{GetVimCommand()} -S Cbdscript') call system($'{GetVimCommand()} -S Cbdscript')
call assert_equal(['1', 'gui', 'gui'], readfile('Cbdscript')) call assert_equal(['1', 'none', 'none'], readfile('Cbdscript'))
endfunc endfunc
" Test if :clipreset switches methods when current one doesn't work " Test if :clipreset switches methods when current one doesn't work
func Test_clipreset_switches() func Test_clipreset_switches()
CheckNotGui CheckNotGui
CheckFeature clipboard_working
CheckFeature xterm_clipboard
CheckFeature wayland_clipboard
CheckFeature clientserver CheckFeature clientserver
CheckXServer CheckXServer
CheckWaylandCompositor CheckWaylandCompositor

View File

@ -529,7 +529,7 @@ func Test_set_completion_string_values()
if has('unix') || has('vms') if has('unix') || has('vms')
call assert_match('wayland', getcompletion('set clipmethod=', 'cmdline')[1]) call assert_match('wayland', getcompletion('set clipmethod=', 'cmdline')[1])
else else
call assert_match('gui', getcompletion('set clipmethod=', 'cmdline')[0]) call assert_match('wayland', getcompletion('set clipmethod=', 'cmdline')[0])
endif endif
endif endif
call assert_equal('.', getcompletion('set complete=', 'cmdline')[1]) call assert_equal('.', getcompletion('set complete=', 'cmdline')[1])

View File

@ -724,6 +724,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1656,
/**/ /**/
1655, 1655,
/**/ /**/

View File

@ -2299,7 +2299,6 @@ typedef enum {
CLIPMETHOD_NONE, CLIPMETHOD_NONE,
CLIPMETHOD_WAYLAND, CLIPMETHOD_WAYLAND,
CLIPMETHOD_X11, CLIPMETHOD_X11,
CLIPMETHOD_GUI
} clipmethod_T; } clipmethod_T;
// Info about selected text // Info about selected text