diff options
author | Yorhel <git@yorhel.nl> | 2014-05-11 09:11:49 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2014-05-11 09:14:42 +0200 |
commit | 75d49b6ea3b64e0e8053962b86bec51d9ad10007 (patch) | |
tree | feec758afb1538a16887a79f22b258e59ef9c2fb | |
parent | 505b387717bea9ea4623059cfff9e41965003bb6 (diff) |
Send bracketed paste mode code to stderr + workaround for screen
For some reset the reset code wasn't caught when send to stdout. The
workaround for screen was found while looking through the weechat code
to figure out why the reset code didn't work.
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/ui.c | 19 |
2 files changed, 17 insertions, 6 deletions
@@ -504,9 +504,7 @@ int main(int argc, char **argv) { erase(); refresh(); endwin(); - - // reset bracketed paste mode - printf("\x1b[?2004l"); // http://www.xfree86.org/current/ctlseqs.html#C1%20%288-Bit%29%20Control%20Characters + ui_set_bracketed_paste(0); printf("Flushing unsaved data to disk..."); fflush(stdout); @@ -245,6 +245,21 @@ void ui_tab_incprio(ui_tab_t *tab, int prio) { } +// Based on gui_window_set_bracketed_paste_mode() in weechat's gui/curses/gui-curses-window.c +void ui_set_bracketed_paste(int enable) { + char *env = getenv("TMUX"); + int tmux = env && *env; + env = getenv("TERM"); + int screen = env && (strncmp(env, "screen", 6) == 0) && !tmux; + + fprintf(stderr, "%s\033[?2004%c%s", + screen ? "\033P" : "", + enable ? 'h' : 'l', + screen ? "\033\\" : ""); + fflush(stderr); +} + + void ui_init() { // init curses initscr(); @@ -257,9 +272,7 @@ void ui_init() { // ensure curses is init'd before event-keys defined before events happen define_key("\x1b[200~", KEY_BRACKETED_PASTE_START); define_key("\x1b[201~", KEY_BRACKETED_PASTE_END); - - const char paste_mode[] = "\x1b[?2004h"; - write(STDOUT_FILENO, paste_mode, sizeof(paste_mode)-1); + ui_set_bracketed_paste(1); // global textinput field ui_global_textinput = ui_textinput_create(TRUE, cmd_suggest); |