mirror of
https://github.com/vim/vim.git
synced 2025-07-04 23:07:33 -04:00
patch 8.1.1307: cannot reconnect to the X server after it restarted
Problem: Cannot reconnect to the X server after it restarted. Solution: Add the :xrestore command. (Adrian Kocis, closes #844)
This commit is contained in:
parent
eae1b91fea
commit
d4aa83af1d
@ -1714,6 +1714,7 @@ tag command action ~
|
|||||||
|:xmapclear| :xmapc[lear] remove all mappings for Visual mode
|
|:xmapclear| :xmapc[lear] remove all mappings for Visual mode
|
||||||
|:xmap| :xm[ap] like ":map" but for Visual mode
|
|:xmap| :xm[ap] like ":map" but for Visual mode
|
||||||
|:xmenu| :xme[nu] add menu for Visual mode
|
|:xmenu| :xme[nu] add menu for Visual mode
|
||||||
|
|:xrestore| :xr[estore] restores the X server connection
|
||||||
|:xnoremap| :xn[oremap] like ":noremap" but for Visual mode
|
|:xnoremap| :xn[oremap] like ":noremap" but for Visual mode
|
||||||
|:xnoremenu| :xnoreme[nu] like ":noremenu" but for Visual mode
|
|:xnoremenu| :xnoreme[nu] like ":noremenu" but for Visual mode
|
||||||
|:xunmap| :xu[nmap] like ":unmap" but for Visual mode
|
|:xunmap| :xu[nmap] like ":unmap" but for Visual mode
|
||||||
|
@ -704,6 +704,21 @@ K Run a program to lookup the keyword under the
|
|||||||
available when compiled with the |+netbeans_intg|
|
available when compiled with the |+netbeans_intg|
|
||||||
feature}
|
feature}
|
||||||
|
|
||||||
|
*:xrestore* *:xr*
|
||||||
|
:xr[estore] [display] Reinitializes the connection to the X11 server. Useful
|
||||||
|
after the X server restarts, e.g. when running Vim for
|
||||||
|
long time inside screen/tmux and connecting from
|
||||||
|
different machines).
|
||||||
|
[display] should be in the format of the $DISPLAY
|
||||||
|
environment variable (e.g. "localhost:10.0")
|
||||||
|
If [display] is omitted, then it reinitializes the
|
||||||
|
connection to the X11 server using the same value as
|
||||||
|
was used for the previous execution of this command.
|
||||||
|
If the value was never specified, then it uses the
|
||||||
|
value of $DISPLAY environment variable as it was when
|
||||||
|
Vim was started.
|
||||||
|
{only available when compiled with the |+clipboard|
|
||||||
|
feature}
|
||||||
|
|
||||||
*g_CTRL-A*
|
*g_CTRL-A*
|
||||||
g CTRL-A Only when Vim was compiled with MEM_PROFILING defined
|
g CTRL-A Only when Vim was compiled with MEM_PROFILING defined
|
||||||
|
@ -29,8 +29,8 @@ static const unsigned short cmdidxs1[26] =
|
|||||||
/* v */ 503,
|
/* v */ 503,
|
||||||
/* w */ 521,
|
/* w */ 521,
|
||||||
/* x */ 535,
|
/* x */ 535,
|
||||||
/* y */ 544,
|
/* y */ 545,
|
||||||
/* z */ 545
|
/* z */ 546
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -64,9 +64,9 @@ static const unsigned char cmdidxs2[26][26] =
|
|||||||
/* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
/* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
/* v */ { 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 9, 12, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0 },
|
/* v */ { 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 9, 12, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, 0, 0 },
|
||||||
/* w */ { 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 8, 0, 9, 10, 0, 0, 0, 12, 13, 0, 0, 0, 0 },
|
/* w */ { 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 8, 0, 9, 10, 0, 0, 0, 12, 13, 0, 0, 0, 0 },
|
||||||
/* x */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0 },
|
/* x */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 0, 0, 0, 7, 0, 0, 8, 0, 0, 0, 0, 0 },
|
||||||
/* y */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
/* y */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||||
/* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
/* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int command_count = 558;
|
static const int command_count = 559;
|
||||||
|
@ -1739,6 +1739,9 @@ EX(CMD_xnoremap, "xnoremap", ex_map,
|
|||||||
EX(CMD_xnoremenu, "xnoremenu", ex_menu,
|
EX(CMD_xnoremenu, "xnoremenu", ex_menu,
|
||||||
RANGE|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
|
RANGE|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
|
||||||
ADDR_OTHER),
|
ADDR_OTHER),
|
||||||
|
EX(CMD_xrestore, "xrestore", ex_xrestore,
|
||||||
|
EXTRA|TRLBAR|CMDWIN,
|
||||||
|
ADDR_NONE),
|
||||||
EX(CMD_xunmap, "xunmap", ex_unmap,
|
EX(CMD_xunmap, "xunmap", ex_unmap,
|
||||||
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
|
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
|
||||||
ADDR_NONE),
|
ADDR_NONE),
|
||||||
|
@ -394,6 +394,9 @@ static void ex_folddo(exarg_T *eap);
|
|||||||
#ifndef FEAT_TERMINAL
|
#ifndef FEAT_TERMINAL
|
||||||
# define ex_terminal ex_ni
|
# define ex_terminal ex_ni
|
||||||
#endif
|
#endif
|
||||||
|
#if !defined(FEAT_X11) || !defined(FEAT_XCLIPBOARD)
|
||||||
|
# define ex_xrestore ex_ni
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Declare cmdnames[].
|
* Declare cmdnames[].
|
||||||
|
@ -1279,9 +1279,14 @@ EXTERN linenr_T printer_page_num;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_XCLIPBOARD
|
#ifdef FEAT_XCLIPBOARD
|
||||||
EXTERN char *xterm_display INIT(= NULL); /* xterm display name; points
|
// xterm display name
|
||||||
into argv[] */
|
EXTERN char *xterm_display INIT(= NULL);
|
||||||
EXTERN Display *xterm_dpy INIT(= NULL); /* xterm display pointer */
|
|
||||||
|
// whether xterm_display was allocated, when FALSE it points into argv[]
|
||||||
|
EXTERN int xterm_display_allocated INIT(= FALSE);
|
||||||
|
|
||||||
|
// xterm display pointer
|
||||||
|
EXTERN Display *xterm_dpy INIT(= NULL);
|
||||||
#endif
|
#endif
|
||||||
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11)
|
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11)
|
||||||
EXTERN XtAppContext app_context INIT(= (XtAppContext)NULL);
|
EXTERN XtAppContext app_context INIT(= (XtAppContext)NULL);
|
||||||
|
@ -1659,6 +1659,25 @@ may_restore_clipboard(void)
|
|||||||
get_x11_title(FALSE);
|
get_x11_title(FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ex_xrestore(exarg_T *eap)
|
||||||
|
{
|
||||||
|
if (eap->arg != NULL && STRLEN(eap->arg) > 0)
|
||||||
|
{
|
||||||
|
if (xterm_display_allocated)
|
||||||
|
vim_free(xterm_display);
|
||||||
|
xterm_display = (char *)vim_strsave(eap->arg);
|
||||||
|
xterm_display_allocated = TRUE;
|
||||||
|
}
|
||||||
|
smsg(_("restoring display %s"), xterm_display == NULL
|
||||||
|
? (char *)mch_getenv("DISPLAY") : xterm_display);
|
||||||
|
|
||||||
|
clear_xterm_clip();
|
||||||
|
x11_window = 0;
|
||||||
|
xterm_dpy_retry_count = 5; // Try reconnecting five times
|
||||||
|
may_restore_clipboard();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1761,6 +1780,10 @@ get_x11_windis(void)
|
|||||||
x11_window = (Window)atol(winid);
|
x11_window = (Window)atol(winid);
|
||||||
|
|
||||||
#ifdef FEAT_XCLIPBOARD
|
#ifdef FEAT_XCLIPBOARD
|
||||||
|
if (xterm_dpy == x11_display)
|
||||||
|
// x11_display may have been set to xterm_dpy elsewhere
|
||||||
|
x11_display_from = XD_XTERM;
|
||||||
|
|
||||||
if (xterm_dpy != NULL && x11_window != 0)
|
if (xterm_dpy != NULL && x11_window != 0)
|
||||||
{
|
{
|
||||||
/* We may have checked it already, but Gnome terminal can move us to
|
/* We may have checked it already, but Gnome terminal can move us to
|
||||||
@ -7661,7 +7684,7 @@ do_xterm_trace(void)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
# if defined(FEAT_GUI) || defined(PROTO)
|
# if defined(FEAT_GUI) || defined(FEAT_XCLIPBOARD) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* Destroy the display, window and app_context. Required for GTK.
|
* Destroy the display, window and app_context. Required for GTK.
|
||||||
*/
|
*/
|
||||||
|
@ -13,6 +13,7 @@ void reset_signals(void);
|
|||||||
int vim_handle_signal(int sig);
|
int vim_handle_signal(int sig);
|
||||||
int mch_check_win(int argc, char **argv);
|
int mch_check_win(int argc, char **argv);
|
||||||
int mch_input_isatty(void);
|
int mch_input_isatty(void);
|
||||||
|
void ex_xrestore(exarg_T *eap);
|
||||||
int mch_can_restore_title(void);
|
int mch_can_restore_title(void);
|
||||||
int mch_can_restore_icon(void);
|
int mch_can_restore_icon(void);
|
||||||
void mch_settitle(char_u *title, char_u *icon);
|
void mch_settitle(char_u *title, char_u *icon);
|
||||||
|
@ -110,3 +110,29 @@ func Test_paste_visual_mode()
|
|||||||
|
|
||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func CheckCopyPaste()
|
||||||
|
call setline(1, ['copy this', ''])
|
||||||
|
normal 1G0"*y$
|
||||||
|
normal j"*p
|
||||||
|
call assert_equal('copy this', getline(2))
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_xrestore()
|
||||||
|
if !has('xterm_clipboard')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
call ch_logfile('logfile', 'w')
|
||||||
|
let display = $DISPLAY
|
||||||
|
new
|
||||||
|
call CheckCopyPaste()
|
||||||
|
|
||||||
|
xrestore
|
||||||
|
call CheckCopyPaste()
|
||||||
|
|
||||||
|
exe "xrestore " .. display
|
||||||
|
call CheckCopyPaste()
|
||||||
|
|
||||||
|
call ch_logfile('', '')
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
@ -767,6 +767,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 */
|
||||||
|
/**/
|
||||||
|
1307,
|
||||||
/**/
|
/**/
|
||||||
1306,
|
1306,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user