--- /dev/null
+class Buffer
+ def initialize(size)
+ @size = size
+ @buff = []
+ @buff_type = []
+ @current = 0
+ @wrap = false
+ @before = false
+ @after = false
+ end
+ def size()
+ return @buff.length
+ end
+ def maxlen()
+ maxlen = 0
+ @buff.each do |string|
+ if string.length > maxlen
+ maxlen = string.length
+ end
+ end
+ return maxlen
+ end
+
+ def push(string,type=0)
+ if(string.chomp.empty?) then string = " " end
+ string.split( /\r?\n/ ).each do |line|
+ @buff[@current] = line
+ @buff_type[@current] = type
+ if(@size > 0)
+ @current = (1+@current) % @size
+ else
+ @current = 1+@current
+ end
+ if(@current == 0) then @wrap = true end
+ end
+ end
+ def yield(size,offset=0,&block)
+ if(size < 0) then size = 0 end
+ range = Range.new(0,@current-1).to_a
+ if(@wrap)
+ range = Range.new(@current,@size-1).to_a + range
+ end
+ range = range.last(size+offset)[0,size]
+ @before = (size+offset < @buff.length)
+ @after = (offset != 0 and size < @buff.length)
+ if(block)
+ range.each do |i|
+ yield [@buff[i],@buff_type[i]]
+ end
+ else
+ return range.collect{|r| [@buff[r],@buff_type[r]]}
+ end
+ end
+ def has_after?()
+ return @after
+ end
+ def has_before?()
+ return @before
+ end
+ def clear()
+ @current = 0
+ @buff = []
+ @buff_type = []
+ end
+end
+
+
require "open3"
require 'optparse'
require 'ostruct'
+require_relative 'buffer'
+require_relative 'windows'
class IO
def readline_nonblock
end
end
-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
-
-class Buffer
- def initialize(size)
- @size = size
- @buff = []
- @buff_type = []
- @current = 0
- @wrap = false
- @before = false
- @after = false
- end
- def size()
- return @buff.length
- end
- def maxlen()
- maxlen = 0
- @buff.each do |string|
- if string.length > maxlen
- maxlen = string.length
- end
- end
- return maxlen
- end
-
- def push(string,type=0)
- if(string.chomp.empty?) then string = " " end
- string.split( /\r?\n/ ).each do |line|
- @buff[@current] = line
- @buff_type[@current] = type
- if(@size > 0)
- @current = (1+@current) % @size
- else
- @current = 1+@current
- end
- if(@current == 0) then @wrap = true end
- end
- end
- def yield(size,offset=0,&block)
- if(size < 0) then size = 0 end
- range = Range.new(0,@current-1).to_a
- if(@wrap)
- range = Range.new(@current,@size-1).to_a + range
- end
- range = range.last(size+offset)[0,size]
- @before = (size+offset < @buff.length)
- @after = (offset != 0 and size < @buff.length)
- if(block)
- range.each do |i|
- yield [@buff[i],@buff_type[i]]
- end
- else
- return range.collect{|r| [@buff[r],@buff_type[r]]}
- end
- end
- def has_after?()
- return @after
- end
- def has_before?()
- return @before
- end
- def clear()
- @current = 0
- @buff = []
- @buff_type = []
- end
-end
-
def find_ini(option_inifile)
if(not option_inifile.nil?)
inifile = option_inifile
--- /dev/null
+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
+
+