1
1

Ticket #2661: support enable bracketed paste of xterm.

Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
Этот коммит содержится в:
Egmont Koblinger 2013-10-01 13:31:13 +04:00 коммит произвёл Andrew Borodin
родитель d87bef778b
Коммит 8f35c90b94
7 изменённых файлов: 58 добавлений и 2 удалений

Просмотреть файл

@ -61,7 +61,9 @@ Antonio Palama, DOS port <palama@posso.dm.unipi.it>
Egmont Koblinger <egmont@gmail.com> Egmont Koblinger <egmont@gmail.com>
Support of 256 colors Support of 256 colors
Support of extended mouse clicks beyond 223 Support of extended mouse clicks beyond 223 column
Support of bracketed paste mode of xterm
(http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Bracketed%20Paste%20Mode)
Erwin van Eijk <wabbit@corner.iaf.nl> Erwin van Eijk <wabbit@corner.iaf.nl>

Просмотреть файл

@ -12,6 +12,7 @@
Norbert Warmuth, 1997 Norbert Warmuth, 1997
Denys Vlasenko <vda.linux@googlemail.com>, 2013 Denys Vlasenko <vda.linux@googlemail.com>, 2013
Slava Zanko <slavazanko@gmail.com>, 2013 Slava Zanko <slavazanko@gmail.com>, 2013
Egmont Koblinger <egmont@gmail.com>, 2013
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -92,6 +93,8 @@ int old_esc_mode = 0;
int old_esc_mode_timeout = 1000000; /* settable via env */ int old_esc_mode_timeout = 1000000; /* settable via env */
int use_8th_bit_as_meta = 0; int use_8th_bit_as_meta = 0;
gboolean bracketed_pasting_in_progress = FALSE;
/* This table is a mapping between names and the constants we use /* This table is a mapping between names and the constants we use
* We use this to allow users to define alternate definitions for * We use this to allow users to define alternate definitions for
* certain keys that may be missing from the terminal database * certain keys that may be missing from the terminal database
@ -275,6 +278,8 @@ typedef int (*ph_pqc_f) (unsigned short, PhCursorInfo_t *);
static key_define_t mc_default_keys[] = { static key_define_t mc_default_keys[] = {
{ESC_CHAR, ESC_STR, MCKEY_ESCAPE}, {ESC_CHAR, ESC_STR, MCKEY_ESCAPE},
{ESC_CHAR, ESC_STR ESC_STR, MCKEY_NOACTION}, {ESC_CHAR, ESC_STR ESC_STR, MCKEY_NOACTION},
{MCKEY_BRACKETED_PASTING_START, ESC_STR "[200~", MCKEY_NOACTION},
{MCKEY_BRACKETED_PASTING_END, ESC_STR "[201~", MCKEY_NOACTION},
{0, NULL, MCKEY_NOACTION}, {0, NULL, MCKEY_NOACTION},
}; };
@ -2145,7 +2150,17 @@ tty_get_event (struct Gpm_Event *event, gboolean redo_event, gboolean block)
{ {
/* Mouse event */ /* Mouse event */
xmouse_get_event (event, c == MCKEY_EXTENDED_MOUSE); xmouse_get_event (event, c == MCKEY_EXTENDED_MOUSE);
return (event->type != 0) ? EV_MOUSE : EV_NONE; c = (event->type != 0) ? EV_MOUSE : EV_NONE;
}
else if (c == MCKEY_BRACKETED_PASTING_START)
{
bracketed_pasting_in_progress = TRUE;
c = EV_NONE;
}
else if (c == MCKEY_BRACKETED_PASTING_END)
{
bracketed_pasting_in_progress = FALSE;
c = EV_NONE;
} }
return c; return c;
@ -2250,3 +2265,22 @@ application_keypad_mode (void)
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void
enable_bracketed_paste (void)
{
printf (ESC_STR "[?2004h");
fflush (stdout);
}
/* --------------------------------------------------------------------------------------------- */
void
disable_bracketed_paste (void)
{
printf (ESC_STR "[?2004l");
fflush (stdout);
bracketed_pasting_in_progress = FALSE;
}
/* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -36,6 +36,10 @@
/* Return code for the extended mouse sequence */ /* Return code for the extended mouse sequence */
#define MCKEY_EXTENDED_MOUSE -3 #define MCKEY_EXTENDED_MOUSE -3
/* Return code for brackets of bracketed paste mode */
#define MCKEY_BRACKETED_PASTING_START -4
#define MCKEY_BRACKETED_PASTING_END -5
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/
@ -61,6 +65,8 @@ extern int old_esc_mode;
extern int use_8th_bit_as_meta; extern int use_8th_bit_as_meta;
extern int mou_auto_repeat; extern int mou_auto_repeat;
extern gboolean bracketed_pasting_in_progress;
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
gboolean define_sequence (int code, const char *seq, int action); gboolean define_sequence (int code, const char *seq, int action);
@ -101,6 +107,10 @@ int get_key_code (int nodelay);
void numeric_keypad_mode (void); void numeric_keypad_mode (void);
void application_keypad_mode (void); void application_keypad_mode (void);
/* Bracketed paste mode */
void enable_bracketed_paste (void);
void disable_bracketed_paste (void);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/
static inline gboolean static inline gboolean

