aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-06-05 10:51:46 -0400
committerJesse Luehrs <doy@tozt.net>2014-06-05 10:51:46 -0400
commit0454f561e92d24453642f12e8b4c345813fa8dd5 (patch)
tree16bcb38843646650ce235db393b301abea34fcf5
parent533feb18c09f4347005c21917fe78c4b11959ffa (diff)
downloadrunes-0454f561e92d24453642f12e8b4c345813fa8dd5.tar.gz
runes-0454f561e92d24453642f12e8b4c345813fa8dd5.zip
implement bracketed paste mode (fixes #56)
-rw-r--r--src/parser.c6
-rw-r--r--src/parser.l6
-rw-r--r--src/screen.c14
-rw-r--r--src/screen.h3
-rw-r--r--src/window-xlib.c6
5 files changed, 35 insertions, 0 deletions
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);
}
}