152da9a59SGnoCiYeH use super::tty_ldisc::LineDisciplineType; 252da9a59SGnoCiYeH 352da9a59SGnoCiYeH /// ## 窗口大小 452da9a59SGnoCiYeH #[repr(C)] 59365e801SGnoCiYeH #[derive(Debug, Default, Clone, Copy, PartialEq)] 652da9a59SGnoCiYeH pub struct WindowSize { 752da9a59SGnoCiYeH /// 行 852da9a59SGnoCiYeH pub row: u16, 952da9a59SGnoCiYeH /// 列 1052da9a59SGnoCiYeH pub col: u16, 1152da9a59SGnoCiYeH /// x方向像素数 1252da9a59SGnoCiYeH pub xpixel: u16, 1352da9a59SGnoCiYeH /// y方向像素数 1452da9a59SGnoCiYeH pub ypixel: u16, 1552da9a59SGnoCiYeH } 1652da9a59SGnoCiYeH 17*418ad41fSLoGin impl WindowSize { new(row: u16, col: u16, xpixel: u16, ypixel: u16) -> Self18*418ad41fSLoGin pub fn new(row: u16, col: u16, xpixel: u16, ypixel: u16) -> Self { 19*418ad41fSLoGin Self { 20*418ad41fSLoGin row, 21*418ad41fSLoGin col, 22*418ad41fSLoGin xpixel, 23*418ad41fSLoGin ypixel, 24*418ad41fSLoGin } 25*418ad41fSLoGin } 26*418ad41fSLoGin } 27*418ad41fSLoGin 2852da9a59SGnoCiYeH #[derive(Debug, Clone, Copy)] 2952da9a59SGnoCiYeH pub struct Termios { 3052da9a59SGnoCiYeH pub input_mode: InputMode, 3152da9a59SGnoCiYeH pub output_mode: OutputMode, 3252da9a59SGnoCiYeH pub control_mode: ControlMode, 3352da9a59SGnoCiYeH pub local_mode: LocalMode, 3452da9a59SGnoCiYeH pub control_characters: [u8; CONTORL_CHARACTER_NUM], 3552da9a59SGnoCiYeH pub line: LineDisciplineType, 3652da9a59SGnoCiYeH pub input_speed: u32, 3752da9a59SGnoCiYeH pub output_speed: u32, 3852da9a59SGnoCiYeH } 3952da9a59SGnoCiYeH 40be60c929SGnoCiYeH #[derive(Clone, Copy, Default)] 4152da9a59SGnoCiYeH pub struct PosixTermios { 4252da9a59SGnoCiYeH pub c_iflag: u32, 4352da9a59SGnoCiYeH pub c_oflag: u32, 4452da9a59SGnoCiYeH pub c_cflag: u32, 4552da9a59SGnoCiYeH pub c_lflag: u32, 4652da9a59SGnoCiYeH pub c_cc: [u8; CONTORL_CHARACTER_NUM], 4752da9a59SGnoCiYeH pub c_line: u8, 4852da9a59SGnoCiYeH pub c_ispeed: u32, 4952da9a59SGnoCiYeH pub c_ospeed: u32, 5052da9a59SGnoCiYeH } 5152da9a59SGnoCiYeH 5252da9a59SGnoCiYeH impl PosixTermios { from_kernel_termios(termios: Termios) -> Self5352da9a59SGnoCiYeH pub fn from_kernel_termios(termios: Termios) -> Self { 5452da9a59SGnoCiYeH Self { 5552da9a59SGnoCiYeH c_iflag: termios.input_mode.bits, 5652da9a59SGnoCiYeH c_oflag: termios.output_mode.bits, 5752da9a59SGnoCiYeH c_cflag: termios.control_mode.bits, 5852da9a59SGnoCiYeH c_lflag: termios.local_mode.bits, 59b5b571e0SLoGin c_cc: termios.control_characters, 6052da9a59SGnoCiYeH c_line: termios.line as u8, 6152da9a59SGnoCiYeH c_ispeed: termios.input_speed, 6252da9a59SGnoCiYeH c_ospeed: termios.output_speed, 6352da9a59SGnoCiYeH } 6452da9a59SGnoCiYeH } 6552da9a59SGnoCiYeH 6652da9a59SGnoCiYeH #[allow(dead_code)] to_kernel_termios(self) -> Termios67b5b571e0SLoGin pub fn to_kernel_termios(self) -> Termios { 68be60c929SGnoCiYeH // TODO:这里没有考虑非规范模式 6952da9a59SGnoCiYeH Termios { 7052da9a59SGnoCiYeH input_mode: InputMode::from_bits_truncate(self.c_iflag), 7152da9a59SGnoCiYeH output_mode: OutputMode::from_bits_truncate(self.c_oflag), 7252da9a59SGnoCiYeH control_mode: ControlMode::from_bits_truncate(self.c_cflag), 7352da9a59SGnoCiYeH local_mode: LocalMode::from_bits_truncate(self.c_lflag), 74b5b571e0SLoGin control_characters: self.c_cc, 7552da9a59SGnoCiYeH line: LineDisciplineType::from_line(self.c_line), 7652da9a59SGnoCiYeH input_speed: self.c_ispeed, 7752da9a59SGnoCiYeH output_speed: self.c_ospeed, 7852da9a59SGnoCiYeH } 7952da9a59SGnoCiYeH } 8052da9a59SGnoCiYeH } 8152da9a59SGnoCiYeH 8252da9a59SGnoCiYeH pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = [ 8352da9a59SGnoCiYeH b'C' - 0x40, // VINTR 8452da9a59SGnoCiYeH b'\\' - 0x40, // VQUIT 8552da9a59SGnoCiYeH 0o177, // VERASE 8652da9a59SGnoCiYeH b'U' - 0x40, // VKILL 8752da9a59SGnoCiYeH b'D' - 0x40, // VEOF 8852da9a59SGnoCiYeH 1, // VMIN 8952da9a59SGnoCiYeH 0, // VEOL 9052da9a59SGnoCiYeH 0, // VTIME 9152da9a59SGnoCiYeH 0, // VEOL2 9252da9a59SGnoCiYeH 0, // VSWTC 9352da9a59SGnoCiYeH b'W' - 0x40, // VWERASE 9452da9a59SGnoCiYeH b'R' - 0x40, // VREPRINT 9552da9a59SGnoCiYeH b'Z' - 0x40, // VSUSP 9652da9a59SGnoCiYeH b'Q' - 0x40, // VSTART 9752da9a59SGnoCiYeH b'S' - 0x40, // VSTOP 9852da9a59SGnoCiYeH b'V' - 0x40, // VLNEXT 9952da9a59SGnoCiYeH b'O' - 0x40, // VDISCARD 10052da9a59SGnoCiYeH 0, 10152da9a59SGnoCiYeH 0, 10252da9a59SGnoCiYeH ]; 10352da9a59SGnoCiYeH 10452da9a59SGnoCiYeH // pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = { 10552da9a59SGnoCiYeH // let mut chs: [u8; CONTORL_CHARACTER_NUM] = Default::default(); 10652da9a59SGnoCiYeH // chs[ControlCharIndex::VINTR] = b'C' - 0x40; 10752da9a59SGnoCiYeH // chs[ControlCharIndex::VQUIT] = b'\\' - 0x40; 10852da9a59SGnoCiYeH // chs[ControlCharIndex::VERASE] = 0o177; 10952da9a59SGnoCiYeH // chs[ControlCharIndex::VKILL] = b'U' - 0x40; 11052da9a59SGnoCiYeH // chs[ControlCharIndex::VEOF] = b'D' - 0x40; 11152da9a59SGnoCiYeH // chs[ControlCharIndex::VSTART] = b'Q' - 0x40; 11252da9a59SGnoCiYeH // chs[ControlCharIndex::VSTOP] = b'S' - 0x40; 11352da9a59SGnoCiYeH // chs[ControlCharIndex::VSUSP] = b'Z' - 0x40; 11452da9a59SGnoCiYeH // chs[ControlCharIndex::VREPRINT] = b'R' - 0x40; 11552da9a59SGnoCiYeH // chs[ControlCharIndex::VDISCARD] = b'O' - 0x40; 11652da9a59SGnoCiYeH // chs[ControlCharIndex::VWERASE] = b'W' - 0x40; 11752da9a59SGnoCiYeH // chs[ControlCharIndex::VLNEXT] = b'V' - 0x40; 11852da9a59SGnoCiYeH // // chs[ContorlCharIndex::VDSUSP] = b'Y' - 0x40; 11952da9a59SGnoCiYeH // chs[ControlCharIndex::VMIN] = 1; 12052da9a59SGnoCiYeH // return chs; 12152da9a59SGnoCiYeH // }; 12252da9a59SGnoCiYeH 12352da9a59SGnoCiYeH lazy_static! { 12452da9a59SGnoCiYeH pub static ref TTY_STD_TERMIOS: Termios = { 12552da9a59SGnoCiYeH Termios { 12652da9a59SGnoCiYeH input_mode: InputMode::ICRNL | InputMode::IXON, 12752da9a59SGnoCiYeH output_mode: OutputMode::OPOST | OutputMode::ONLCR, 12852da9a59SGnoCiYeH control_mode: ControlMode::B38400 12952da9a59SGnoCiYeH | ControlMode::CREAD 13052da9a59SGnoCiYeH | ControlMode::HUPCL 13152da9a59SGnoCiYeH | ControlMode::CS8, 13252da9a59SGnoCiYeH local_mode: LocalMode::ISIG 13352da9a59SGnoCiYeH | LocalMode::ICANON 13452da9a59SGnoCiYeH | LocalMode::ECHO 13552da9a59SGnoCiYeH | LocalMode::ECHOE 13652da9a59SGnoCiYeH | LocalMode::ECHOK 13752da9a59SGnoCiYeH | LocalMode::ECHOCTL 13852da9a59SGnoCiYeH | LocalMode::ECHOKE 13952da9a59SGnoCiYeH | LocalMode::IEXTEN, 140b5b571e0SLoGin control_characters: INIT_CONTORL_CHARACTERS, 14152da9a59SGnoCiYeH line: LineDisciplineType::NTty, 14252da9a59SGnoCiYeH input_speed: 38400, 14352da9a59SGnoCiYeH output_speed: 38400, 14452da9a59SGnoCiYeH } 14552da9a59SGnoCiYeH }; 14652da9a59SGnoCiYeH } 14752da9a59SGnoCiYeH 14852da9a59SGnoCiYeH pub const CONTORL_CHARACTER_NUM: usize = 19; 14952da9a59SGnoCiYeH 15052da9a59SGnoCiYeH bitflags! { 15152da9a59SGnoCiYeH /// termios输入特性 15252da9a59SGnoCiYeH pub struct InputMode: u32 { 15352da9a59SGnoCiYeH /// 如果设置了该标志,表示启用软件流控制。 15452bcb59eSGnoCiYeH const IXON = 0x0400; 15552da9a59SGnoCiYeH /// 如果设置了该标志,表示启用输入流控制。 15652bcb59eSGnoCiYeH const IXOFF = 0x1000; 15752da9a59SGnoCiYeH /// Map Uppercase to Lowercase on Input 将大写转换为小写 15852da9a59SGnoCiYeH /// 表示不区分大小写 15952bcb59eSGnoCiYeH const IUCLC = 0x0200; 16052da9a59SGnoCiYeH /// 如果设置了该标志,表示当输入队列满时,产生一个响铃信号。 16152da9a59SGnoCiYeH const IMAXBEL = 0x2000; 16252da9a59SGnoCiYeH /// 如果设置了该标志,表示输入数据被视为 UTF-8 编码。 16352da9a59SGnoCiYeH const IUTF8 = 0x4000; 16452da9a59SGnoCiYeH 16552da9a59SGnoCiYeH /// 忽略中断信号 16652da9a59SGnoCiYeH const IGNBRK = 0x001; 16752da9a59SGnoCiYeH /// 检测到中断信号时生成中断(产生中断信号) 16852da9a59SGnoCiYeH const BRKINT = 0x002; 16952da9a59SGnoCiYeH /// 忽略具有奇偶校验错误的字符 17052da9a59SGnoCiYeH const IGNPAR = 0x004; 17152da9a59SGnoCiYeH /// 在检测到奇偶校验错误或帧错误时,将字符以 \377 标记 17252da9a59SGnoCiYeH const PARMRK = 0x008; 17352da9a59SGnoCiYeH /// 启用输入奇偶校验检查 17452da9a59SGnoCiYeH const INPCK = 0x010; 17552da9a59SGnoCiYeH /// 从输入字符中剥离第 8 位,即只保留低 7 位 17652da9a59SGnoCiYeH const ISTRIP = 0x020; 17752da9a59SGnoCiYeH /// 表示将输入的换行符 (\n) 映射为回车符 (\r) 17852da9a59SGnoCiYeH const INLCR = 0x040; 17952da9a59SGnoCiYeH /// 表示忽略回车符 (\r) 18052da9a59SGnoCiYeH const IGNCR = 0x080; 18152da9a59SGnoCiYeH /// 表示将输入的回车符 (\r) 映射为换行符 (\n) 18252da9a59SGnoCiYeH const ICRNL = 0x100; 18352da9a59SGnoCiYeH /// 表示在输入被停止(Ctrl-S)后,任何字符的输入都将重新启动输入 18452da9a59SGnoCiYeH const IXANY = 0x800; 18552da9a59SGnoCiYeH } 18652da9a59SGnoCiYeH 18752da9a59SGnoCiYeH /// termios输出特性 18852da9a59SGnoCiYeH pub struct OutputMode: u32 { 18952da9a59SGnoCiYeH /// 在输出时将换行符替换\r\n 19052bcb59eSGnoCiYeH const ONLCR = 0x00004; 19152da9a59SGnoCiYeH /// Map Lowercase to Uppercase on Output 输出字符时将小写字母映射为大写字母 19252bcb59eSGnoCiYeH const OLCUC = 0x00002; 19352da9a59SGnoCiYeH 19452da9a59SGnoCiYeH /// 与NL协同 配置换行符的处理方式 19552bcb59eSGnoCiYeH const NLDLY = 0x00100; 19652da9a59SGnoCiYeH const NL0 = 0x00000; // 不延迟换行 19752da9a59SGnoCiYeH const NL1 = 0x00100; // 延迟换行(输出回车后等待一段时间再输出换行) 19852da9a59SGnoCiYeH 19952da9a59SGnoCiYeH /// 配置水平制表符的处理方式 20052bcb59eSGnoCiYeH const TABDLY = 0x01800; 20152da9a59SGnoCiYeH const TAB0 = 0x00000; // 不延迟水平制表符 20252bcb59eSGnoCiYeH const TAB1 = 0x00800; // 在输出水平制表符时,延迟到下一个设置的水平制表符位置 20352bcb59eSGnoCiYeH const TAB2 = 0x01000; // 在输出水平制表符时,延迟到下一个设置的 8 的倍数的位置 20452bcb59eSGnoCiYeH const TAB3 = 0x01800; // TAB3 和 XTABS(与 TAB3 等效)保留,暂未使用 20552bcb59eSGnoCiYeH const XTABS = 0x01800; 20652da9a59SGnoCiYeH 20752da9a59SGnoCiYeH /// 配置回车符的处理方式 20852bcb59eSGnoCiYeH const CRDLY = 0x00600; 20952da9a59SGnoCiYeH const CR0 = 0x00000; // 不延迟回车 21052bcb59eSGnoCiYeH const CR1 = 0x02000; // 延迟回车(输出回车后等待一段时间再输出换行) 21152bcb59eSGnoCiYeH const CR2 = 0x04000; // CR2 和 CR3保留,暂未使用 21252bcb59eSGnoCiYeH const CR3 = 0x06000; 21352da9a59SGnoCiYeH 21452da9a59SGnoCiYeH /// 配置换页符(form feed)的处理方式 21552bcb59eSGnoCiYeH const FFDLY = 0x08000; 21652da9a59SGnoCiYeH const FF0 = 0x00000; // 不延迟换页 21752bcb59eSGnoCiYeH const FF1 = 0x08000; // 延迟换页 21852da9a59SGnoCiYeH 21952da9a59SGnoCiYeH /// 配置退格符(backspace)的处理方式 22052bcb59eSGnoCiYeH const BSDLY = 0x02000; 22152da9a59SGnoCiYeH const BS0 = 0x00000; // 不延迟退格 22252bcb59eSGnoCiYeH const BS1 = 0x02000; // 延迟退格 22352da9a59SGnoCiYeH 22452da9a59SGnoCiYeH /// 配置垂直制表符(vertical tab)的处理方式 22552bcb59eSGnoCiYeH const VTDLY = 0x04000; 22652da9a59SGnoCiYeH const VT0 = 0x00000; // 不延迟垂直制表符 22752bcb59eSGnoCiYeH const VT1 = 0x04000; // 延迟垂直制表符 22852da9a59SGnoCiYeH 22952da9a59SGnoCiYeH /// 表示执行输出处理,即启用输出处理函数 23052da9a59SGnoCiYeH const OPOST = 0x01; 23152da9a59SGnoCiYeH /// 表示将输出的回车符 (\r) 映射为换行符 (\n) 23252da9a59SGnoCiYeH const OCRNL = 0x08; 23352da9a59SGnoCiYeH /// 表示在输出时,如果光标在第 0 列,则不输出回车符 (\r) 23452da9a59SGnoCiYeH const ONOCR = 0x10; 23552da9a59SGnoCiYeH /// 表示将回车符 (\r) 映射为换行符 (\n) 23652da9a59SGnoCiYeH const ONLRET = 0x20; 23752da9a59SGnoCiYeH /// 表示使用填充字符进行延迟。这个填充字符的默认值是空格。 23852da9a59SGnoCiYeH const OFILL = 0x40; 23952da9a59SGnoCiYeH /// 表示使用删除字符 (DEL, \177) 作为填充字符 24052da9a59SGnoCiYeH const OFDEL = 0x80; 24152da9a59SGnoCiYeH } 24252da9a59SGnoCiYeH 24352da9a59SGnoCiYeH /// 配置终端设备的基本特性和控制参数 24452da9a59SGnoCiYeH pub struct ControlMode: u32 { 24552da9a59SGnoCiYeH /// Baud Rate Mask 指定波特率的掩码 24652bcb59eSGnoCiYeH const CBAUD = 0x0000100f; 24752da9a59SGnoCiYeH /// Extra Baud Bits 指定更高的波特率位 24852bcb59eSGnoCiYeH const CBAUDEX = 0x00001000; 24952da9a59SGnoCiYeH /// Custom Baud Rate 指定自定义波特率 如果设置了 BOTHER,则通过以下位来设置自定义的波特率值 25052bcb59eSGnoCiYeH const BOTHER = 0x00001000; 25152da9a59SGnoCiYeH 25252bcb59eSGnoCiYeH /* Common CBAUD rates */ 25352bcb59eSGnoCiYeH const B0 = 0x00000000; /* hang up */ 25452da9a59SGnoCiYeH const B50 = 0x00000001; 25552da9a59SGnoCiYeH const B75 = 0x00000002; 25652da9a59SGnoCiYeH const B110 = 0x00000003; 25752da9a59SGnoCiYeH const B134 = 0x00000004; 25852da9a59SGnoCiYeH const B150 = 0x00000005; 25952da9a59SGnoCiYeH const B200 = 0x00000006; 26052da9a59SGnoCiYeH const B300 = 0x00000007; 26152da9a59SGnoCiYeH const B600 = 0x00000008; 26252da9a59SGnoCiYeH const B1200 = 0x00000009; 26352da9a59SGnoCiYeH const B1800 = 0x0000000a; 26452da9a59SGnoCiYeH const B2400 = 0x0000000b; 26552da9a59SGnoCiYeH const B4800 = 0x0000000c; 26652da9a59SGnoCiYeH const B9600 = 0x0000000d; 26752da9a59SGnoCiYeH const B19200 = 0x0000000e; 26852da9a59SGnoCiYeH const B38400 = 0x0000000f; 26952da9a59SGnoCiYeH 27052bcb59eSGnoCiYeH const B57600 = 0x00001001; 27152bcb59eSGnoCiYeH const B115200 = 0x00001002; 27252bcb59eSGnoCiYeH const B230400 = 0x00001003; 27352bcb59eSGnoCiYeH const B460800 = 0x00001004; 27452bcb59eSGnoCiYeH const B500000 = 0x00001005; 27552bcb59eSGnoCiYeH const B576000 = 0x00001006; 27652bcb59eSGnoCiYeH const B921600 = 0x00001007; 27752bcb59eSGnoCiYeH const B1000000 = 0x00001008; 27852bcb59eSGnoCiYeH const B1152000 = 0x00001009; 27952bcb59eSGnoCiYeH const B1500000 = 0x0000100a; 28052bcb59eSGnoCiYeH const B2000000 = 0x0000100b; 28152bcb59eSGnoCiYeH const B2500000 = 0x0000100c; 28252bcb59eSGnoCiYeH const B3000000 = 0x0000100d; 28352bcb59eSGnoCiYeH const B3500000 = 0x0000100e; 28452bcb59eSGnoCiYeH const B4000000 = 0x0000100f; 28552da9a59SGnoCiYeH 28652da9a59SGnoCiYeH /// 指定字符大小的掩码 以下位为特定字符大小 28752bcb59eSGnoCiYeH const CSIZE = 0x00000030; 28852da9a59SGnoCiYeH const CS5 = 0x00000000; 28952bcb59eSGnoCiYeH const CS6 = 0x00000010; 29052bcb59eSGnoCiYeH const CS7 = 0x00000020; 29152bcb59eSGnoCiYeH const CS8 = 0x00000030; 29252da9a59SGnoCiYeH 29352da9a59SGnoCiYeH /// Stop Bit Select 表示使用两个停止位;否则,表示使用一个停止位 29452bcb59eSGnoCiYeH const CSTOPB = 0x00000040; 29552da9a59SGnoCiYeH /// 表示启用接收器。如果未设置,则禁用接收器。 29652bcb59eSGnoCiYeH const CREAD = 0x00000080; 29752da9a59SGnoCiYeH /// 表示启用奇偶校验。如果未设置,则禁用奇偶校验。 29852bcb59eSGnoCiYeH const PARENB = 0x00000100; 29952da9a59SGnoCiYeH /// 表示启用奇校验。如果未设置,则表示启用偶校验。 30052bcb59eSGnoCiYeH const PARODD = 0x00000200; 30152da9a59SGnoCiYeH /// 表示在终端设备被关闭时挂断线路(执行挂断操作) 30252bcb59eSGnoCiYeH const HUPCL = 0x00000400; 30352da9a59SGnoCiYeH /// 表示忽略调制解调器的状态(DCD、DSR、CTS 等) 30452bcb59eSGnoCiYeH const CLOCAL = 0x00000800; 30552da9a59SGnoCiYeH /// 指定输入波特率的掩码 30652bcb59eSGnoCiYeH const CIBAUD = 0x100f0000; 30752da9a59SGnoCiYeH 30852da9a59SGnoCiYeH const ADDRB = 0x20000000; 30952da9a59SGnoCiYeH } 31052da9a59SGnoCiYeH 31152da9a59SGnoCiYeH /// 配置终端设备的本地模式(local mode)或控制输入处理的行为 31252da9a59SGnoCiYeH pub struct LocalMode: u32 { 31352da9a59SGnoCiYeH /// 启用中断字符(Ctrl-C、Ctrl-Z) 31452bcb59eSGnoCiYeH const ISIG = 0x00001; 31552da9a59SGnoCiYeH /// 表示启用规范模式,即启用行缓冲和回显。在规范模式下,输入被缓冲,并且只有在输入回车符时才会传递给应用程序。 31652bcb59eSGnoCiYeH const ICANON = 0x00002; 31752da9a59SGnoCiYeH /// 表示启用大写模式,即输入输出都将被转换为大写。 31852bcb59eSGnoCiYeH const XCASE = 0x00004; 31952da9a59SGnoCiYeH /// 表示启用回显(显示用户输入的字符) 32052bcb59eSGnoCiYeH const ECHO = 0x00008; 32152da9a59SGnoCiYeH /// 表示在回显时将擦除的字符用 backspace 和空格字符显示。 32252bcb59eSGnoCiYeH const ECHOE = 0x00010; 32352da9a59SGnoCiYeH /// 表示在回显时将换行符后的字符用空格字符显示。 32452bcb59eSGnoCiYeH const ECHOK = 0x00020; 32552da9a59SGnoCiYeH /// 表示在回显时将换行符显示为换行和回车符。 32652bcb59eSGnoCiYeH const ECHONL = 0x00040; 32752da9a59SGnoCiYeH /// 表示在收到中断(Ctrl-C)和退出(Ctrl-\)字符后,不清空输入和输出缓冲区。 32852bcb59eSGnoCiYeH const NOFLSH = 0x00080; 32952da9a59SGnoCiYeH /// 表示在后台进程尝试写入终端时,发送停止信号(Ctrl-S) 33052bcb59eSGnoCiYeH const TOSTOP = 0x00100; 33152da9a59SGnoCiYeH /// 表示在回显时,显示控制字符为 ^ 加字符。 33252bcb59eSGnoCiYeH const ECHOCTL= 0x00200; 33352da9a59SGnoCiYeH /// 表示在回显时显示带有 # 的换行符(为了与 echo -n 命令兼容)。 33452bcb59eSGnoCiYeH const ECHOPRT= 0x00400; 33552da9a59SGnoCiYeH /// 表示在回显时将 KILL 字符(Ctrl-U)用空格字符显示。 33652bcb59eSGnoCiYeH const ECHOKE = 0x00800; 33752da9a59SGnoCiYeH /// 表示输出正在被冲刷(flush),通常是由于输入/输出流的状态变化。 33852bcb59eSGnoCiYeH const FLUSHO = 0x01000; 33952da9a59SGnoCiYeH /// 表示在规范模式下,存在需要重新打印的字符。 34052bcb59eSGnoCiYeH const PENDIN = 0x04000; 34152da9a59SGnoCiYeH /// 表示启用实现定义的输入处理。 34252bcb59eSGnoCiYeH const IEXTEN = 0x08000; 34352da9a59SGnoCiYeH /// 表示启用扩展的处理函数 34452bcb59eSGnoCiYeH const EXTPROC= 0x10000; 34552da9a59SGnoCiYeH } 34652da9a59SGnoCiYeH 34752da9a59SGnoCiYeH pub struct TtySetTermiosOpt: u8 { 34852da9a59SGnoCiYeH const TERMIOS_FLUSH =1; 34952da9a59SGnoCiYeH const TERMIOS_WAIT =2; 35052da9a59SGnoCiYeH const TERMIOS_TERMIO =4; 35152da9a59SGnoCiYeH const TERMIOS_OLD =8; 35252da9a59SGnoCiYeH } 35352da9a59SGnoCiYeH } 35452da9a59SGnoCiYeH 35552da9a59SGnoCiYeH /// 对应termios中控制字符的索引 35652da9a59SGnoCiYeH pub struct ControlCharIndex; 35752da9a59SGnoCiYeH #[allow(dead_code)] 35852da9a59SGnoCiYeH impl ControlCharIndex { 35952da9a59SGnoCiYeH pub const DISABLE_CHAR: u8 = b'\0'; 36052da9a59SGnoCiYeH /// 中断信号 36152da9a59SGnoCiYeH pub const VINTR: usize = 0; 36252da9a59SGnoCiYeH /// 退出信号 36352da9a59SGnoCiYeH pub const VQUIT: usize = 1; 36452da9a59SGnoCiYeH /// 退格 36552da9a59SGnoCiYeH pub const VERASE: usize = 2; 36652da9a59SGnoCiYeH /// 终止输入信号 36752da9a59SGnoCiYeH pub const VKILL: usize = 3; 36852da9a59SGnoCiYeH /// 文件结束信号 \0? 36952da9a59SGnoCiYeH pub const VEOF: usize = 4; 37052da9a59SGnoCiYeH /// 指定非规范模式下的最小字符数 37152da9a59SGnoCiYeH pub const VMIN: usize = 5; 37252da9a59SGnoCiYeH /// 换行符 37352da9a59SGnoCiYeH pub const VEOL: usize = 6; 37452da9a59SGnoCiYeH /// 指定非规范模式下的超时时间 37552da9a59SGnoCiYeH pub const VTIME: usize = 7; 37652da9a59SGnoCiYeH /// 换行符 37752da9a59SGnoCiYeH pub const VEOL2: usize = 8; 37852da9a59SGnoCiYeH /// 未使用,保留 37952da9a59SGnoCiYeH pub const VSWTC: usize = 9; 38052da9a59SGnoCiYeH /// 擦除前一个单词 38152da9a59SGnoCiYeH pub const VWERASE: usize = 10; 38252da9a59SGnoCiYeH /// 重新打印整行 38352da9a59SGnoCiYeH pub const VREPRINT: usize = 11; 38452da9a59SGnoCiYeH /// 挂起信号 38552da9a59SGnoCiYeH pub const VSUSP: usize = 12; 38652da9a59SGnoCiYeH /// 启动输出信号 38752da9a59SGnoCiYeH pub const VSTART: usize = 13; 38852da9a59SGnoCiYeH /// 停止输出信号 38952da9a59SGnoCiYeH pub const VSTOP: usize = 14; 39052da9a59SGnoCiYeH /// 将下一个字符视为字面值,而不是特殊字符 39152da9a59SGnoCiYeH pub const VLNEXT: usize = 15; 39252da9a59SGnoCiYeH /// 对应于字符丢弃信号,用于丢弃当前输入的行 39352da9a59SGnoCiYeH pub const VDISCARD: usize = 16; 39452da9a59SGnoCiYeH } 395