1*52da9a59SGnoCiYeH use super::tty_ldisc::LineDisciplineType; 2*52da9a59SGnoCiYeH 3*52da9a59SGnoCiYeH /// ## 窗口大小 4*52da9a59SGnoCiYeH #[repr(C)] 5*52da9a59SGnoCiYeH #[derive(Debug, Default, Clone, Copy)] 6*52da9a59SGnoCiYeH pub struct WindowSize { 7*52da9a59SGnoCiYeH /// 行 8*52da9a59SGnoCiYeH pub row: u16, 9*52da9a59SGnoCiYeH /// 列 10*52da9a59SGnoCiYeH pub col: u16, 11*52da9a59SGnoCiYeH /// x方向像素数 12*52da9a59SGnoCiYeH pub xpixel: u16, 13*52da9a59SGnoCiYeH /// y方向像素数 14*52da9a59SGnoCiYeH pub ypixel: u16, 15*52da9a59SGnoCiYeH } 16*52da9a59SGnoCiYeH 17*52da9a59SGnoCiYeH #[derive(Debug, Clone, Copy)] 18*52da9a59SGnoCiYeH pub struct Termios { 19*52da9a59SGnoCiYeH pub input_mode: InputMode, 20*52da9a59SGnoCiYeH pub output_mode: OutputMode, 21*52da9a59SGnoCiYeH pub control_mode: ControlMode, 22*52da9a59SGnoCiYeH pub local_mode: LocalMode, 23*52da9a59SGnoCiYeH pub control_characters: [u8; CONTORL_CHARACTER_NUM], 24*52da9a59SGnoCiYeH pub line: LineDisciplineType, 25*52da9a59SGnoCiYeH pub input_speed: u32, 26*52da9a59SGnoCiYeH pub output_speed: u32, 27*52da9a59SGnoCiYeH } 28*52da9a59SGnoCiYeH 29*52da9a59SGnoCiYeH #[derive(Clone, Copy)] 30*52da9a59SGnoCiYeH pub struct PosixTermios { 31*52da9a59SGnoCiYeH pub c_iflag: u32, 32*52da9a59SGnoCiYeH pub c_oflag: u32, 33*52da9a59SGnoCiYeH pub c_cflag: u32, 34*52da9a59SGnoCiYeH pub c_lflag: u32, 35*52da9a59SGnoCiYeH pub c_cc: [u8; CONTORL_CHARACTER_NUM], 36*52da9a59SGnoCiYeH pub c_line: u8, 37*52da9a59SGnoCiYeH pub c_ispeed: u32, 38*52da9a59SGnoCiYeH pub c_ospeed: u32, 39*52da9a59SGnoCiYeH } 40*52da9a59SGnoCiYeH 41*52da9a59SGnoCiYeH impl PosixTermios { 42*52da9a59SGnoCiYeH pub fn from_kernel_termios(termios: Termios) -> Self { 43*52da9a59SGnoCiYeH Self { 44*52da9a59SGnoCiYeH c_iflag: termios.input_mode.bits, 45*52da9a59SGnoCiYeH c_oflag: termios.output_mode.bits, 46*52da9a59SGnoCiYeH c_cflag: termios.control_mode.bits, 47*52da9a59SGnoCiYeH c_lflag: termios.local_mode.bits, 48*52da9a59SGnoCiYeH c_cc: termios.control_characters.clone(), 49*52da9a59SGnoCiYeH c_line: termios.line as u8, 50*52da9a59SGnoCiYeH c_ispeed: termios.input_speed, 51*52da9a59SGnoCiYeH c_ospeed: termios.output_speed, 52*52da9a59SGnoCiYeH } 53*52da9a59SGnoCiYeH } 54*52da9a59SGnoCiYeH 55*52da9a59SGnoCiYeH #[allow(dead_code)] 56*52da9a59SGnoCiYeH pub fn to_kernel_termios(&self) -> Termios { 57*52da9a59SGnoCiYeH Termios { 58*52da9a59SGnoCiYeH input_mode: InputMode::from_bits_truncate(self.c_iflag), 59*52da9a59SGnoCiYeH output_mode: OutputMode::from_bits_truncate(self.c_oflag), 60*52da9a59SGnoCiYeH control_mode: ControlMode::from_bits_truncate(self.c_cflag), 61*52da9a59SGnoCiYeH local_mode: LocalMode::from_bits_truncate(self.c_lflag), 62*52da9a59SGnoCiYeH control_characters: self.c_cc.clone(), 63*52da9a59SGnoCiYeH line: LineDisciplineType::from_line(self.c_line), 64*52da9a59SGnoCiYeH input_speed: self.c_ispeed, 65*52da9a59SGnoCiYeH output_speed: self.c_ospeed, 66*52da9a59SGnoCiYeH } 67*52da9a59SGnoCiYeH } 68*52da9a59SGnoCiYeH } 69*52da9a59SGnoCiYeH 70*52da9a59SGnoCiYeH pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = [ 71*52da9a59SGnoCiYeH b'C' - 0x40, // VINTR 72*52da9a59SGnoCiYeH b'\\' - 0x40, // VQUIT 73*52da9a59SGnoCiYeH 0o177, // VERASE 74*52da9a59SGnoCiYeH b'U' - 0x40, // VKILL 75*52da9a59SGnoCiYeH b'D' - 0x40, // VEOF 76*52da9a59SGnoCiYeH 1, // VMIN 77*52da9a59SGnoCiYeH 0, // VEOL 78*52da9a59SGnoCiYeH 0, // VTIME 79*52da9a59SGnoCiYeH 0, // VEOL2 80*52da9a59SGnoCiYeH 0, // VSWTC 81*52da9a59SGnoCiYeH b'W' - 0x40, // VWERASE 82*52da9a59SGnoCiYeH b'R' - 0x40, // VREPRINT 83*52da9a59SGnoCiYeH b'Z' - 0x40, // VSUSP 84*52da9a59SGnoCiYeH b'Q' - 0x40, // VSTART 85*52da9a59SGnoCiYeH b'S' - 0x40, // VSTOP 86*52da9a59SGnoCiYeH b'V' - 0x40, // VLNEXT 87*52da9a59SGnoCiYeH b'O' - 0x40, // VDISCARD 88*52da9a59SGnoCiYeH 0, 89*52da9a59SGnoCiYeH 0, 90*52da9a59SGnoCiYeH ]; 91*52da9a59SGnoCiYeH 92*52da9a59SGnoCiYeH // pub const INIT_CONTORL_CHARACTERS: [u8; CONTORL_CHARACTER_NUM] = { 93*52da9a59SGnoCiYeH // let mut chs: [u8; CONTORL_CHARACTER_NUM] = Default::default(); 94*52da9a59SGnoCiYeH // chs[ControlCharIndex::VINTR] = b'C' - 0x40; 95*52da9a59SGnoCiYeH // chs[ControlCharIndex::VQUIT] = b'\\' - 0x40; 96*52da9a59SGnoCiYeH // chs[ControlCharIndex::VERASE] = 0o177; 97*52da9a59SGnoCiYeH // chs[ControlCharIndex::VKILL] = b'U' - 0x40; 98*52da9a59SGnoCiYeH // chs[ControlCharIndex::VEOF] = b'D' - 0x40; 99*52da9a59SGnoCiYeH // chs[ControlCharIndex::VSTART] = b'Q' - 0x40; 100*52da9a59SGnoCiYeH // chs[ControlCharIndex::VSTOP] = b'S' - 0x40; 101*52da9a59SGnoCiYeH // chs[ControlCharIndex::VSUSP] = b'Z' - 0x40; 102*52da9a59SGnoCiYeH // chs[ControlCharIndex::VREPRINT] = b'R' - 0x40; 103*52da9a59SGnoCiYeH // chs[ControlCharIndex::VDISCARD] = b'O' - 0x40; 104*52da9a59SGnoCiYeH // chs[ControlCharIndex::VWERASE] = b'W' - 0x40; 105*52da9a59SGnoCiYeH // chs[ControlCharIndex::VLNEXT] = b'V' - 0x40; 106*52da9a59SGnoCiYeH // // chs[ContorlCharIndex::VDSUSP] = b'Y' - 0x40; 107*52da9a59SGnoCiYeH // chs[ControlCharIndex::VMIN] = 1; 108*52da9a59SGnoCiYeH // return chs; 109*52da9a59SGnoCiYeH // }; 110*52da9a59SGnoCiYeH 111*52da9a59SGnoCiYeH lazy_static! { 112*52da9a59SGnoCiYeH pub static ref TTY_STD_TERMIOS: Termios = { 113*52da9a59SGnoCiYeH Termios { 114*52da9a59SGnoCiYeH input_mode: InputMode::ICRNL | InputMode::IXON, 115*52da9a59SGnoCiYeH output_mode: OutputMode::OPOST | OutputMode::ONLCR, 116*52da9a59SGnoCiYeH control_mode: ControlMode::B38400 117*52da9a59SGnoCiYeH | ControlMode::CREAD 118*52da9a59SGnoCiYeH | ControlMode::HUPCL 119*52da9a59SGnoCiYeH | ControlMode::CS8, 120*52da9a59SGnoCiYeH local_mode: LocalMode::ISIG 121*52da9a59SGnoCiYeH | LocalMode::ICANON 122*52da9a59SGnoCiYeH | LocalMode::ECHO 123*52da9a59SGnoCiYeH | LocalMode::ECHOE 124*52da9a59SGnoCiYeH | LocalMode::ECHOK 125*52da9a59SGnoCiYeH | LocalMode::ECHOCTL 126*52da9a59SGnoCiYeH | LocalMode::ECHOKE 127*52da9a59SGnoCiYeH | LocalMode::IEXTEN, 128*52da9a59SGnoCiYeH control_characters: INIT_CONTORL_CHARACTERS.clone(), 129*52da9a59SGnoCiYeH line: LineDisciplineType::NTty, 130*52da9a59SGnoCiYeH input_speed: 38400, 131*52da9a59SGnoCiYeH output_speed: 38400, 132*52da9a59SGnoCiYeH } 133*52da9a59SGnoCiYeH }; 134*52da9a59SGnoCiYeH } 135*52da9a59SGnoCiYeH 136*52da9a59SGnoCiYeH pub const CONTORL_CHARACTER_NUM: usize = 19; 137*52da9a59SGnoCiYeH 138*52da9a59SGnoCiYeH bitflags! { 139*52da9a59SGnoCiYeH /// termios输入特性 140*52da9a59SGnoCiYeH pub struct InputMode: u32 { 141*52da9a59SGnoCiYeH /// 如果设置了该标志,表示启用软件流控制。 142*52da9a59SGnoCiYeH const IXON = 0x0200; 143*52da9a59SGnoCiYeH /// 如果设置了该标志,表示启用输入流控制。 144*52da9a59SGnoCiYeH const IXOFF = 0x0400; 145*52da9a59SGnoCiYeH /// Map Uppercase to Lowercase on Input 将大写转换为小写 146*52da9a59SGnoCiYeH /// 表示不区分大小写 147*52da9a59SGnoCiYeH const IUCLC = 0x1000; 148*52da9a59SGnoCiYeH /// 如果设置了该标志,表示当输入队列满时,产生一个响铃信号。 149*52da9a59SGnoCiYeH const IMAXBEL = 0x2000; 150*52da9a59SGnoCiYeH /// 如果设置了该标志,表示输入数据被视为 UTF-8 编码。 151*52da9a59SGnoCiYeH const IUTF8 = 0x4000; 152*52da9a59SGnoCiYeH 153*52da9a59SGnoCiYeH /// 忽略中断信号 154*52da9a59SGnoCiYeH const IGNBRK = 0x001; 155*52da9a59SGnoCiYeH /// 检测到中断信号时生成中断(产生中断信号) 156*52da9a59SGnoCiYeH const BRKINT = 0x002; 157*52da9a59SGnoCiYeH /// 忽略具有奇偶校验错误的字符 158*52da9a59SGnoCiYeH const IGNPAR = 0x004; 159*52da9a59SGnoCiYeH /// 在检测到奇偶校验错误或帧错误时,将字符以 \377 标记 160*52da9a59SGnoCiYeH const PARMRK = 0x008; 161*52da9a59SGnoCiYeH /// 启用输入奇偶校验检查 162*52da9a59SGnoCiYeH const INPCK = 0x010; 163*52da9a59SGnoCiYeH /// 从输入字符中剥离第 8 位,即只保留低 7 位 164*52da9a59SGnoCiYeH const ISTRIP = 0x020; 165*52da9a59SGnoCiYeH /// 表示将输入的换行符 (\n) 映射为回车符 (\r) 166*52da9a59SGnoCiYeH const INLCR = 0x040; 167*52da9a59SGnoCiYeH /// 表示忽略回车符 (\r) 168*52da9a59SGnoCiYeH const IGNCR = 0x080; 169*52da9a59SGnoCiYeH /// 表示将输入的回车符 (\r) 映射为换行符 (\n) 170*52da9a59SGnoCiYeH const ICRNL = 0x100; 171*52da9a59SGnoCiYeH /// 表示在输入被停止(Ctrl-S)后,任何字符的输入都将重新启动输入 172*52da9a59SGnoCiYeH const IXANY = 0x800; 173*52da9a59SGnoCiYeH } 174*52da9a59SGnoCiYeH 175*52da9a59SGnoCiYeH /// termios输出特性 176*52da9a59SGnoCiYeH pub struct OutputMode: u32 { 177*52da9a59SGnoCiYeH /// 在输出时将换行符替换\r\n 178*52da9a59SGnoCiYeH const ONLCR = 0x00002; 179*52da9a59SGnoCiYeH /// Map Lowercase to Uppercase on Output 输出字符时将小写字母映射为大写字母 180*52da9a59SGnoCiYeH const OLCUC = 0x00004; 181*52da9a59SGnoCiYeH 182*52da9a59SGnoCiYeH /// 与NL协同 配置换行符的处理方式 183*52da9a59SGnoCiYeH const NLDLY = 0x00300; 184*52da9a59SGnoCiYeH const NL0 = 0x00000; // 不延迟换行 185*52da9a59SGnoCiYeH const NL1 = 0x00100; // 延迟换行(输出回车后等待一段时间再输出换行) 186*52da9a59SGnoCiYeH const NL2 = 0x00200; // NL2 和 NL3保留,暂未使用 187*52da9a59SGnoCiYeH const NL3 = 0x00300; 188*52da9a59SGnoCiYeH 189*52da9a59SGnoCiYeH /// 配置水平制表符的处理方式 190*52da9a59SGnoCiYeH const TABDLY = 0x00c00; 191*52da9a59SGnoCiYeH const TAB0 = 0x00000; // 不延迟水平制表符 192*52da9a59SGnoCiYeH const TAB1 = 0x00400; // 在输出水平制表符时,延迟到下一个设置的水平制表符位置 193*52da9a59SGnoCiYeH const TAB2 = 0x00800; // 在输出水平制表符时,延迟到下一个设置的 8 的倍数的位置 194*52da9a59SGnoCiYeH const TAB3 = 0x00c00; // TAB3 和 XTABS(与 TAB3 等效)保留,暂未使用 195*52da9a59SGnoCiYeH const XTABS = 0x00c00; 196*52da9a59SGnoCiYeH 197*52da9a59SGnoCiYeH /// 配置回车符的处理方式 198*52da9a59SGnoCiYeH const CRDLY = 0x03000; 199*52da9a59SGnoCiYeH const CR0 = 0x00000; // 不延迟回车 200*52da9a59SGnoCiYeH const CR1 = 0x01000; // 延迟回车(输出回车后等待一段时间再输出换行) 201*52da9a59SGnoCiYeH const CR2 = 0x02000; // CR2 和 CR3保留,暂未使用 202*52da9a59SGnoCiYeH const CR3 = 0x03000; 203*52da9a59SGnoCiYeH 204*52da9a59SGnoCiYeH /// 配置换页符(form feed)的处理方式 205*52da9a59SGnoCiYeH const FFDLY = 0x04000; 206*52da9a59SGnoCiYeH const FF0 = 0x00000; // 不延迟换页 207*52da9a59SGnoCiYeH const FF1 = 0x04000; // 延迟换页 208*52da9a59SGnoCiYeH 209*52da9a59SGnoCiYeH /// 配置退格符(backspace)的处理方式 210*52da9a59SGnoCiYeH const BSDLY = 0x08000; 211*52da9a59SGnoCiYeH const BS0 = 0x00000; // 不延迟退格 212*52da9a59SGnoCiYeH const BS1 = 0x08000; // 延迟退格 213*52da9a59SGnoCiYeH 214*52da9a59SGnoCiYeH /// 配置垂直制表符(vertical tab)的处理方式 215*52da9a59SGnoCiYeH const VTDLY = 0x10000; 216*52da9a59SGnoCiYeH const VT0 = 0x00000; // 不延迟垂直制表符 217*52da9a59SGnoCiYeH const VT1 = 0x10000; // 延迟垂直制表符 218*52da9a59SGnoCiYeH 219*52da9a59SGnoCiYeH /// 表示执行输出处理,即启用输出处理函数 220*52da9a59SGnoCiYeH const OPOST = 0x01; 221*52da9a59SGnoCiYeH /// 表示将输出的回车符 (\r) 映射为换行符 (\n) 222*52da9a59SGnoCiYeH const OCRNL = 0x08; 223*52da9a59SGnoCiYeH /// 表示在输出时,如果光标在第 0 列,则不输出回车符 (\r) 224*52da9a59SGnoCiYeH const ONOCR = 0x10; 225*52da9a59SGnoCiYeH /// 表示将回车符 (\r) 映射为换行符 (\n) 226*52da9a59SGnoCiYeH const ONLRET = 0x20; 227*52da9a59SGnoCiYeH /// 表示使用填充字符进行延迟。这个填充字符的默认值是空格。 228*52da9a59SGnoCiYeH const OFILL = 0x40; 229*52da9a59SGnoCiYeH /// 表示使用删除字符 (DEL, \177) 作为填充字符 230*52da9a59SGnoCiYeH const OFDEL = 0x80; 231*52da9a59SGnoCiYeH } 232*52da9a59SGnoCiYeH 233*52da9a59SGnoCiYeH /// 配置终端设备的基本特性和控制参数 234*52da9a59SGnoCiYeH pub struct ControlMode: u32 { 235*52da9a59SGnoCiYeH /// Baud Rate Mask 指定波特率的掩码 236*52da9a59SGnoCiYeH const CBAUD = 0x000000ff; 237*52da9a59SGnoCiYeH /// Extra Baud Bits 指定更高的波特率位 238*52da9a59SGnoCiYeH const CBAUDEX = 0x00000000; 239*52da9a59SGnoCiYeH /// Custom Baud Rate 指定自定义波特率 如果设置了 BOTHER,则通过以下位来设置自定义的波特率值 240*52da9a59SGnoCiYeH const BOTHER = 0x0000001f; 241*52da9a59SGnoCiYeH 242*52da9a59SGnoCiYeH const B0 = 0x00000000; 243*52da9a59SGnoCiYeH const B50 = 0x00000001; 244*52da9a59SGnoCiYeH const B75 = 0x00000002; 245*52da9a59SGnoCiYeH const B110 = 0x00000003; 246*52da9a59SGnoCiYeH const B134 = 0x00000004; 247*52da9a59SGnoCiYeH const B150 = 0x00000005; 248*52da9a59SGnoCiYeH const B200 = 0x00000006; 249*52da9a59SGnoCiYeH const B300 = 0x00000007; 250*52da9a59SGnoCiYeH const B600 = 0x00000008; 251*52da9a59SGnoCiYeH const B1200 = 0x00000009; 252*52da9a59SGnoCiYeH const B1800 = 0x0000000a; 253*52da9a59SGnoCiYeH const B2400 = 0x0000000b; 254*52da9a59SGnoCiYeH const B4800 = 0x0000000c; 255*52da9a59SGnoCiYeH const B9600 = 0x0000000d; 256*52da9a59SGnoCiYeH const B19200 = 0x0000000e; 257*52da9a59SGnoCiYeH const B38400 = 0x0000000f; 258*52da9a59SGnoCiYeH 259*52da9a59SGnoCiYeH const B57600 = 0x00000010; 260*52da9a59SGnoCiYeH const B115200 = 0x00000011; 261*52da9a59SGnoCiYeH const B230400 = 0x00000012; 262*52da9a59SGnoCiYeH const B460800 = 0x00000013; 263*52da9a59SGnoCiYeH const B500000 = 0x00000014; 264*52da9a59SGnoCiYeH const B576000 = 0x00000015; 265*52da9a59SGnoCiYeH const B921600 = 0x00000016; 266*52da9a59SGnoCiYeH const B1000000 = 0x00000017; 267*52da9a59SGnoCiYeH const B1152000 = 0x00000018; 268*52da9a59SGnoCiYeH const B1500000 = 0x00000019; 269*52da9a59SGnoCiYeH const B2000000 = 0x0000001a; 270*52da9a59SGnoCiYeH const B2500000 = 0x0000001b; 271*52da9a59SGnoCiYeH const B3000000 = 0x0000001c; 272*52da9a59SGnoCiYeH const B3500000 = 0x0000001d; 273*52da9a59SGnoCiYeH const B4000000 = 0x0000001e; 274*52da9a59SGnoCiYeH 275*52da9a59SGnoCiYeH /// 指定字符大小的掩码 以下位为特定字符大小 276*52da9a59SGnoCiYeH const CSIZE = 0x00000300; 277*52da9a59SGnoCiYeH const CS5 = 0x00000000; 278*52da9a59SGnoCiYeH const CS6 = 0x00000100; 279*52da9a59SGnoCiYeH const CS7 = 0x00000200; 280*52da9a59SGnoCiYeH const CS8 = 0x00000300; 281*52da9a59SGnoCiYeH 282*52da9a59SGnoCiYeH /// Stop Bit Select 表示使用两个停止位;否则,表示使用一个停止位 283*52da9a59SGnoCiYeH const CSTOPB = 0x00000400; 284*52da9a59SGnoCiYeH /// 表示启用接收器。如果未设置,则禁用接收器。 285*52da9a59SGnoCiYeH const CREAD = 0x00000800; 286*52da9a59SGnoCiYeH /// 表示启用奇偶校验。如果未设置,则禁用奇偶校验。 287*52da9a59SGnoCiYeH const PARENB = 0x00001000; 288*52da9a59SGnoCiYeH /// 表示启用奇校验。如果未设置,则表示启用偶校验。 289*52da9a59SGnoCiYeH const PARODD = 0x00002000; 290*52da9a59SGnoCiYeH /// 表示在终端设备被关闭时挂断线路(执行挂断操作) 291*52da9a59SGnoCiYeH const HUPCL = 0x00004000; 292*52da9a59SGnoCiYeH /// 表示忽略调制解调器的状态(DCD、DSR、CTS 等) 293*52da9a59SGnoCiYeH const CLOCAL = 0x00008000; 294*52da9a59SGnoCiYeH /// 指定输入波特率的掩码 295*52da9a59SGnoCiYeH const CIBAUD = 0x00ff0000; 296*52da9a59SGnoCiYeH 297*52da9a59SGnoCiYeH const ADDRB = 0x20000000; 298*52da9a59SGnoCiYeH } 299*52da9a59SGnoCiYeH 300*52da9a59SGnoCiYeH /// 配置终端设备的本地模式(local mode)或控制输入处理的行为 301*52da9a59SGnoCiYeH pub struct LocalMode: u32 { 302*52da9a59SGnoCiYeH /// 启用中断字符(Ctrl-C、Ctrl-Z) 303*52da9a59SGnoCiYeH const ISIG = 0x00000080; 304*52da9a59SGnoCiYeH /// 表示启用规范模式,即启用行缓冲和回显。在规范模式下,输入被缓冲,并且只有在输入回车符时才会传递给应用程序。 305*52da9a59SGnoCiYeH const ICANON = 0x00000100; 306*52da9a59SGnoCiYeH /// 表示启用大写模式,即输入输出都将被转换为大写。 307*52da9a59SGnoCiYeH const XCASE = 0x00004000; 308*52da9a59SGnoCiYeH /// 表示启用回显(显示用户输入的字符) 309*52da9a59SGnoCiYeH const ECHO = 0x00000008; 310*52da9a59SGnoCiYeH /// 表示在回显时将擦除的字符用 backspace 和空格字符显示。 311*52da9a59SGnoCiYeH const ECHOE = 0x00000002; 312*52da9a59SGnoCiYeH /// 表示在回显时将换行符后的字符用空格字符显示。 313*52da9a59SGnoCiYeH const ECHOK = 0x00000004; 314*52da9a59SGnoCiYeH /// 表示在回显时将换行符显示为换行和回车符。 315*52da9a59SGnoCiYeH const ECHONL = 0x00000010; 316*52da9a59SGnoCiYeH /// 表示在收到中断(Ctrl-C)和退出(Ctrl-\)字符后,不清空输入和输出缓冲区。 317*52da9a59SGnoCiYeH const NOFLSH = 0x80000000; 318*52da9a59SGnoCiYeH /// 表示在后台进程尝试写入终端时,发送停止信号(Ctrl-S) 319*52da9a59SGnoCiYeH const TOSTOP = 0x00400000; 320*52da9a59SGnoCiYeH /// 表示在回显时,显示控制字符为 ^ 加字符。 321*52da9a59SGnoCiYeH const ECHOCTL= 0x00000040; 322*52da9a59SGnoCiYeH /// 表示在回显时显示带有 # 的换行符(为了与 echo -n 命令兼容)。 323*52da9a59SGnoCiYeH const ECHOPRT= 0x00000020; 324*52da9a59SGnoCiYeH /// 表示在回显时将 KILL 字符(Ctrl-U)用空格字符显示。 325*52da9a59SGnoCiYeH const ECHOKE = 0x00000001; 326*52da9a59SGnoCiYeH /// 表示输出正在被冲刷(flush),通常是由于输入/输出流的状态变化。 327*52da9a59SGnoCiYeH const FLUSHO = 0x00800000; 328*52da9a59SGnoCiYeH /// 表示在规范模式下,存在需要重新打印的字符。 329*52da9a59SGnoCiYeH const PENDIN = 0x20000000; 330*52da9a59SGnoCiYeH /// 表示启用实现定义的输入处理。 331*52da9a59SGnoCiYeH const IEXTEN = 0x00000400; 332*52da9a59SGnoCiYeH /// 表示启用扩展的处理函数 333*52da9a59SGnoCiYeH const EXTPROC= 0x10000000; 334*52da9a59SGnoCiYeH } 335*52da9a59SGnoCiYeH 336*52da9a59SGnoCiYeH pub struct TtySetTermiosOpt: u8 { 337*52da9a59SGnoCiYeH const TERMIOS_FLUSH =1; 338*52da9a59SGnoCiYeH const TERMIOS_WAIT =2; 339*52da9a59SGnoCiYeH const TERMIOS_TERMIO =4; 340*52da9a59SGnoCiYeH const TERMIOS_OLD =8; 341*52da9a59SGnoCiYeH } 342*52da9a59SGnoCiYeH } 343*52da9a59SGnoCiYeH 344*52da9a59SGnoCiYeH /// 对应termios中控制字符的索引 345*52da9a59SGnoCiYeH pub struct ControlCharIndex; 346*52da9a59SGnoCiYeH #[allow(dead_code)] 347*52da9a59SGnoCiYeH impl ControlCharIndex { 348*52da9a59SGnoCiYeH pub const DISABLE_CHAR: u8 = b'\0'; 349*52da9a59SGnoCiYeH /// 中断信号 350*52da9a59SGnoCiYeH pub const VINTR: usize = 0; 351*52da9a59SGnoCiYeH /// 退出信号 352*52da9a59SGnoCiYeH pub const VQUIT: usize = 1; 353*52da9a59SGnoCiYeH /// 退格 354*52da9a59SGnoCiYeH pub const VERASE: usize = 2; 355*52da9a59SGnoCiYeH /// 终止输入信号 356*52da9a59SGnoCiYeH pub const VKILL: usize = 3; 357*52da9a59SGnoCiYeH /// 文件结束信号 \0? 358*52da9a59SGnoCiYeH pub const VEOF: usize = 4; 359*52da9a59SGnoCiYeH /// 指定非规范模式下的最小字符数 360*52da9a59SGnoCiYeH pub const VMIN: usize = 5; 361*52da9a59SGnoCiYeH /// 换行符 362*52da9a59SGnoCiYeH pub const VEOL: usize = 6; 363*52da9a59SGnoCiYeH /// 指定非规范模式下的超时时间 364*52da9a59SGnoCiYeH pub const VTIME: usize = 7; 365*52da9a59SGnoCiYeH /// 换行符 366*52da9a59SGnoCiYeH pub const VEOL2: usize = 8; 367*52da9a59SGnoCiYeH /// 未使用,保留 368*52da9a59SGnoCiYeH pub const VSWTC: usize = 9; 369*52da9a59SGnoCiYeH /// 擦除前一个单词 370*52da9a59SGnoCiYeH pub const VWERASE: usize = 10; 371*52da9a59SGnoCiYeH /// 重新打印整行 372*52da9a59SGnoCiYeH pub const VREPRINT: usize = 11; 373*52da9a59SGnoCiYeH /// 挂起信号 374*52da9a59SGnoCiYeH pub const VSUSP: usize = 12; 375*52da9a59SGnoCiYeH /// 启动输出信号 376*52da9a59SGnoCiYeH pub const VSTART: usize = 13; 377*52da9a59SGnoCiYeH /// 停止输出信号 378*52da9a59SGnoCiYeH pub const VSTOP: usize = 14; 379*52da9a59SGnoCiYeH /// 将下一个字符视为字面值,而不是特殊字符 380*52da9a59SGnoCiYeH pub const VLNEXT: usize = 15; 381*52da9a59SGnoCiYeH /// 对应于字符丢弃信号,用于丢弃当前输入的行 382*52da9a59SGnoCiYeH pub const VDISCARD: usize = 16; 383*52da9a59SGnoCiYeH } 384