Ncurses refresh problem

Hello,

I am porting to Ruby a small calendar browser I made using C and
ncurses. I can’t seem to figure out why my newwin won’t refresh until
after a key is pressed. After hours of reading ncurses man pages, I am
stumped. I’ve included the essential code below.

And feel free to comment/correct my brute-force approach towards a more
Ruby-ish style.

Thanks.

#!/usr/bin/env ruby

require “ncurses”

class Calendar

attr_reader :month, :year, :day

@@MONTHNAMES = [nil] + %w(January February March April
May June July August September
October November December)

def initialize(time = Time.new(), y = 0, x = 0)
@win = Ncurses.newwin(9, 22, y, x)
# @win = Ncurses.subwin(Ncurses.stdscr, 9, 22, 0, 0)
@border = true
@month = time.month
@day = time.mday
@year = time.year
end

def leap_year?( year )
( year % 4 == 0 ) && (( year % 100 != 0 ) || (year % 400 == 0))
end

def days_in_month
return 29 if @month == 2 && leap_year?( @year )
return [31, 28, 31, 30,31, 30, 31, 31, 30, 31, 30, 31][@month - 1]
end

def draw
@win.clear()
@win.border( *([0]*8) ) if @border == true
Ncurses.mvwprintw(@win, 0, 4, " %s %d ", @@MONTHNAMES[@month], @year)
Ncurses.mvwprintw(@win, 1, 1, “Su Mo Tu We Th Fr Sa”)
first = Time.local(@year, @month, 1).wday + 1
y = 2
(1…days_in_month()).each { |day|
x = (day + first - 2) % 7
y += 1 if (x == 0 && day != 1)
x = x * 3 + 1
Ncurses.mvwprintw(@win, y, x, “%2d”, day)
}
@win.refresh
end
end

if $0 == FILE
begin
Ncurses.initscr
Ncurses.noecho
Ncurses.curs_set(0)

cal = Calendar.new
cal.draw
while Ncurses.getch != ?q
  cal.draw
end

ensure
Ncurses.echo
Ncurses.endwin
end
end

···