Class: VER::Window

Inherits:
Object show all
Defined in:
lib/rbcurse/core/system/window.rb

Constant Summary collapse

SPECIAL_KEYS =

2011-09-23 @since 1.3.1 Added more combinations here. These 2 are just indicative

{
  [27, 79, 50, 81]              => 20014, #  'F14',
  [27, 79, 50, 82]              => 20015 # 'F15',
}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Window

or 2011-09-21 allowing array, or 4 ints, in addition to hash @since 1.3.1

Parameters:

  • window (Array, Hash)

    coordinates (ht, w, top, left)

  • window (int, int, int, int)

    coordinates (ht, w, top, left)



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rbcurse/core/system/window.rb', line 44

def initialize(*args)

  case args.size
  when 1
    case args[0]
    when Array, Hash
     layout = args[0]
    else
      raise ArgumentError, "Window expects 4 ints, array of 4 ints, or Hash in constructor"
    end
  when 4
    layout = { :height => args[0], :width => args[1], :top => args[2], :left => args[3] }
  end

  @visible = true
  reset_layout(layout)

  #$log.debug "XXX:WINDOW got h #{@height}, w #{@width}, t #{@top}, l #{@left} "

  @height = FFI::NCurses.LINES if @height == 0   # 2011-11-14 added since tired of checking for zero
  @width = FFI::NCurses.COLS   if @width == 0

  @window = FFI::NCurses.newwin(@height, @width, @top, @left) # added FFI 2011-09-6 
  @panel = Ncurses::Panel.new(@window) # added FFI 2011-09-6 
  #$error_message_row = $status_message_row = Ncurses.LINES-1
  $error_message_row ||= Ncurses.LINES-1
  $error_message_col ||= 1 # ask (bottomline) uses 0 as default so you can have mismatch. XXX
  $status_message ||= RubyCurses::Variable.new # in case not an App

  $key_map ||= :vim
  $esc_esc = true; # gove me double esc as 2727 so i can map it.
  init_vars


end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/rbcurse/core/system/window.rb', line 209

def method_missing(name, *args)
  name = name.to_s
  if (name[0,2] == "mv")
    test_name = name.dup
    test_name[2,0] = "w" # insert "w" after"mv"
    if (FFI::NCurses.respond_to?(test_name))
      return FFI::NCurses.send(test_name, @window, *args)
    end
  end
  test_name = "w" + name
  if (FFI::NCurses.respond_to?(test_name))
    return FFI::NCurses.send(test_name, @window, *args)
  end
  FFI::NCurses.send(name, @window, *args)
end

Instance Attribute Details

#heightObject (readonly)

Returns the value of attribute height.



33
34
35
# File 'lib/rbcurse/core/system/window.rb', line 33

def height
  @height
end

#layoutObject

hash containing hwtl



34
35
36
# File 'lib/rbcurse/core/system/window.rb', line 34

def layout
  @layout
end

#leftObject (readonly)

Returns the value of attribute left.



33
34
35
# File 'lib/rbcurse/core/system/window.rb', line 33

def left
  @left
end

#modifiedObject

has it been modified and may need a refresh



38
39
40
# File 'lib/rbcurse/core/system/window.rb', line 38

def modified
  @modified
end

#nameObject

more for debugging log files. 2010-02-02 19:58



37
38
39
# File 'lib/rbcurse/core/system/window.rb', line 37

def name
  @name
end

#panelObject (readonly)

reader requires so he can del it in end



35
36
37
# File 'lib/rbcurse/core/system/window.rb', line 35

def panel
  @panel
end

#topObject (readonly)

Returns the value of attribute top.



33
34
35
# File 'lib/rbcurse/core/system/window.rb', line 33

def top
  @top
end

#widthObject (readonly)

Returns the value of attribute width.



33
34
35
# File 'lib/rbcurse/core/system/window.rb', line 33

def width
  @width
end

#window_typeObject (readonly)

window or pad to distinguish 2009-11-02 23:11



36
37
38
# File 'lib/rbcurse/core/system/window.rb', line 36

def window_type
  @window_type
end

Class Method Details

.create_window(h = 0, w = 0, t = 0, l = 0) ⇒ Object

2009-10-13 12:24 not used as yet this is an alternative constructor created if you don’t want to create a hash first

2011-09-21 V1.3.1 You can now send an array to Window constructor


109
110
111
112
113
# File 'lib/rbcurse/core/system/window.rb', line 109

