Возникли проблемы с вводом событий клавиатуры в FLTK

У меня система без клавиатуры. Я могу подключить клавиатуру, но, в конечном счете, входные данные поступают с пользовательской клавиатуры, которая не является HID-устройством, она отправляет последовательные данные, которые я могу интерпретировать и декодировать, чтобы определить, нажал ли пользователь Вверх, Вниз, Влево, Вправо или Ввод.

Сейчас все, что у меня есть, это Fl_Window с двумя виджетами Fl_Button. Фокус установлен для одной из кнопок и для этих кнопок определены обратные вызовы. Я знаю, что если я подключу настоящую клавиатуру и буду использовать клавиши со стрелками, я смогу переключать фокус с кнопки на кнопку. Мне нужно нажать ПРОБЕЛ, чтобы активировать кнопку.

Моя проблема заключается в том, чтобы определить, как вызвать эти нажатия клавиш с помощью кода, когда я декодирую результат с встроенной клавиатуры. Потому что при развертывании не будет настоящей клавиатуры.

Я пытался вызвать int Fl_Window::handle(int) и не имел успеха. Я также пытался вызвать int Fl::handle(int, Fl_Window *) и не имел успеха.

Вот примеры кода:

if((ret = Fl::handle(FL_Left, window)) == 0)

Это компилируется, но я обнаружил, что возвращаю ноль, подразумевая, что событие не обрабатывалось.

if((ret = Fl_Window::handle(FL_Right)) == 0)

Это не компилируется, сообщая мне, что «не может вызывать функцию-член virtual int Fl_Window::handle(int) без объекта»

Я думаю, что «событие int» на самом деле должно быть FL_KEYDOWN.

Эта логика заставляет меня задаться вопросом, как я «устанавливаю» event_key(). Например, есть функции API, чтобы получить это, когда у вас есть обработчик, но я не хочу этого; Я хочу, чтобы это событие произошло.

Является ли мой единственный вариант здесь, чтобы выяснить, как эмулировать HID или создать какой-либо виртуальный HID, где я затем вызываю события клавиатуры?

Я не чувствую, что мне нужна функция обработчика в моем приложении, меня устраивает поведение по умолчанию, которое происходит и вызывает вызов моих функций обратного вызова. Моя проблема в том, что я не могу «заставить» эти события произойти.


person RTM    schedule 06.03.2014    source источник
comment
Посмотрите Демонстрация нажатия/отпускания клавиатуры на seriss.com/people/erco/fltk/# Клавиапрессрелиз   -  person cup    schedule 07.03.2014
comment
Вы можете вызвать события, используя send.   -  person cup    schedule 07.03.2014
comment
Спасибо за пример, я думаю, он показывает, как написать собственный обработчик, я не думаю, что мне это нужно, мне просто нужно знать, как вызывать события. Я вижу следующий комментарий о send(); и в документации FLTK указано, что это предпочтительная оболочка для handle(). Хорошо, пытаясь использовать это, я не могу найти ни синтаксиса, ни примеров. Я не могу заставить его скомпилироваться, если объявлю его как Fl_Widget::send(), Fl_Window::send() или Fl::send().   -  person RTM    schedule 07.03.2014
comment
Извините: я переключаюсь между FLTK1 и FLTK2. отправить - это вещь FLTK2. На FLTK1 отправка является статической. Один из способов обойти это - получить источник fltk и снять статику. Другой способ — установить Fl::e_keysym и затем вызвать обработчик. Дайте мне знать, если вам нужен пример — вы используете Linux или Windows?   -  person cup    schedule 07.03.2014
comment
Конечно, пример был бы отличным, я попробую это предложение. Я использую Линукс. Есть ФЛТК2? Возможно, я перейду на это. Проверяя это сейчас, мое главное желание с этим было бы, если бы он мог работать непосредственно с фреймбуфером.   -  person RTM    schedule 07.03.2014
comment
Я заработал, установив файл e_keysym. Спасибо за помощь!   -  person RTM    schedule 07.03.2014
comment
Есть FLTK2 и FLTK3. Вряд ли кто-то использует FLTK2 - если вы используете его, вы сами по себе. Мне еще предстоит попробовать FLTK3. Если вам нужна помощь по FLTK, лучше держитесь FLTK1.   -  person cup    schedule 07.03.2014


Ответы (1)


Вам нужно назначить нужную клавишу e_keysym, а затем отправить событие FL_KEYDOWN с помощью Fl::handle_(). (Fl::handle() не будет генерировать последующее событие FL_SHORTCUT.)

Fl::e_keysym = FL_Left;
Fl::handle_(FL_KEYDOWN, window);
// sleep() and/or Fl::wait() as appropriate
Fl::handle_(FL_KEYUP, window);
person Nicholas    schedule 30.04.2015