豊福@パパイヤです。 酒本さん >> それともう一つ。gnuwin32 では stty raw が効か >> ないため動かないのですがよい対処方はありませんか。 > > これについてはわたなべさんが、ruby-list6991 にあげられている > 方法でどうでしょう。試してませんが。 わたなべさん [ruby-list:6991] > :Win95 で作成しているのですが、getc が改行まで待ちになっているようでパスワードが > :丸見えというなさけない状態です。これはどのあたりが問題なのでしょうか? > > getc は C の getc と同じなので, それで正常です. > Win32 の場合は Win32API module があるので, いろいろ方法はあります. > たとえば ... > o cygwin.dll の tcgetattr, tcsetattr を使い gets する.などなど. > require 'Win32API' ... このわたなべさんの例にならってやってみました。 rawモードにするのに ICANON を使いましたが これでいいんですかね。 *** sweeper.rb.orig Wed May 27 12:08:56 1998 --- sweeper.rb Fri May 29 01:48:55 1998 *************** *** 1,6 **** --- 1,48 ---- #!/usr/local/bin/ruby require "thread" + if PLATFORM =~ /cygwin32/ + require 'Win32API' + + Tcgetattr = Win32API.new('cygwin', 'tcgetattr', %w(L P), 'V') + Tcsetattr = Win32API.new('cygwin', 'tcsetattr', %w(L L P), 'V') + + ICANON = 2 + ECHO = 4 + TCSANOW = 2 + C_LFLAG = 3 + STRUCT_TERMIOS = 'SSSS C C18 CC' + + $ti = ([0]*25).pack(STRUCT_TERMIOS) + + def tcgetattr fd, termios + Tcgetattr.Call fd, termios + end + + def tcsetattr fd, command, termios + Tcsetattr.Call fd, command, termios + end + + def raw_mode + tcgetattr 0, $ti + uti = $ti.unpack(STRUCT_TERMIOS) + uti[C_LFLAG] &= ~(ECHO | ICANON) + tcsetattr 0, TCSANOW, uti.pack(STRUCT_TERMIOS) + end + + def cooked_mode + tcsetattr 0, TCSANOW, $ti + end + + else + def raw_mode + system("stty raw -echo") + end + + def cooked_mode + system("stty -raw echo") + end + end + def flush $stdout.flush end *************** *** 141,147 **** bd=Board.new(10,10,10) ! system("stty raw -echo") m = Mutex.new --- 183,189 ---- bd=Board.new(10,10,10) ! raw_mode m = Mutex.new *************** *** 189,193 **** } end bd.quit ! system("stty -raw echo") print "\n" --- 231,235 ---- } end bd.quit ! cooked_mode print "\n" --- 豊福@パパイヤ unbound / papaya.juice.or.jp toyofuku / juice.or.jp