Как прочитать необработанный ввод в терминальном приложении LinuxLinux

Ответить
Anonymous
 Как прочитать необработанный ввод в терминальном приложении Linux

Сообщение Anonymous »

Я пытаюсь прочитать необработанные нажатия клавиш в консольном приложении Linux. Первая попытка была с использованием Crossterm Enable_raw_mode()

Код: Выделить всё

use std::io::Read;

use crossterm::terminal::enable_raw_mode;

fn main() {
enable_raw_mode().expect("Could not enable raw mode");

let stdin = std::io::stdin();
for data in stdin.bytes() {
let data = data.expect("Could not read char");

print!("Got char: {:#x}\r\n", data);
}
}
Хотя это в целом работает, у него есть два недостатка:
  • Мне хотелось бы знать, какую кнопку нажал пользователь, несмотря ни на что. текущего назначения клавиатуры.
  • Этот метод не сообщает о неработающих клавишах, пока не будет нажата вторая клавиша.
Особенно второй пункт проблематичен для моего варианта использования.
Я читал здесь что вы можете изменить способ сообщения о нажатиях клавиш на терминал с помощью ioctl. Это была моя вторая попытка использовать такой подход:

Код: Выделить всё

use std::io::Read;

use nix::ioctl_write_int_bad;

ioctl_write_int_bad!(setkbdmode, 0x4B45);

fn main() {
unsafe { setkbdmode(0, 0).expect("Here goes") };

let stdin = std::io::stdin();
for data in stdin.bytes() {
let data = data.expect("Could not read char");

println!("Got char: {:#x}", data);
}
}
Однако это не удается из-за следующей ошибки:

Код: Выделить всё

thread 'main' panicked at src/main.rs:8:31:
Could not set kbd mode: ENOTTY
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Похоже, что это работает только на виртуальных терминалах, а не на эмуляторах терминала.
Есть ли способ получить нужные мне данные в консоли Linux приложение, работающее в эмуляторе терминала? В частности:
  • Получайте все нажатия клавиш, даже на неработающие клавиши.
    Желательно в виде кодов сканирования, а не в виде переведенных клавиш< /li>


Подробнее здесь: https://stackoverflow.com/questions/791 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»