Страница 1 из 1

Ура, теперь в консоли можно писать по-русски! Урра!

Добавлено: Пт дек 08, 2006 6:02 pm
piroJOKE
Некий перец Tatka замутил в свежей версии SVN поддержку русского ввода в консоли! Урря!
(Это изменение SVN5173)

Скриншот с SVN5182 - ниже!

Сцылки:
http://forums.openkore.com/viewtopic.php?t=18873 "SNV - russian encoding ?"
http://forums.openkore.com/viewtopic.php?t=24987 "How to enable russian encoding"

ЗЫ: Урря! :Yahoo!:

Добавлено: Пт дек 08, 2006 6:39 pm
piroJOKE
Вот нечто вроде патча, для ознакомления, это файл src\Interface\Console\Win32.pm

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

Win32.pm:
--------------------------------------------------
 use Win32::Console;
 use Utils::Win32;
 use encoding 'utf8';
+use Encode;
 use I18N qw(stringToBytes);
--------------------------------------------------
 #	local($|) = 1;
 	while ($self->{in_con}->GetEvents()) {
 		my @event = $self->{in_con}->Input();
-		if (defined($event[0]) && $event[0] == 1 && $event[1]) {
+
+		if (@event && $event[5] < 0) {
+			# Special characters are returned as unsigned integer
+			# (dunno why). Fix this.
+			$event[5] = 256 + $event[5];
+		}
+		if (@event && $event[0] == 1 && $event[1] == 0 && $event[3] == 18) {
+			# Alt was released and there's an ASCII code. This is
+			# a special character. Change @events as if a normal key
+			# was pressed.
+			$event[1] = 1;
+		}
+
+		if (@event && $event[0] == 1 && $event[1] == 1) {
 			##Ctrl+U (erases entire line)
 			if ($event[6] == 40 && $event[5] == 21) {
 				$self->{in_pos} = 0;
--------------------------------------------------
 #				print "\n";
 			#Other ASCII (+ ISO Latin-*)
 			} elsif ($event[5] >= 32 && $event[5] != 127 && $event[5] <= 255) {
+				my $char = Encode::decode("cp" . $self->{codepage}, chr($event[5]));
 				if ($self->{in_pos} < length($self->{input_part})) {
 					$self->{out_con}->Scroll(
 						$self->{in_pos}, $self->{in_line}, $self->{right}, $self->{in_line},
--------------------------------------------------
 					$self->{in_pos} = length($self->{input_part});
 				}
 				$self->{out_con}->Cursor($self->{in_pos}, $self->{in_line});
-				$self->{out_con}->Write(chr($event[5]));
-				substr($self->{input_part}, $self->{in_pos}, 0, chr($event[5])) if ($self->{in_pos} <= length($self->{input_part}));
+				Utils::Win32::printConsole($char);
+				substr($self->{input_part}, $self->{in_pos}, 0, $char) if ($self->{in_pos} <= length($self->{input_part}));
 				$self->{in_pos}++;
 #			} elsif ($event[3] == 33) {
 #				__PACKAGE__->writeOutput("pgup\n");
--------------------------------------------------
 				$self->{out_con}->Write(' ' x length($self->{input_part}));
 				$self->{out_con}->Cursor(0, $self->{in_line});
 				$self->{input_part} = $self->{input_list}[$self->{input_offset}];
-				$self->{out_con}->Write($self->{input_part});
+				Utils::Win32::printConsole($self->{input_part});
 				$self->{in_pos} = length($self->{input_part});
 			##Right Arrow
 			} elsif ($event[3] == 39) {
--------------------------------------------------
 				$self->{out_con}->Write(' ' x length($self->{input_part}));
 				$self->{out_con}->Cursor(0, $self->{in_line});
 				$self->{input_part} = $self->{input_list}[$self->{input_offset}];
-				$self->{out_con}->Write($self->{input_part});
+				Utils::Win32::printConsole($self->{input_part});
 				$self->{in_pos} = length($self->{input_part});
 			##Insert
 #			} elsif ($event[3] == 45) {
--------------------------------------------------

Добавлено: Пт дек 08, 2006 6:44 pm
Click
выложи плиз пропатченный файлик)

Добавлено: Пт дек 08, 2006 6:46 pm
piroJOKE
Вод:

Добавлено: Пт дек 08, 2006 7:03 pm
Click
в xkore заместо русских выводит "???????"
но всеравно клёво

Добавлено: Пт дек 08, 2006 7:08 pm
kLabMouse
Click
Вот Про ХКор нуно будет прорепортировать.

Добавлено: Пт дек 08, 2006 7:19 pm
Stells
piroJOKE писал(а):Вод:
Спасибо!)) теперь жизнь будет проще :) :Yahoo!: