[#42194] Enhancing Numeric#step — "Akinori MUSHA" <knu@...>

 Numeric#step の仕様の拡張を提案します。

26 messages 2010/09/08
[#42196] Re: Enhancing Numeric#step — Yukihiro Matsumoto <matz@...> 2010/09/08

まつもと ゆきひろです

[#42200] Re: Enhancing Numeric#step — "Akinori MUSHA" <knu@...> 2010/09/08

At Wed, 8 Sep 2010 22:46:57 +0900,

[#42204] Re: Enhancing Numeric#step — Yukihiro Matsumoto <matz@...> 2010/09/09

まつもと ゆきひろです

[#42232] 1.9.2 readline can't handle cursorkeys, mbcs chars etc (msvcrt) — arton <artonx@...>

artonです。

11 messages 2010/09/10

[#42269] [Ruby 1.9-Bug#3836] Kernel.system, spawnがスペースを含むパスで動作しない — Hiroki Najima <redmine@...>

チケット #3836 が更新されました。 (by Hiroki Najima)

12 messages 2010/09/16
[#42270] WindowsでのKernel.systemの挙動、一貫性について — NAJIMA Hiroki <h.najima@...> 2010/09/16

名島(Nazy)と申します。

[#42310] ビジースレッドがあるとコンテキストスイッチが起きづらくなる — kuwamoto shintaro <beuniv@...>

こんにちは。

9 messages 2010/09/29
[#42315] [bug:trunk] ビジースレッドがあるとコンテキストスイッチが起きづらくなる — "U.Nakamura" <usa@...> 2010/09/30

こんにちは、なかむら(う)です。

[ruby-dev:42232] 1.9.2 readline can't handle cursorkeys, mbcs chars etc (msvcrt)

From: arton <artonx@...>
Date: 2010-09-10 15:55:20 UTC
List: ruby-dev #42232
artonです。

ちょっと迷いがあるので、gdgdな長文ですみません。
現象)
ruby-1.9.2-p0のext/readline と GNU readline 4.3-2 (win32) で、カーソルキー
や、Homeキー、Endキーなどが処理されません。また、IMEを有効にした漢字入力
が行えません(MSBがオフのバイトのみが処理される)。
これは、MSWin32だけではなくMingwでも同様のはずです。
原因)
特殊キーが処理できない問題と、漢字入力ができない問題はそれぞれ異なる原因
です。
特殊キーが処理できないのは、win32.cがコンソール読み込みに利用している
ReadFile Win32APIがカーソルキーなどの特殊キーを無視することと(Windowsで
はこれらのキーに文字列(エスケープシーケンス)が割り当てられていないため、
そもそも処理できない)です。
漢字入力ができないのは、ext/readlineが読み込みに利用しているIO.getbyteが
charを返すためlibreadlineが期待しているintにするときに符号拡張されて2バ
イトコードを構成する文字コードと判断されないためです。
対応案)
後者については、汎用性があるので0xffでマスクする修正で良いのですが、それ
では前者が救われません。人によるとは思いますが、カーソルキーやHomeキーな
どを利用したいユーザも存在するので、できれば前者も救いたいと思います。
それで、キー入力の有無を判定して無ければスレッド切り替え器を呼び出し、有
ればlibreadlineのキー入力処理を呼び出す添付のパッチを作ったのですが、GNU
readline 4.3.2のWin32ポーティング版に依存した修正なのが気に食わない点で
す。
別案)
というわけで、win32.cの中でコンソール入力時にはReadFile APIではなく
ReadConsoleInput APIのようにキーコードを取れるAPIを利用して、その結果を
ANSIのコードに変換し(たとえば↑ならCSI (ESC [)A)、libreadlineについて
は現在のwin32ポーティング版とは別に(利用したい人が)用意する、というの
が良いのではないかと思います。
結論)
とりあえず、現在のMSWIN32でのext/readlineはカーソルキーなどのハンドリン
グができず、漢字入力にバグがあります。添付のパッチで修正できます
(test/readline/test_readline* が通るのは確認しています)。なので、当てて
いただけると短期的には嬉しいです。
が、可能なら汎用的に外部ライブラリとインターフェイスできるように、特殊キー
をANSIコードに変換すると良いなぁと考えます。

-- 
arton <artonx@yahoo.co.jp>

Attachments (1)

readline.patch (1.44 KB, text/x-diff)
*** readline.c~	Thu Apr 22 17:04:13 2010
--- readline.c	Fri Sep 10 23:41:34 2010
*************** readline_getc(FILE *input)
*** 117,122 ****
--- 117,150 ----
      if (!readline_instream) return rl_getc(input);
      GetOpenFile(readline_instream, ifp);
      if (rl_instream != ifp->stdio_file) return rl_getc(input);
+ #if defined(_WIN32)
+     {
+         INPUT_RECORD ir;
+         int n;
+         static int prior_key = '0';
+         for (;;) {
+             if (prior_key > 0xff) {
+                 prior_key = rl_getc(ifp->stdio_file);
+                 return prior_key;
+             }
+             if (PeekConsoleInput((HANDLE)_get_osfhandle(ifp->fd), &ir, 1, &n)) {
+                 if (n == 1) {
+                     if (ir.EventType == KEY_EVENT && ir.Event.KeyEvent.bKeyDown) {
+                         prior_key = rl_getc(ifp->stdio_file);
+                         return prior_key;
+                     } else {
+                         ReadConsoleInput((HANDLE)_get_osfhandle(ifp->fd), &ir, 1, &n);
+                     }
+                 } else {
+                     HANDLE h = (HANDLE)_get_osfhandle(ifp->fd);
+                     rb_w32_wait_events(&h, 1, INFINITE);
+                 }
+             } else {
+                 break;
+             }
+         }
+     }
+ #endif    
      c = rb_funcall(readline_instream, id_getbyte, 0, 0);
      if (NIL_P(c)) return EOF;
      return NUM2CHR(c);

In This Thread

Prev Next