Просмотреть файл

@ -218,6 +218,7 @@ void
tty_shutdown (void) tty_shutdown (void)
{ {
disable_mouse (); disable_mouse ();
disable_bracketed_paste ();
tty_reset_shell_mode (); tty_reset_shell_mode ();
tty_noraw_mode (); tty_noraw_mode ();
tty_keypad (FALSE); tty_keypad (FALSE);

Просмотреть файл

@ -347,6 +347,7 @@ tty_shutdown (void)
char *op_cap; char *op_cap;
disable_mouse (); disable_mouse ();
disable_bracketed_paste ();
tty_reset_shell_mode (); tty_reset_shell_mode ();
tty_noraw_mode (); tty_noraw_mode ();
tty_keypad (FALSE); tty_keypad (FALSE);

Просмотреть файл

@ -88,6 +88,7 @@ edition_post_exec (void)
tty_raw_mode (); tty_raw_mode ();
channels_up (); channels_up ();
enable_mouse (); enable_mouse ();
enable_bracketed_paste ();
if (mc_global.tty.alternate_plus_minus) if (mc_global.tty.alternate_plus_minus)
application_keypad_mode (); application_keypad_mode ();
} }
@ -107,6 +108,7 @@ edition_pre_exec (void)
channels_down (); channels_down ();
disable_mouse (); disable_mouse ();
disable_bracketed_paste ();
tty_reset_shell_mode (); tty_reset_shell_mode ();
tty_keypad (FALSE); tty_keypad (FALSE);
@ -455,6 +457,7 @@ toggle_panels (void)
channels_down (); channels_down ();
disable_mouse (); disable_mouse ();
disable_bracketed_paste ();
if (clear_before_exec) if (clear_before_exec)
clr_scr (); clr_scr ();
if (mc_global.tty.alternate_plus_minus) if (mc_global.tty.alternate_plus_minus)
@ -518,6 +521,7 @@ toggle_panels (void)
} }
enable_mouse (); enable_mouse ();
enable_bracketed_paste ();
channels_up (); channels_up ();
if (mc_global.tty.alternate_plus_minus) if (mc_global.tty.alternate_plus_minus)
application_keypad_mode (); application_keypad_mode ();

Просмотреть файл

@ -381,6 +381,10 @@ main (int argc, char *argv[])
w/o Shift button in subshell in the native console */ w/o Shift button in subshell in the native console */
init_mouse (); init_mouse ();
/* Done after do_enter_ca_mode (tty_init) because in VTE bracketed mode is
separate for the normal and alternate screens */
enable_bracketed_paste ();
/* subshell_prompt is NULL here */ /* subshell_prompt is NULL here */
mc_prompt = (geteuid () == 0) ? "# " : "$ "; mc_prompt = (geteuid () == 0) ? "# " : "$ ";