ReadKey, или как ловить символы с клавиатуры? (Linux/UTF8)

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

ReadKey, или как ловить символы с клавиатуры? (Linux/UTF8)

Сообщение fdima1979 » 19.07.2013 22:28:00

Когда то я писал на TurboPascal. Отличный был язык, я стока в нем понаписал что просто... в общем одной из ценных визуальных фишек в нем была вот такая штука:

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

Var   Ch   : Char;
   Str   : String[20];
Begin
   Str := '';
   While True Do
   begin
      Write (Str);
      Ch := ReadKey;

      if Ch = #13 Then Break;
      If (Ch <> 0) Then Str := Str + Ch;
      ....      
   End;
   ...
End.


Не ругайтесь на код, я его из головы взял, даже не проверял, да это и не важно, я его как пример написал.

В общем в чем фишка - щас хочу написать строчный текстовой редактор для терминала (в частности для XTERM), под линуксом в котором везде UTF8. Как всегда решил вот так вот написать свой ReadLn, чтоб с ограничениями на ввод символов, но почему то русские буквы у меня печатаются странно. На сороковом введенном символе (если печатаются только русские буквы без пробелов),компьютер неожиданно дает Return и текст продолжает печататься с новой строки, и если набирать дальше, то на следующей сороковой позиции он снова даст ретурн.

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

CRT вообще какой то странный под линуксом. Если его просто описать Uses то обычные ReadLn и WriteLn начинают себя вести как было описано выше, словно он их подменяет (судя по всему он так и делает).


Так вот вопрос. Есть ли нормальная альтернатива ReadKey и KeyPress, и вообще как ловить клавиатуру под линуксой на голом FPC не используя CRT?

Про GotoXY, ClrScr и т.п. я уже и не говорю, поговаривают что его лучше делать с помощью ESC-последовательностей. С этим я наверное справлюсь. Меня сейчас волнует ловля символов с клавиатуры и WhereX, WhereY.

ДААААА! Пользовался ptcCrt, но это по моему для детишков побаловаться. Он ничего не лечит.
Бьюсь уже третьи сутки.

---------------
Пользуюсь FPC без лазаря. Хочу свои досовые проги переписать (с нуля конечно) под линуксой.
Помогите если знаете как. Не дайте человеку на СИ уйти. Не хочу я туда, там темно и сыро. :-((((((
Последний раз редактировалось fdima1979 21.07.2013 19:49:57, всего редактировалось 2 раз(а).
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17

Re: ReadKey, или как ловить символы с клавиатуры :-((

Сообщение SSerge » 20.07.2013 06:15:33

fdima1979 писал(а):но почему то русские буквы у меня печатаются странно



Это читали? http://sirserge.altai.info/articles/?id=44
(в дополнение еще надо это: http://sirserge.altai.info/articles/?id=45 )

Де факто: в RTL библиотеках FPC 2.4.x, 2.6.x нет никакой поддержки работы с UTF8. End point.
В 2.7.x что либо вменяемое можно сделать только через UnicodeStrings, сия методика влечет за собою кучу разных последствий, первая из которых - катастрофическое падение производительности программы при работе с этим строковым типом. (Еще надо сказать, что вообще-то при работах с данными любых строковых типов FPC беззастенчиво сливает в производительности например JAVA by Oracle и C# by Microsoft, если не вычитывать ассемблерные листинги и не оптимизировать код путем устранения промежуточных присвоений, которые сей компилятор очень любит, причем с обычной логикой его действия плохо соотносятся).

Ну, или переписывать низкоуровневый код взаимодействия с терминалом и клавиатурой. Для истинного джедая. :D Пока будете это делать, в общем, тёмные силы победят.

fdima1979 писал(а):Не дайте человеку на СИ уйти


А там тоже нифига решений не предусмотрено вообще то. Проблема выведена далеко за рамки самого языка и его библиотек.

fdima1979 писал(а):как ловить клавиатуру под линуксой на голом FPC не используя CRT


Так же, как ловить ее голым ассемблером. Кроме шуток. То есть, найти исходники какого-то действующего примера и анализировать, как там это сделано, вне зависимости от примененного языка, это скорее всего будет ассемблерная процедура или что-то на уровне перехватчика вызова системных процедур .
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: ReadKey, или как ловить символы с клавиатуры :-((

Сообщение fdima1979 » 20.07.2013 08:25:29

Спасибо за разъяснения и интересные ссылки.
Я тут вчера нарыл инфу будто к FPC можно подключить библиотеку nocurses, и типа она может работать с консолью.
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17

Re: ReadKey, или как ловить символы с клавиатуры? (Linux/UTF

Сообщение Vadim » 22.07.2013 03:28:21

fdima1979
Ещё можно попробовать использовать модуль keyboard.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: ReadKey, или как ловить символы с клавиатуры? (Linux/UTF

Сообщение fdima1979 » 23.07.2013 21:13:48

Vadim писал(а):Ещё можно попробовать использовать модуль keyboard.

Отличный модуль. Правда его нужно еще подточить, но это будет очень интересно. Тут даже не надо отдельно ловить функциональные кнопки - все кнопки на одном уровне.

Хорошо бы еще найти где-нибудь возможность находить текущее положение курсора в терминале. Размер терминала я уже понял где брать - из переменных среды. Сегодня попробовал ncurses - мне не понравилось, к тому-же его ocrt не понимает UTF-8, и вообще какой-то он весь абстрагированный от консоли.

И самое поганое что ни какой документации (литратуры) нету. Приходится все на ощупь пробовать.
Кстати классического GetEnv () в FPC нет, ну или он так глубоко закопан в юнитах что я просто его не нахожу. Возможно что в SysUtils что-то такое есть по типу дельфевого.
fdima1979
новенький
 
Сообщения: 15
Зарегистрирован: 19.07.2013 21:16:17

Re: ReadKey, или как ловить символы с клавиатуры? (Linux/UTF

Сообщение Vadim » 24.07.2013 04:29:04

fdima1979 писал(а):Кстати классического GetEnv () в FPC нет, ну или он так глубоко закопан в юнитах что я просто его не нахожу.

Он в модуле Dos сидит. :) Подключаете и используете как раньше. ;)
Ещё, в модуле BaseUnix есть функция fpGetEnv(). Работает точно так же, только параметр и выход у него типа PChar.
В SysUtils есть целая группа функций для этого дела:
GetEnvironmentVariableCount() - возвращяет кол-во переменных среды;
GetEnvironmentString() - возвращает переменную среды по её индексу, согласно первой функции;
GetEnvironmentVariable() - работает так же, как DOS-овский GetEnv().
По поводу литературы. В комплекте с FPC идёт несколько PDF-ок с описанием основных модулей (rtl.pdf и fcl.pdf).
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Рейтинг@Mail.ru