class List_Win def initialize(inifile) @params = inifile @win = Ncurses::WINDOW.new(0, Ncurses.COLS()/4, 0, 0) @win.border(*([0]*8)) @win.keypad(true) @win.timeout(1000) @win.refresh() @entry = 0 end def getch() @win.getch() end def clear() @win.clear() end def resize(x,y) @win.resize(x,y) end def move(x,y) @win.move(x,y) end def refresh() @win.refresh() end def print_list(entry=nil) if(not entry.nil?) @entry = entry end i = 0 @params.each_section do |section| if(@entry == i) @win.attron(Ncurses::A_REVERSE) end @win.move(i+1,1) print_line(@win,@params[section]['Name']) if(@entry == i) @win.attroff(Ncurses::A_REVERSE) end i = i+1 end @win.border(*([0]*8)) @win.move(0,3) @win.addstr("Menu") @win.refresh() end end class Buff_Win def initialize(winsize,winpos,params) @params = params @win = Ncurses::WINDOW.new(0, winsize, 0, winpos) @panel = Ncurses::Panel::PANEL.new(@win) if(@params['Type'] == 'oneshot') @buffer = Buffer.new(0) else @buffer = Buffer.new(@params['Buffer'].to_i) end @proc = nil @curr_offset = 0 @hscroll = 0 update_date() spawn_proc() print_buffer() end def move_resize(winsize,winpos) newwin = Ncurses::WINDOW.new(0, winsize, 0, winpos) Ncurses::Panel.replace_panel(@panel, newwin) Ncurses.delwin(@win) @win = newwin print_buffer() end def update_date() @last_update = Time.now @date = @last_update.strftime("%F %R:%S") end def win_border() @win.border(*([0]*8)) win_header() end def win_header() @win.move(0,3) @win.addnstr(@params['Name'],@win.getmaxx-@date.length-10) @win.move(0,@win.getmaxx-@date.length-2) @win.addstr(@date) end def refresh() @win.refresh() end def clear() @win.clear() end def show_win() Ncurses::Panel.top_panel(@panel) Ncurses::Panel.update_panels end def hscroll(scroll=0) @hscroll += scroll if(@hscroll < 0) @hscroll = 0 end if(@hscroll > @buffer.maxlen()-@win.getmaxx+3) @hscroll = @buffer.maxlen()-@win.getmaxx+3 end print_buffer() refresh() end def scroll(scroll=0,goto=nil,fact=nil) if (not fact.nil?) scroll = (fact * @win.getmaxy.to_f).to_i elsif (not goto.nil?) @curr_offset = (goto * @buffer.size()).to_i scroll = 0 end #@curr_offset -= @win.getmaxy/2 @curr_offset += scroll if(@curr_offset < 0) @curr_offset = 0 end if(@curr_offset > @buffer.size()-@win.getmaxy+2) @curr_offset = @buffer.size()-@win.getmaxy+2 end print_buffer() refresh() end def print_buffer() #clear() win_border() j = 1 @buffer.yield(@win.getmaxy-2,@curr_offset) { |l,type| @win.move(j,1) if(type == 1) then @win.attron(Ncurses.COLOR_PAIR(1)) end print_line(@win,l,hscroll=@hscroll) if(type == 1) then @win.attroff(Ncurses.COLOR_PAIR(1)) end j = j+1 } if(@buffer.has_before?) @win.move(2,@win.getmaxx-1) @win.attron(Ncurses::A_REVERSE) @win.addstr("↑") @win.attroff(Ncurses::A_REVERSE) end if(@buffer.has_after?) @win.move(@win.getmaxy-2,@win.getmaxx-1) @win.attron(Ncurses::A_REVERSE) @win.addstr("↓") @win.attroff(Ncurses::A_REVERSE) end end def proc_readlines() begin while true @buffer.push(@proc.readline_nonblock) update_date() end rescue IO::WaitReadable end end def update(force=false) if(@params['Type'] == 'continuous') proc_readlines() end if(@params['Type'] == 'oneshot') if(force or (Time.now - @last_update > @params['Periodic'].to_i)) @buffer.clear() spawn_proc() clear() end end print_buffer() end def spawn_proc() if(@params['Type'] == 'oneshot') update_date() Open3.popen3(@params["Command"]) { |i,o,e,t| while ((not o.eof?) or (not e.eof?)) rs = IO.select([o,e],nil)[0] r = (rs[0].eof?)? rs[1] : rs[0] if r.fileno == o.fileno @buffer.push(r.readline) elsif r.fileno == e.fileno @buffer.push(r.readline,type=1) end end } elsif(@params['Type'] == 'continuous') @proc = IO.popen(@params["Command"]) proc_readlines() end end end