mirror of
https://github.com/vim/vim.git
synced 2025-10-26 09:14:23 -04:00
patch 9.1.1652: cannot determine non-X11/Wayland clipmethods
Problem: Cannot determine non-X11/Wayland clipmethods Solution: Add the "gui" value to the 'clipmethod' option (Foxe Chen) closes: #18006 Signed-off-by: Foxe Chen <chen.foxe@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
96b2154b73
commit
3e152c76ad
266
src/clipboard.c
266
src/clipboard.c
@@ -142,32 +142,28 @@ clip_update_selection(Clipboard_T *clip)
|
||||
}
|
||||
|
||||
static int
|
||||
clip_gen_own_selection(Clipboard_T *cbd)
|
||||
clip_gen_own_selection(Clipboard_T *cbd UNUSED)
|
||||
{
|
||||
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
|
||||
# ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
return clip_mch_own_selection(cbd);
|
||||
else
|
||||
# endif
|
||||
if (clipmethod == CLIPMETHOD_GUI)
|
||||
{
|
||||
#ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
return clip_mch_own_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
return clip_wl_own_selection(cbd);
|
||||
return clip_wl_own_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
return clip_xterm_own_selection(cbd);
|
||||
return clip_xterm_own_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return FAIL;
|
||||
#else
|
||||
return clip_mch_own_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@@ -207,31 +203,27 @@ clip_own_selection(Clipboard_T *cbd)
|
||||
}
|
||||
|
||||
static void
|
||||
clip_gen_lose_selection(Clipboard_T *cbd)
|
||||
clip_gen_lose_selection(Clipboard_T *cbd UNUSED)
|
||||
{
|
||||
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
|
||||
# ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
clip_mch_lose_selection(cbd);
|
||||
else
|
||||
# endif
|
||||
if (clipmethod == CLIPMETHOD_GUI)
|
||||
{
|
||||
if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
clip_wl_lose_selection(cbd);
|
||||
#ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
clip_mch_lose_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
clip_xterm_lose_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#else
|
||||
clip_mch_lose_selection(cbd);
|
||||
else if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
clip_wl_lose_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
clip_xterm_lose_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1257,57 +1249,49 @@ clip_gen_set_selection(Clipboard_T *cbd)
|
||||
return;
|
||||
}
|
||||
}
|
||||
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
|
||||
# ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
clip_mch_set_selection(cbd);
|
||||
else
|
||||
# endif
|
||||
if (clipmethod == CLIPMETHOD_GUI)
|
||||
{
|
||||
if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
clip_wl_set_selection(cbd);
|
||||
#ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
clip_mch_set_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
clip_xterm_set_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#else
|
||||
clip_mch_set_selection(cbd);
|
||||
else if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
clip_wl_set_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
clip_xterm_set_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
clip_gen_request_selection(Clipboard_T *cbd)
|
||||
clip_gen_request_selection(Clipboard_T *cbd UNUSED)
|
||||
{
|
||||
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_WAYLAND_CLIPBOARD)
|
||||
# ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
clip_mch_request_selection(cbd);
|
||||
else
|
||||
# endif
|
||||
if (clipmethod == CLIPMETHOD_GUI)
|
||||
{
|
||||
if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
clip_wl_request_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
clip_xterm_request_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
# ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
clip_mch_request_selection(cbd);
|
||||
# endif
|
||||
}
|
||||
#else
|
||||
clip_mch_request_selection(cbd);
|
||||
else if (clipmethod == CLIPMETHOD_WAYLAND)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
clip_wl_request_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
else if (clipmethod == CLIPMETHOD_X11)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
clip_xterm_request_selection(cbd);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD) && defined(USE_SYSTEM)) \
|
||||
@@ -1324,31 +1308,28 @@ clip_x11_owner_exists(Clipboard_T *cbd)
|
||||
int
|
||||
clip_gen_owner_exists(Clipboard_T *cbd UNUSED)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
# ifdef FEAT_GUI_GTK
|
||||
if (gui.in_use)
|
||||
return clip_gtk_owner_exists(cbd);
|
||||
else
|
||||
# endif
|
||||
if (clipmethod == CLIPMETHOD_OTHER)
|
||||
{
|
||||
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;
|
||||
# ifdef FEAT_GUI_GTK
|
||||
if (gui.in_use)
|
||||
return clip_gtk_owner_exists(cbd);
|
||||
# endif
|
||||
}
|
||||
#else
|
||||
return TRUE;
|
||||
#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
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2735,25 +2716,42 @@ get_clipmethod(char_u *str)
|
||||
|
||||
if (STRCMP(buf, "wayland") == 0)
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
if (wayland_cb_is_ready())
|
||||
method = CLIPMETHOD_WAYLAND;
|
||||
#ifdef FEAT_GUI
|
||||
if (!gui.in_use)
|
||||
#endif
|
||||
{
|
||||
#ifdef FEAT_WAYLAND_CLIPBOARD
|
||||
if (wayland_cb_is_ready())
|
||||
method = CLIPMETHOD_WAYLAND;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (STRCMP(buf, "x11") == 0)
|
||||
{
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
// x_IOerror_handler() in os_unix.c should set xterm_dpy to NULL if
|
||||
// we lost connection to the X server.
|
||||
if (xterm_dpy != NULL)
|
||||
#ifdef FEAT_GUI
|
||||
if (!gui.in_use)
|
||||
#endif
|
||||
{
|
||||
// If the X connection is lost then that handler will longjmp
|
||||
// somewhere else, in that case we will call choose_clipmethod()
|
||||
// again from there, and this if block won't be executed since
|
||||
// xterm_dpy will be set to NULL.
|
||||
xterm_update();
|
||||
method = CLIPMETHOD_X11;
|
||||
#ifdef FEAT_XCLIPBOARD
|
||||
// x_IOerror_handler() in os_unix.c should set xterm_dpy to NULL
|
||||
// if we lost connection to the X server.
|
||||
if (xterm_dpy != NULL)
|
||||
{
|
||||
// If the X connection is lost then that handler will
|
||||
// longjmp somewhere else, in that case we will call
|
||||
// choose_clipmethod() again from there, and this if block
|
||||
// won't be executed since xterm_dpy will be set to NULL.
|
||||
xterm_update();
|
||||
method = CLIPMETHOD_X11;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (STRCMP(buf, "gui") == 0)
|
||||
{
|
||||
#ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
method = CLIPMETHOD_GUI;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
@@ -2779,17 +2777,19 @@ exit:
|
||||
/*
|
||||
* Returns name of clipmethod in a statically allocated string.
|
||||
*/
|
||||
static char *
|
||||
static char_u *
|
||||
clipmethod_to_str(clipmethod_T method)
|
||||
{
|
||||
switch(method)
|
||||
{
|
||||
case CLIPMETHOD_WAYLAND:
|
||||
return "wayland";
|
||||
return (char_u *)"wayland";
|
||||
case CLIPMETHOD_X11:
|
||||
return "x11";
|
||||
return (char_u *)"x11";
|
||||
case CLIPMETHOD_GUI:
|
||||
return (char_u *)"gui";
|
||||
default:
|
||||
return "none";
|
||||
return (char_u *)"none";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2807,29 +2807,13 @@ choose_clipmethod(void)
|
||||
if (method == CLIPMETHOD_FAIL)
|
||||
return e_invalid_argument;
|
||||
|
||||
// If GUI is running or we are not on a system with Wayland or X11, then always
|
||||
// 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
|
||||
#if defined(FEAT_GUI) && defined(FEAT_WAYLAND)
|
||||
if (method == CLIPMETHOD_GUI)
|
||||
// We only interact with Wayland for the clipboard, we can just deinit
|
||||
// everything.
|
||||
wayland_uninit_client();
|
||||
#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
|
||||
if (method == CLIPMETHOD_NONE)
|
||||
clip_init(FALSE);
|
||||
@@ -2844,24 +2828,16 @@ choose_clipmethod(void)
|
||||
// Disown clipboard if we are switching to a new method
|
||||
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)
|
||||
clip_lose_selection(&clip_star);
|
||||
if (clip_plus.owned)
|
||||
clip_lose_selection(&clip_plus);
|
||||
}
|
||||
|
||||
#if !defined(FEAT_XCLIPBOARD) && !defined(FEAT_WAYLAND_CLIPBOARD)
|
||||
exit:
|
||||
#endif
|
||||
|
||||
clipmethod = method;
|
||||
|
||||
#ifdef FEAT_EVAL
|
||||
set_vim_var_string(VV_CLIPMETHOD, (char_u*)clipmethod_to_str(method), -1);
|
||||
set_vim_var_string(VV_CLIPMETHOD, clipmethod_to_str(method), -1);
|
||||
#endif
|
||||
|
||||
return NULL;
|
||||
|
||||
Reference in New Issue
Block a user