def self.create_window(h=0, w=0, t=0, l=0)
  layout = { :height => h, :width => w, :top => t, :left => l }
  @window = Window.new(layout)
  return @window
end

.root_window(layout = { :height => 0, :width => 0, :top => 0, :left => 0 }) ⇒ Object

this is an alternative constructor



95
96
97
98
99
100
101
102
103
# File 'lib/rbcurse/core/system/window.rb', line 95

def self.root_window(layout = { :height => 0, :width => 0, :top => 0, :left => 0 })
  #VER::start_ncurses
  @layout = layout
  @window = Window.new(@layout)
  @window.name = "Window::ROOTW"
  @window.wrefresh
  Ncurses::Panel.update_panels
  return @window
end

Instance Method Details

#_refreshObject



313
314
315
316
# File 'lib/rbcurse/core/system/window.rb', line 313

def _refresh
  return unless visible?
  @window.refresh
end

#actual_heightObject

returns the actual ht in case you’ve used a root window which returns a 0 for wid and ht



274
275
276
# File 'lib/rbcurse/core/system/window.rb', line 274

def actual_height
  height == 0? Ncurses.LINES : height
end

#actual_widthObject

returns the actual width in case you’ve used a root window which returns a 0 for wid and ht NOTE: this does not work when resize , use getmaxx instead



266
267
268
# File 'lib/rbcurse/core/system/window.rb', line 266

def actual_width
  width == 0? Ncurses.COLS : width
end

#attroff(*args) ⇒ Object



146
147
148
# File 'lib/rbcurse/core/system/window.rb', line 146

def attroff *args
  FFI::NCurses.wattroff @window, *args
end

#attron(*args) ⇒ Object



143
144
145
# File 'lib/rbcurse/core/system/window.rb', line 143

def attron *args
  FFI::NCurses.wattron @window, *args
end

#clearObject

doesn’t seem to work, clears first line, not both



519
520
521
522
523
# File 'lib/rbcurse/core/system/window.rb', line 519

def clear
  # return unless visible?
  move 0, 0
  puts *Array.new(height){ ' ' * (width - 1) }
end

#close_command(*args, &block) ⇒ Object Also known as: command



850
851
852
853
854
855
# File 'lib/rbcurse/core/system/window.rb', line 850

def close_command *args, &block
  @close_command ||= []
  @close_args ||= []
  @close_command << block
  @close_args << args
end

#color=(color) ⇒ Object



323
324
325
326
# File 'lib/rbcurse/core/system/window.rb', line 323

def color=(color)
  @color = color
  @window.color_set(color, nil)
end

#color_parser(f) ⇒ Object



690
691
692
693
694
695
696
697
# File 'lib/rbcurse/core/system/window.rb', line 690

def color_parser f
  $log.debug "XXX:  color_parser setting in window to #{f} "
  if f == :tmux
    @color_parser = get_default_color_parser()
  else
    @color_parser = f
  end
end

#confirm_close_command(*args, &block) ⇒ Object

set a single command to confirm whether window shoud close or not Block should return true or false for closing or not



860
861
862
863
# File 'lib/rbcurse/core/system/window.rb', line 860

def confirm_close_command *args, &block
  @confirm_close_command = block
  @confirm_close_args    = args
end

#convert_to_chunk(s, colorp = $datacolor, att = FFI::NCurses::A_NORMAL) ⇒ Object



706
707
708
709
710
711
712
# File 'lib/rbcurse/core/system/window.rb', line 706

def convert_to_chunk s, colorp=$datacolor, att=FFI::NCurses::A_NORMAL
  unless @color_parser
    @color_parser = get_default_color_parser()
    @converter = Chunks::ColorParser.new @color_parser
  end
  @converter.convert_to_chunk s, colorp, att
end

#default_for(name) ⇒ Object

this gives error since stdscr is only a pointer at this time



557
558
559
560
561
562
563
564
565
566
567
568
# File 'lib/rbcurse/core/system/window.rb', line 557

def default_for(name)
  case name
  when :height, :top
    #Ncurses.stdscr.getmaxy(stdscr)
    FFI::NCurses.LINES
  when :width, :left
    #Ncurses.stdscr.getmaxx(stdscr)
    FFI::NCurses.COLS
  else
    0
  end
end

#delwinObject

2011-09-7



140
141
142
# File 'lib/rbcurse/core/system/window.rb', line 140

def delwin # 2011-09-7 
  Ncurses.delwin(@window)
end

#destroyObject

destroy window, panel and any pads that were requested



600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
# File 'lib/rbcurse/core/system/window.rb', line 600

