0
0
mirror of https://github.com/vim/vim.git synced 2025-10-12 06:44:06 -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:
Bram Moolenaar
2019-05-09 18:59:31 +02:00
parent eae1b91fea
commit d4aa83af1d
10 changed files with 87 additions and 8 deletions

View File

@@ -29,8 +29,8 @@ static const unsigned short cmdidxs1[26] =
/* v */ 503,
/* w */ 521,
/* x */ 535,
/* y */ 544,
/* z */ 545
/* y */ 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 },
/* 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 },
/* 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 },
/* 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;

View File

@@ -1739,6 +1739,9 @@ EX(CMD_xnoremap, "xnoremap", ex_map,
EX(CMD_xnoremenu, "xnoremenu", ex_menu,
RANGE|ZEROR|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
ADDR_OTHER),
EX(CMD_xrestore, "xrestore", ex_xrestore,
EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
EX(CMD_xunmap, "xunmap", ex_unmap,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
ADDR_NONE),

View File

@@ -394,6 +394,9 @@ static void ex_folddo(exarg_T *eap);
#ifndef FEAT_TERMINAL
# define ex_terminal ex_ni
#endif
#if !defined(FEAT_X11) || !defined(FEAT_XCLIPBOARD)
# define ex_xrestore ex_ni
#endif
/*
* Declare cmdnames[].

View File

@@ -1279,9 +1279,14 @@ EXTERN linenr_T printer_page_num;
#endif
#ifdef FEAT_XCLIPBOARD
EXTERN char *xterm_display INIT(= NULL); /* xterm display name; points
into argv[] */
EXTERN Display *xterm_dpy INIT(= NULL); /* xterm display pointer */
// xterm display name
EXTERN char *xterm_display INIT(= NULL);
// 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
#if defined(FEAT_XCLIPBOARD) || defined(FEAT_GUI_X11)
EXTERN XtAppContext app_context INIT(= (XtAppContext)NULL);

View File

@@ -1659,6 +1659,25 @@ may_restore_clipboard(void)
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
/*
@@ -1761,6 +1780,10 @@ get_x11_windis(void)
x11_window = (Window)atol(winid);
#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)
{
/* We may have checked it already, but Gnome terminal can move us to
@@ -7661,7 +7684,7 @@ do_xterm_trace(void)
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.
*/

View File

@@ -13,6 +13,7 @@ void reset_signals(void);
int vim_handle_signal(int sig);
int mch_check_win(int argc, char **argv);
int mch_input_isatty(void);
void ex_xrestore(exarg_T *eap);
int mch_can_restore_title(void);
int mch_can_restore_icon(void);
void mch_settitle(char_u *title, char_u *icon);

View File

@@ -110,3 +110,29 @@ func Test_paste_visual_mode()
bwipe!
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

View File

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