aboutsummaryrefslogtreecommitdiff
path: root/client.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2012-06-18 15:23:01 +0000
committerTiago Cunha <tcunha@gmx.com>2012-06-18 15:23:01 +0000
commit0159c74a32dabec337334252121d5d2a060adc21 (patch)
treeff4ae385fa98562285e484af2b2c66a619dc3577 /client.c
parenta401420273490717de3f6fe8f7f0915692be72a3 (diff)
downloadrtmux-0159c74a32dabec337334252121d5d2a060adc21.tar.gz
rtmux-0159c74a32dabec337334252121d5d2a060adc21.tar.bz2
rtmux-0159c74a32dabec337334252121d5d2a060adc21.zip
Sync OpenBSD patchset 1138:
Add a skeleton mode to tmux (called "control mode") that let's tmux commands be sent and output received on stdout. This can be used to integrate with other terminal emulators and should allow some other things to be made simpler later. More to come so doesn't do much yet and deliberately not documented.
Diffstat (limited to 'client.c')
-rw-r--r--client.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/client.c b/client.c
index 0083bbe8..3478b999 100644
--- a/client.c
+++ b/client.c
@@ -169,6 +169,7 @@ client_main(int argc, char **argv, int flags)
pid_t ppid;
enum msgtype msg;
char *cause;
+ struct termios tio, saved_tio;
/* Set up the initial command. */
cmdflags = 0;
@@ -235,6 +236,23 @@ client_main(int argc, char **argv, int flags)
setblocking(STDIN_FILENO, 0);
event_set(&client_stdin, STDIN_FILENO, EV_READ|EV_PERSIST,
client_stdin_callback, NULL);
+ if (flags & IDENTIFY_TERMIOS) {
+ if (tcgetattr(STDIN_FILENO, &saved_tio) != 0) {
+ fprintf(stderr, "tcgetattr failed: %s\n",
+ strerror(errno));
+ return (1);
+ }
+ cfmakeraw(&tio);
+ tio.c_iflag = ICRNL|IXANY;
+ tio.c_oflag = OPOST|ONLCR;
+ tio.c_lflag = NOKERNINFO;
+ tio.c_cflag = CREAD|CS8|HUPCL;
+ tio.c_cc[VMIN] = 1;
+ tio.c_cc[VTIME] = 0;
+ cfsetispeed(&tio, cfgetispeed(&saved_tio));
+ cfsetospeed(&tio, cfgetospeed(&saved_tio));
+ tcsetattr(STDIN_FILENO, TCSANOW, &tio);
+ }
/* Establish signal handlers. */
set_signals(client_signal);
@@ -275,7 +293,8 @@ client_main(int argc, char **argv, int flags)
ppid = getppid();
if (client_exittype == MSG_DETACHKILL && ppid > 1)
kill(ppid, SIGHUP);
- }
+ } else if (flags & IDENTIFY_TERMIOS)
+ tcsetattr(STDOUT_FILENO, TCSAFLUSH, &saved_tio);
setblocking(STDIN_FILENO, 1);
return (client_exitval);
}
@@ -515,6 +534,12 @@ client_dispatch_wait(void *data)
shell_exec(shelldata.shell, shellcmd);
/* NOTREACHED */
+ case MSG_DETACH:
+ client_write_server(MSG_EXITING, NULL, 0);
+ break;
+ case MSG_EXITED:
+ imsg_free(&imsg);
+ return (-1);
default:
fatalx("unexpected message");
}