def destroy
  # typically the ensure block should have this

  #$log.debug "win destroy start"

  Ncurses::Panel.del_panel(@panel.pointer) if @panel
  delwin() if @window 
  Ncurses::Panel.update_panels # added so below window does not need to do this 2011-10-1 

  # destroy any pads that were created by widgets using get_pad
  @pads.each { |pad|  
    FFI::NCurses.delwin(pad) if pad 
    pad = nil
  } if @pads
  #$log.debug "win destroy end"
end

#fire_close_handlerObject

need a way of lettign user decide whether he wishes to close in which case we return false. However, there could be several commands mapped. how do we know which is the one that has this authority



868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
# File 'lib/rbcurse/core/system/window.rb', line 868

def fire_close_handler
  if @confirm_close_command
    comm = @confirm_close_command
    ret = comm.call(self, *@confirm_close_args) 
    return ret unless ret # only return if false returned
  end
  if @close_command
    @close_command.each_with_index do |comm, ix|
      comm.call(self, *@close_args[ix]) if comm
    end
  end
  @close_command = nil
  @close_args = nil
  return true
end

#get_pad(content_rows, content_cols) ⇒ Object

2011-11-13 since 1.4.1 Widgets can get window to create a pad for them. This way when the window

is destroyed, it will delete all the pads. A widget wold not be able to do this.

The destroy method of the widget will be called.



622
623
624
625
626
627
628
# File 'lib/rbcurse/core/system/window.rb', line 622

def get_pad content_rows, content_cols
  pad = FFI::NCurses.newpad(content_rows, content_cols)
  @pads ||= []
  @pads << pad
  ## added 2013-03-05 - 19:21 without next line how was pad being returned
  return pad
end

#get_windowObject

This used to return an Ncurses window object, and you could call methods on it Now it returns a FFI::NCurses.window pointer which you cannot call methods on. You have to pass it to FFI::NCurses.<method>



836
# File 'lib/rbcurse/core/system/window.rb', line 836

def get_window; @window; end

#getchObject



336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
# File 'lib/rbcurse/core/system/window.rb', line 336

def getch
  #c = @window.getch
  c = FFI::NCurses.wgetch(@window)
  # the only reason i am doing this is so ESC can be returned if no key is pressed
  # after that, not sure how this effects everything. most likely I should just
  # go back to using a wtimeout, and not worry about resize requiring a keystroke
  if c == 27
    Ncurses::wtimeout(@window, $ncurses_timeout || 500) # will wait a second on wgetch so we can get gg and qq
  else
    Ncurses::nowtimeout(@window, true)
  end
  c
  # 2011-12-20 - i am trying setting a timer on wgetch, see timeout
  #c = FFI::NCurses.getch # this will keep waiting, nodelay won't be used on it, since 
  # we've put nodelay on window
  #if c == Ncurses::KEY_RESIZE

rescue SystemExit, Interrupt 
  #FFI::NCurses.flushinp
  3 # is C-c
rescue StandardError
  -1 # is C-c
end

#getcharObject

returns control, alt, alt+ctrl, alt+control+shift, F1 .. etc ALT combinations also send a 27 before the actual key Please test with above combinations before using on your terminal added by rkumar 2008-12-12 23:07

