def clear_row pad, lineno
      if @renderer and @renderer.respond_to? :clear_row
          @renderer.clear_row pad, lineno
      else
        # need pad width not window width, the other clearstring uses width of
        #  widget to paint on window.
        @_clearstring ||= " " * @content_cols
        # what about bg color ??? XXX, left_margin and internal width
        #cp = get_color($datacolor, @color, @bgcolor)
        cp = @cp || FFI::NCurses.COLOR_PAIR($datacolor)
        att = attr() || NORMAL
        FFI::NCurses.wattron(pad,cp | att)
        FFI::NCurses.mvwaddstr(pad,lineno, 0, @_clearstring)
        FFI::NCurses.wattroff(pad,cp | att)
      end
    end
def clear_row pad, lineno
      if @renderer and @renderer.respond_to? :clear_row
          @renderer.clear_row pad, lineno
      else
        # need pad width not window width, the other clearstring uses width of
        #  widget to paint on window.
        @_clearstring ||= " " * @content_cols
        # what about bg color ??? XXX, left_margin and internal width
        #cp = get_color($datacolor, @color, @bgcolor)
        cp = @cp || FFI::NCurses.COLOR_PAIR($datacolor)
        att = attr() || NORMAL
        FFI::NCurses.wattron(pad,cp | att)
        FFI::NCurses.mvwaddstr(pad,lineno, 0, @_clearstring)
        FFI::NCurses.wattroff(pad,cp | att)
      end
    end
---- the next 2 methods deal with printing chunks
 we should put it int a common module and include it
 in Window and Pad stuff and perhaps include it conditionally.
 before updating a single row in a table
 we need to clear the row otherwise previous contents can show through