Bug 297

Summary: В wineconsole не вводятся русские символы (кириллица)
Product: WINE@Etersoft Reporter: Константин Петров <argentum>
Component: ОбщееAssignee: Анатолий Лютин <vostok>
Status: CLOSED FIXED QA Contact: Vitaly Lipatov <lav>
Severity: normal    
Priority: P2 CC: kondratyuk, vostok
Version: 1.0.4   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 57, 190, 389, 600    
Attachments: неполный патч
Программа, проявляющая проблему

Description Константин Петров 2006-10-09 12:25:19 MSD
В работе использется клиент системы
RS-Balance, работающий как консольное приложение Win32. Как оказалось,
при запуске таких приложений под wineconsole (--backend=user), не
работает ввод русских букв. Локаль - UTF8. При попытке ввести русские
буквы вообще ничего не вводится. Сегодня пробовал запустить FAR под
wineconsole на домашней FreeBSD с локалью koi8-r, wine-0.9.16. В ответ
выводились различные символы, но никак не желаемые.

Бегло посмотрел на код wineconsole. Похоже, что ввод формируется в
функции WCUSER_GenerateKeyInputRecord(), файл user.c. У меня вызвал
подозрение следующий код:

	if (down)
	{
	    switch (ToUnicode(wParam, HIWORD(lParam), keyState, buf, 2, 0))
	    {
	    case 2:
		/* FIXME... should generate two events... */
		/* fall thru */
	    case 1:
		last = buf[0];
		break;
	    default:
		last = 0;
		break;
	    }
	}
	ir.Event.KeyEvent.uChar.UnicodeChar = last; /* FIXME HACKY... and buggy 'coz it
should be a stack, not a single value */

Похоже, что здесь получается ASCII из Unicode. А хотелось бы cp866.
Comment 1 Константин Петров 2006-10-16 14:32:59 MSD
рассмотрел источник возникновения баги.
он находится в programs/wineconsole/curses.c

Со стандартного ввода символ считывается в функции WCCURSES_GetEvents c помощью
wgetch(stdstr), далее заполняется структура ir[numEvent].Event.KeyEvent в
функции WCCURSES_FillSimpleChar. При этом в качестве Unicode-строки записывается
однобайтовое значение:
ir[numEvent].Event.KeyEvent.uChar.UnicodeChar = (unsigned char)inchar;

С английскими символами проблем нет, поскольку они одинаково кодируются как в
ASCII, так и в Unicode. 

Сделал патч, добавил перекодировку в Unicode перед обработкой. Теперь вводимый
символ читается правильно, но на экран выводятся пустые поля. Пока не смог найти
, кто и каки образом осуществляет вывод.
Comment 2 Константин Петров 2006-10-16 14:38:29 MSD
шзначально выводом на консоль текста занимается функция WriteConsoleOutputW в
dlls/kernel/console.c
Comment 3 Константин Петров 2006-10-18 17:25:25 MSD
Created attachment 65 [details]
неполный патч

этот патч преобразует считываемый символ в Unicode-формат. Таким образом,
символ правильно обрабатывается в дальнейшем. Т.е. в структуре ir правильно
заполняется поле UnicodeChar.
Но пока что не решена проблема правильной обработки VirtualKeyCode, поскольку
сейчас определение VirtualKeyCode, насколько я понимаю, происходит с учетом,
что считанный символ находится в кодировке ASCII.
Также все остальные переменные структуры ir, кроме UnicodeChar, определются
неверно (думаю требуется перекодировка в Ascii перед записбю в переменные).

ш самое главное криво работает вывод символа на экран консоли. После патча
латиница выводится, а кириллица выводится пробелами (раньше выводилась 1
латинским символом).
Comment 4 Анатолий Лютин 2006-11-15 15:38:02 MSK
Created attachment 74 [details]
Пример проблемы

Теперь при попадании в функции FillSimpleChar в curses.c считываются дополнительно 3 символа и конвертируются в переменную типа wchar с кодировкой текущей локали.
ш ir[numEvent].Event.KeyEvent.uChar.UnicodeChar заполняется данной переменной типа WCHAR.
Comment 5 Анатолий Лютин 2006-11-15 15:43:26 MSK
Created attachment 75 [details]
Окно с проблемой

!Работает только после установки патча wineconsole_curses_out!
Вывод на экран осуществляется теперь функцией mvwaddnwstr в функции Refresh.
Работает как в 8-битной консоли,так и в Юникодной.
Comment 6 Анатолий Лютин 2006-11-15 15:43:43 MSK
Created attachment 76 [details]
Лог ошибки

!Работает только после установки патча wineconsole_curses_out!
Вывод на экран осуществляется теперь функцией mvwaddnwstr в функции Refresh.
Работает как в 8-битной консоли,так и в Юникодной.
Comment 7 Vitaly Lipatov 2006-12-24 18:51:15 MSK
Насколько я понял, действительно правильный способ поддержки юникода - это использование libncursesw.
Вот некоторые замечания по недавно вышедшей версии ncurses 5.6
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=341661
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=316663
Comment 8 Константин Кондратюк 2007-05-28 12:55:25 MSD
Created attachment 120 [details]
Программа, проявляющая проблему
Comment 9 Константин Кондратюк 2007-05-28 12:57:42 MSD
Так как программы из состава RS-Bank так и не воспринимают русский ввод, снова открываю багу.
Comment 10 Анатолий Лютин 2007-05-30 01:05:50 MSD
Всё воспринимает, что и было доказано Константину,как у меня так и на сервере. Ждём ответа от клиента!
Comment 11 Анатолий Лютин 2007-06-06 12:06:33 MSD
Закрываю, т.к. несостоятельна. Открываю новую багу и ставлю depend on