2011-09-23 Redone Control-left, right, and Shift-F5..F10.
Checking for quick press of Alt-Sh-O followed by Alt or printable char
Checking for quick press of Alt-[ followed by Alt or printable char
I attempted keeping a hash of combination arrays but it fails in the above
2 cases, so abandoned.


376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
# File 'lib/rbcurse/core/system/window.rb', line 376

def getchar 
  while 1 
    ch = self.getch
    #$log.debug "window getchar() GOT: #{ch}" if ch != -1
    sf = @stack.first
    if ch == -1
      # the returns escape 27 if no key followed it, so its SLOW if you want only esc
      if @stack.first == 27
        #$log.debug " -1 stack sizze #{@stack.size}: #{@stack.inspect}, ch #{ch}"
        case @stack.size
        when 1
          @stack.clear
          return 27
        when 2 # basically a ALT-O, or alt-[ (79 or 91) this will be really slow since it waits for -1
          ch = 128 + @stack.last
          $log.warn "XXX: WARN  #{ch} CLEARING stack #{@stack} "
          @stack.clear
          return ch
        else
          # check up a hash of special keys
          ret = SPECIAL_KEYS(@stack)
          return ret if ret
          $log.warn "INVALID UNKNOWN KEY: SHOULD NOT COME HERE getchar():#{@stack}" 
        end
      end
      # possibly a 49 left over from M3-1
      unless @stack.empty?
        if @stack.size == 1
          @stack.clear
          return sf
        end
        $log.warn "something on stack getchar(): #{@stack} "
      end
      # comemnt after testing keys since this will be called a lot, even stack.clear is called a lot
      $log.warn "ERROR CLEARING STACK WITH STUFF ON IT getchar():#{@stack}"  if ($log.debug? && !@stack.empty?)
      @stack.clear
      next
    end #  -1
    # this is the ALT combination
    if @stack.first == 27
      # experimental. 2 escapes in quick succession to make exit faster
      if @stack.size == 1 && ch == 27
        @stack.clear
        return 2727 if $esc_esc # this is double-esc if you wanna trap it, trying out
        return 27
      end
      # possible F1..F3 on xterm-color
      if ch == 79 || ch == 91
        #$log.debug " got 27, #{ch}, waiting for one more"
        @stack << ch
        next
      end
      #$log.debug "stack SIZE  #{@stack.size}, #{@stack.inspect}, ch: #{ch}"
      if @stack == [27,79]
        # xterm-color
        case ch
        when 80
          ch = FFI::NCurses::KEY_F1
        when 81
          ch = FFI::NCurses::KEY_F2
        when 82
          ch = FFI::NCurses::KEY_F3
        when 83
          ch = FFI::NCurses::KEY_F4
          #when 27 # another alt-char following Alt-Sh-O
        else
          ## iterm2 uses these for HOME END num keyboard keys
          @stack.clear
          #@stack << ch # earlier we pushed this but it could be of use
          #return 128 + 79
          return 128 + 79 + ch

        end
        @stack.clear
        return ch
      elsif @stack == [27, 91]
        # XXX 27, 91 also is Alt-[
        if ch == 90
          @stack.clear
          return KEY_BTAB # backtab
        elsif ch == 53 || ch == 50 || ch == 51
          # control left, right and shift function
          @stack << ch
          next
        elsif ch == 27 # another alt-char immediately after Alt-[
          $log.debug "getchar in 27, will return 128+91 " if $log.debug? 
          @stack.clear
          @stack << ch
          return 128 + 91
        else
          $log.debug "getchar in other, will return 128+91: #{ch} " if $log.debug? 
          # other cases Alt-[ followed by some char or key - merge with previous
          @stack.clear
          @stack << ch
          return 128 + 91
        end
      elsif @stack == [27, 91, 53]
        if ch == 68
          @stack.clear
          return C_LEFT  # control-left
        elsif ch == 67
          @stack.clear
          return C_RIGHT  # -control-rt
        end
      elsif @stack == [27, 91, 51]
        if ch == 49 && getch()== 126
          @stack.clear
          return 20009  # sh_f9
        end
      elsif @stack == [27, 91, 50]
        if ch == 50 && getch()== 126
          @stack.clear
          return 20010  # sh-F10
        end
        if ch == 57 && getch()== 126
          @stack.clear
          return 20008  # sh-F8
        elsif ch == 56 && getch()== 126
          @stack.clear
          return 20007  # sh-F7
        elsif ch == 54 && getch()== 126
          @stack.clear
          return 20006  # sh-F6
        elsif ch == 53 && getch()== 126
          @stack.clear
          return 20005  # sh-F5
        end
      end
      # the usual Meta combos. (alt) - this is screwing it up, just return it in some way
      ch = 128 + ch
      @stack.clear
      return ch
    end # stack.first == 27
    # append a 27 to stack, actually one can use a flag too
    if ch == 27
      @stack << 27
      next
    end
    return ch
  end # while
end

#hideObject

Ncurses panel



572
573
574
575
576
577
578
# File 'lib/rbcurse/core/system/window.rb', line 572

def hide
  #return unless visible? # added 2011-10-14 these 2 are not behaving properly
  Ncurses::Panel.hide_panel @panel.pointer
  #Ncurses.refresh # wnoutrefresh
  Ncurses::Panel.update_panels # added so below window does not need to do this 2011-10-1 
  @visible = false
end

#highlight_line(color, y, x, max) ⇒ Object



328
329
330
# File 'lib/rbcurse/core/system/window.rb', line 328

def highlight_line(color, y, x, max)
  @window.mvchgat(y, x, max, Ncurses::A_NORMAL, color, nil)
end

#init_varsObject



79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/rbcurse/core/system/window.rb', line 79

def init_vars
  @window_type = :WINDOW
  Ncurses::keypad(@window, true)
  # Added this so we can get Esc, and also C-c pressed in succession does not crash system
  #  2011-12-20 half-delay crashes system as does cbreak
  #This causes us to be unable to process gg qq since getch won't wait.
  #Ncurses::nodelay(@window, bf = true)
  # wtimeout was causing RESIZE sigwinch to only happen after pressing a key
  #Ncurses::wtimeout(@window, $ncurses_timeout || 500) # will wait a second on wgetch so we can get gg and qq
  @stack = []
  @name ||="#{self}"
  @modified = true
  $catch_alt_digits ||= false # is this where is should put globals ? 2010-03-14 14:00 XXX
end

#layout_value(name) ⇒ Object

removed ref to default_for since giving error in FFI 2011-09-8



548
549
550
551
552
553
554
# File 'lib/rbcurse/core/system/window.rb', line 548

def layout_value(name)
  value = @layout[name]
  default = default_for(name)

  value = value.call(default) if value.respond_to?(:call)
  return (value || default).to_i
end

#OLDmethod_missing(meth, *args) ⇒ Object

while moving from ncurses-ruby to FFI need to pass window pointer for w methods as well as mvw - NOT COMING HERE due to include FFI



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/rbcurse/core/system/window.rb', line 190

def OLDmethod_missing(meth, *args)
  $log.debug " WWWW method missing #{meth} "
  if meth[0,1]=="w" || meth[0,3] == "mvw"
    $log.debug " WWWW method missing #{meth} adding window in call "
    #return @window.send(meth, @window, *args)
    return FFI::NCurses.send(meth, @window, *args)
  else
  end
  if @window
    if @window.respond_to? meth
      @window.send(meth, *args)
    else
      FFI::NCurses.send( meth, *args)
    end
  else
    FFI::NCurses.send( meth, *args)
  end
end

#on_topObject



588
589
590
591
# File 'lib/rbcurse/core/system/window.rb', line 588

def on_top
  Ncurses::Panel.top_panel @panel.pointer
  wnoutrefresh
end

#posObject

Ncurses



158
159
160
# File 'lib/rbcurse/core/system/window.rb', line 158

def pos
  return y, x
end

NOTE: many of these methods using width will not work since root windows width

is 0


234
235
236
237
238
# File 'lib/rbcurse/core/system/window.rb', line 234

def print(string, width = width)
  return unless visible?
  w = width == 0? Ncurses.COLS : width
  waddnstr(string.to_s, w) # changed 2011 dts  
end

prints a border around a widget, CLEARING the area.

If calling with a pad, you would typically use 0,0, h-1, w-1.


790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
# File 'lib/rbcurse/core/system/window.rb', line 790

def print_border row, col, height, width, color, att=Ncurses::A_NORMAL
  raise "height needs to be supplied." if height.nil?
  raise "width needs to be supplied." if width.nil?
  att ||= Ncurses::A_NORMAL

  #$log.debug " inside window print_border r #{row} c #{col} h #{height} w #{width} "

  # 2009-11-02 00:45 made att nil for blanking out
  # FIXME - in tabbedpanes this clears one previous line ??? XXX when using a textarea/view
  # when using a pad this calls pads printstring which again reduces top and left !!! 2010-01-26 23:53 
  ww=width-2
  (row+1).upto(row+height-1) do |r|
    prv_printstring( r, col+1," "*ww , color, att)
  end
  prv_print_border_only row, col, height, width, color, att
end

NOTE : FOR MESSAGEBOXES ONLY !!!!



762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
# File 'lib/rbcurse/core/system/window.rb', line 762

def print_border_mb row, col, height, width, color, attr
  # the next is for xterm-256 
  att = get_attrib attr
  len = width
  len = Ncurses.COLS-0 if len == 0
  # print a bar across the screen 
  #attron(Ncurses.COLOR_PAIR(color) | att)
  # this works for newmessagebox but not for old one.
  # Even now in some cases some black shows through, if the widget is printing spaces
  # such as field or textview on a messagebox.
  (row-1).upto(row+height-1) do |r|
    mvwhline(r, col, 1, len)
  end
  #attroff(Ncurses.COLOR_PAIR(color) | att)

  mvwaddch row, col, Ncurses::ACS_ULCORNER
  mvwhline( row, col+1, Ncurses::ACS_HLINE, width-6)
  mvwaddch row, col+width-5, Ncurses::ACS_URCORNER
  mvwvline( row+1, col, Ncurses::ACS_VLINE, height-4)

  mvwaddch row+height-3, col, Ncurses::ACS_LLCORNER
  mvwhline(row+height-3, col+1, Ncurses::ACS_HLINE, width-6)
  mvwaddch row+height-3, col+width-5, Ncurses::ACS_LRCORNER
  mvwvline( row+1, col+width-5, Ncurses::ACS_VLINE, height-4)
end


806
807
808
# File 'lib/rbcurse/core/system/window.rb', line 806

def print_border_only row, col, height, width, color, att=Ncurses::A_NORMAL
  prv_print_border_only row, col, height, width, color, att
end

NOTE: many of these methods using width will not work since root windows width

is 0


249
250
251
252
253
# File 'lib/rbcurse/core/system/window.rb', line 249

def print_empty_line
  return unless visible?
  w = getmaxx == 0? Ncurses.COLS : getmaxx
  printw(' ' * w)
end

NOTE: many of these methods using width will not work since root windows width

is 0


257
258
259
260
# File 'lib/rbcurse/core/system/window.rb', line 257

def print_line(string)
  w = getmaxx == 0? Ncurses.COLS : getmaxx
  print(string.ljust(w))
end

NOTE: many of these methods using width will not work since root windows width

is 0


242
243
244
245
# File 'lib/rbcurse/core/system/window.rb', line 242

def print_yx(string, y = 0, x = 0)
  w = width == 0? Ncurses.COLS : width
  mvwaddnstr(y, x, string, w) # changed 2011 dts  
end

#printstring(r, c, string, color, att = Ncurses::A_NORMAL) ⇒ Object



725
726
727
728
729
# File 'lib/rbcurse/core/system/window.rb', line 725

def printstring(r,c,string, color, att = Ncurses::A_NORMAL)
  raise "Nil passed to peintstring row:#{r}, col:#{c}, #{color} " if r.nil? || c.nil? || color.nil?
  #raise "Zero or less passed to printstring row:#{r}, col:#{c} " if $log.debug? && (r <=0 || c <=0)
  prv_printstring(r,c,string, color, att )
end

#printstring_formatted(r, c, content, color, att = Ncurses::A_NORMAL) ⇒ Object

prints a string formatted in our new experimental coloring format taken from tmux. Currently, since i have chunks workings, i convert to chunks and use the existing print function. This could change. An example of a formatted string is: s=“#testing chunks #[fg=yellow, bg=red, bold]yellow #[reverse] reverseme \

#[normal]normal#[bg = black]just yellow#[fg=blue],blue now #[underline] underlined text"

Ideally I should push and pop colors which the shell does not do with ansi terminal sequences. That way i can have a line in red,

with some word in yellow, and then the line continues in red.


667
668
669
670
671
# File 'lib/rbcurse/core/system/window.rb', line 667

def printstring_formatted(r,c,content, color, att = Ncurses::A_NORMAL)
  att = get_attrib att unless att.is_a? Fixnum
  chunkline = convert_to_chunk(content, color, att)
  printstring_or_chunks r,c, chunkline, color, att
end

#printstring_formatted_right(r, c, content, color, att = Ncurses::A_NORMAL) ⇒ Object

print a formatted line right aligned c (col) is ignored and calculated based on width and unformatted string length



676
677
678
679
680
681
# File 'lib/rbcurse/core/system/window.rb', line 676

def printstring_formatted_right(r,c,content, color, att = Ncurses::A_NORMAL)
  clean = content.gsub /#\[[^\]]*\]/,''  # clean out all markup
  #c = actual_width() - clean.length # actual width not working if resize
  c = getmaxx() - clean.length
  printstring_formatted(r,c,content, color, att )
end

#printstring_or_chunks(r, c, content, color, att = Ncurses::A_NORMAL) ⇒ Object

Allows user to send data as normal string or chunks for printing An array is assumed to be a chunk containing color and attrib info



634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
# File 'lib/rbcurse/core/system/window.rb', line 634

def printstring_or_chunks(r,c,content, color, att = Ncurses::A_NORMAL)
  if content.is_a? String
    printstring(r,c,content, color, att)
  elsif content.is_a? Chunks::ChunkLine
    #$log.debug "XXX: using chunkline" # 2011-12-10 12:40:13
    wmove r, c
    a = get_attrib att
    show_colored_chunks content, color, a
  elsif content.is_a? Array
    # several chunks in one row - NOTE Very experimental may change
    if content[0].is_a? Array
      $log.warn "XXX: WARNING outdated should send in a chunkline"
      wmove r, c
      a = get_attrib att
      show_colored_chunks content, color, a
    else
      # a single row chunk - NOTE Very experimental may change
      text = content[1].dup
      printstring r, c, text, content[0] || color, content[2] || att
    end
  end
end

#prv_print_border_only(row, col, height, width, color, att = Ncurses::A_NORMAL) ⇒ Object

print just the border, no cleanup + Earlier, we would clean up. Now in some cases, i’d like + to print border over what’s been done. XXX this reduces 1 from width but not height !!! FIXME



815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
# File 'lib/rbcurse/core/system/window.rb', line 815

def prv_print_border_only row, col, height, width, color, att=Ncurses::A_NORMAL
  if att.nil? 
    att = Ncurses::A_NORMAL
  else
    att = get_attrib att
  end
  wattron(Ncurses.COLOR_PAIR(color) | att)
  mvwaddch  row, col, Ncurses::ACS_ULCORNER
  mvwhline( row, col+1, Ncurses::ACS_HLINE, width-2)
  mvwaddch row, col+width-1, Ncurses::ACS_URCORNER
  mvwvline( row+1, col, Ncurses::ACS_VLINE, height-1)

  mvwaddch row+height-0, col, Ncurses::ACS_LLCORNER
  mvwhline(row+height-0, col+1, Ncurses::ACS_HLINE, width-2)
  mvwaddch row+height-0, col+width-1, Ncurses::ACS_LRCORNER
  mvwvline( row+1, col+width-1, Ncurses::ACS_VLINE, height-1)
  wattroff(Ncurses.COLOR_PAIR(color) | att)
end

#prv_printstring(r, c, string, color, att = Ncurses::A_NORMAL) ⇒ Object

name changed from printstring to prv_prinstring



732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
# File 'lib/rbcurse/core/system/window.rb', line 732

def prv_printstring(r,c,string, color, att = Ncurses::A_NORMAL)

  #$log.debug " #{@name} inside window printstring r #{r} c #{c} #{string} "
  if att.nil? 
    att = Ncurses::A_NORMAL
  else
    att = get_attrib att
  end
    #att = att.downcase.to_sym if att.is_a? String
  #case att
  #when :normal
    #att = Ncurses::A_NORMAL
  #when :underline
    #att = Ncurses::A_UNDERLINE
  #when :bold
    #att = Ncurses::A_BOLD
  #when :reverse
    #att = Ncurses::A_REVERSE    
  #when :dim
    #att = Ncurses::A_DIM    
  #when :blink
    #att = Ncurses::A_BLINK    # unlikely to work
  #end

  wattron(Ncurses.COLOR_PAIR(color) | att)
  mvwprintw(r, c, "%s", :string, string);
  wattroff(Ncurses.COLOR_PAIR(color) | att)
end

#puts(*strings) ⇒ Object



309
310
311
# File 'lib/rbcurse/core/system/window.rb', line 309

def puts(*strings)
  print(strings.join("\n") << "\n")
end

#rb_mvaddch(row, col, char) ⇒ Object

use in place of mvaddch if your widget could be using a pad or window



847
848
849
# File 'lib/rbcurse/core/system/window.rb', line 847

def rb_mvaddch row, col, char
  mvaddch row, col, char
end

#rb_mvwhline(row, col, char, width) ⇒ Object

use in place of mvwhline if your widget could be using a pad or window



839
840
841
# File 'lib/rbcurse/core/system/window.rb', line 839

def rb_mvwhline row, col, char, width
  mvwhline row, col, char, width
end

#rb_mvwvline(row, col, char, width) ⇒ Object

use in place of mvwvline if your widget could be using a pad or window



843
844
845
# File 'lib/rbcurse/core/system/window.rb', line 843

def rb_mvwvline row, col, char, width
  mvwvline row, col, char, width
end

#reset_layout(layout) ⇒ Object

allow user to send an array I am tired of the hash layout (taken from ver).



529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
# File 'lib/rbcurse/core/system/window.rb', line 529

def reset_layout(layout)
  case layout
  when Array
    $log.error  "NIL in window constructor" if layout.include? nil
    raise ArgumentError, "Nil in window constructor" if layout.include? nil
    @height, @width, @top, @left = *layout
    raise ArgumentError, "Nil in window constructor" if @top.nil? || @left.nil?

    @layout = { :height => @height, :width => @width, :top => @top, :left => @top }
  when Hash
    @layout = layout

    [:height, :width, :top, :left].each do |name|
      instance_variable_set("@#{name}", layout_value(name))
    end
  end
end

#resizeObject

## END FFI



152
153
154
# File 'lib/rbcurse/core/system/window.rb', line 152

def resize
  resize_with(@layout)
end

#resize_with(layout) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
# File 'lib/rbcurse/core/system/window.rb', line 115

def resize_with(layout)
  $log.debug " DARN ! This awready duz a resize!! if h or w or even top or left changed!!! XXX"
  reset_layout(layout)
  #@window.wresize(height, width)
  wresize(height, width)
  #FFI::NCurses.wresize(@window,height, width)
  # this is dicey since we often change top and left in pads only for panning !! XXX
  #@window.mvwin(top, left)
  mvwin(top, left)
  #FFI::NCurses.mvwin(@window, top, left)
end

#respond_to?(name) ⇒ Boolean

Returns:

  • (Boolean)


224
225
226
227
228
229
230
# File 'lib/rbcurse/core/system/window.rb', line 224

def respond_to?(name)
  name = name.to_s
  if (name[0,2] == "mv" && FFI::NCurses.respond_to?("mvw" + name[2..-1]))
    return true
  end
  FFI::NCurses.respond_to?("w" + name) || FFI::NCurses.respond_to?(name)
end

#showObject



580
581
582
583
584
585
586
# File 'lib/rbcurse/core/system/window.rb', line 580

def show
  #return if visible? # added 2011-10-14 these 2 are not behaving properly
  Ncurses::Panel.show_panel @panel.pointer
  #Ncurses.refresh # wnoutrefresh
  Ncurses::Panel.update_panels # added so below window does not need to do this 2011-10-1 
  @visible = true
end

#show_colored_chunks(chunks, defcolor = nil, defattr = nil) ⇒ Object

NOTE: many of these methods using width will not work since root windows width

is 0
Previously this printed a chunk as a full line, I've modified it to print on 
one line. This can be used for running text.


282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
# File 'lib/rbcurse/core/system/window.rb', line 282

def show_colored_chunks(chunks, defcolor = nil, defattr = nil)
  return unless visible?
  chunks.each do |chunk| #|color, chunk, attrib|
    case chunk
    when Chunks::Chunk
      color = chunk.color
      attrib = chunk.attrib
      text = chunk.text
    when Array
      # for earlier demos that used an array
      color = chunk[0]
      attrib = chunk[2]
      text = chunk[1]
    end

    color ||= defcolor
    attrib ||= defattr

    cc, bg = ColorMap.get_colors_for_pair color
    #$log.debug "XXX: CHUNK window #{text}, cp #{color} ,  attrib #{attrib}. #{cc}, #{bg} " 
    color_set(color,nil) if color
    wattron(attrib) if attrib
    print(text)
    wattroff(attrib) if attrib
  end
end

#to_sObject



837
# File 'lib/rbcurse/core/system/window.rb', line 837

def to_s; @name || self; end

#ungetch(ch) ⇒ Object



332
333
334
# File 'lib/rbcurse/core/system/window.rb', line 332

def ungetch(ch)
  Ncurses.ungetch(ch)
end

#visible?Boolean

Returns:

  • (Boolean)


593
594
595
# File 'lib/rbcurse/core/system/window.rb', line 593

def visible?
  @visible
end

#wmove(y, x) ⇒ Object Also known as: move

end since include FFI is taking over, i need to force it here. not going into method_missing



182
183
184
185
# File 'lib/rbcurse/core/system/window.rb', line 182

def wmove y,x
  #Ncurses.wmove @window, y, x
  FFI::NCurses.wmove @window, y, x
end

#wnoutrefreshObject



318
319
320
321
# File 'lib/rbcurse/core/system/window.rb', line 318

def wnoutrefresh
  return unless visible?
  @window.wnoutrefresh
end

#wrefreshObject

ADDED DUE TO FFI



137
138
139
# File 'lib/rbcurse/core/system/window.rb', line 137

def wrefresh
  Ncurses.wrefresh(@window)
end

#xObject



166
167
168
# File 'lib/rbcurse/core/system/window.rb', line 166

def x
  Ncurses.getcurx(@window)
end

#x=(n) ⇒ Object



170
# File 'lib/rbcurse/core/system/window.rb', line 170

def x=(n) move(y, n) end

#yObject



162
163
164
# File 'lib/rbcurse/core/system/window.rb', line 162

def y
  Ncurses.getcury(@window)
end

#y=(n) ⇒ Object



171
# File 'lib/rbcurse/core/system/window.rb', line 171

def y=(n) move(n, x) end