From 0454f561e92d24453642f12e8b4c345813fa8dd5 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 5 Jun 2014 10:51:46 -0400 Subject: implement bracketed paste mode (fixes #56) --- src/parser.c | 6 ++++++ src/parser.l | 6 ++++++ src/screen.c | 14 ++++++++++++++ src/screen.h | 3 +++ src/window-xlib.c | 6 ++++++ 5 files changed, 35 insertions(+) diff --git a/src/parser.c b/src/parser.c index 1fc6745..1b1cfc8 100644 --- a/src/parser.c +++ b/src/parser.c @@ -2637,6 +2637,9 @@ static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len) case 1049: runes_screen_use_alternate_buffer(t); break; + case 2004: + runes_screen_set_bracketed_paste(t); + break; default: runes_warn( "unknown SM parameter: %c%d\n", modes[i], params[i]); @@ -2686,6 +2689,9 @@ static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len) case 1049: runes_screen_use_normal_buffer(t); break; + case 2004: + runes_screen_reset_bracketed_paste(t); + break; default: runes_warn( "unknown RM parameter: %c%d\n", modes[i], params[i]); diff --git a/src/parser.l b/src/parser.l index f289c22..e45d642 100644 --- a/src/parser.l +++ b/src/parser.l @@ -507,6 +507,9 @@ static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len) case 1049: runes_screen_use_alternate_buffer(t); break; + case 2004: + runes_screen_set_bracketed_paste(t); + break; default: runes_warn( "unknown SM parameter: %c%d\n", modes[i], params[i]); @@ -556,6 +559,9 @@ static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len) case 1049: runes_screen_use_normal_buffer(t); break; + case 2004: + runes_screen_reset_bracketed_paste(t); + break; default: runes_warn( "unknown RM parameter: %c%d\n", modes[i], params[i]); diff --git a/src/screen.c b/src/screen.c index a9ffb3e..9da213d 100644 --- a/src/screen.c +++ b/src/screen.c @@ -700,6 +700,20 @@ void runes_screen_reset_mouse_reporting_press_release(RunesTerm *t) scr->mouse_reporting_press_release = 0; } +void runes_screen_set_bracketed_paste(RunesTerm *t) +{ + RunesScreen *scr = &t->scr; + + scr->bracketed_paste = 1; +} + +void runes_screen_reset_bracketed_paste(RunesTerm *t) +{ + RunesScreen *scr = &t->scr; + + scr->bracketed_paste = 0; +} + void runes_screen_set_window_title(RunesTerm *t, char *buf, size_t len) { RunesScreen *scr = &t->scr; diff --git a/src/screen.h b/src/screen.h index d08139b..d00b110 100644 --- a/src/screen.h +++ b/src/screen.h @@ -97,6 +97,7 @@ struct runes_screen { unsigned char application_cursor: 1; unsigned char mouse_reporting_press: 1; unsigned char mouse_reporting_press_release: 1; + unsigned char bracketed_paste: 1; unsigned char visual_bell: 1; unsigned char audible_bell: 1; @@ -157,6 +158,8 @@ void runes_screen_set_mouse_reporting_press(RunesTerm *t); void runes_screen_reset_mouse_reporting_press(RunesTerm *t); void runes_screen_set_mouse_reporting_press_release(RunesTerm *t); void runes_screen_reset_mouse_reporting_press_release(RunesTerm *t); +void runes_screen_set_bracketed_paste(RunesTerm *t); +void runes_screen_reset_bracketed_paste(RunesTerm *t); void runes_screen_set_window_title(RunesTerm *t, char *buf, size_t len); void runes_screen_set_icon_name(RunesTerm *t, char *buf, size_t len); void runes_screen_cleanup(RunesTerm *t); diff --git a/src/window-xlib.c b/src/window-xlib.c index 788d5a8..6a924ec 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -903,7 +903,13 @@ static void runes_window_backend_handle_selection_notify_event( XGetWindowProperty( w->dpy, e->requestor, e->property, 0, 0x1fffffff, 0, AnyPropertyType, &type, &format, &nitems, &left, &buf); + if (t->scr.bracketed_paste) { + runes_pty_backend_write(t, "\e[200~", 6); + } runes_pty_backend_write(t, (char *)buf, nitems); + if (t->scr.bracketed_paste) { + runes_pty_backend_write(t, "\e[201~", 6); + } XFree(buf); } } -- cgit v1.2.3-54-g00ecf