Removed some unnecessary direct-access instance variables
[nfoiled.git] / lib / nfoiled / terminal.rb
blob192e31f585f4b34fc6c2fa4b35676ad38c3f00d5
1 module Nfoiled
2   ##
3   # An `Nfoiled::Terminal` is a specific set of Nfoiled windows and
4   # configuration. In the vast majority of cases, you only need one of these,
5   # and that one will be created for you by `Nfoiled::initialize`. A general
6   # user shouldn't need to deal with `Terminal` at all.
7   class Terminal
8     
9     class <<self
10       # An array of known `Terminal` instances
11       attr_reader :terminals
12       def terminals; @terminals ||= Array.new; end
13       
14       # The currently active `Terminal` instance
15       attr_accessor :current
16       
17       # The initial `Terminal` instance, if Nfoiled is initialized without an
18       # existing `Terminal`.
19       attr_accessor :default
20     end
21     
22     # The IO object to which output will be managed
23     attr_reader :output
24     
25     # The IO object on which input will be watched
26     attr_reader :input
27     
28     # The type of the terminal ('vt102', 'xterm', etc)
29     attr_reader :term
30     
31     # The actual terminal object as returned by Ncurses
32     attr_reader :wrapee
33     
34     # An array of known windows belonging to this Terminal
35     attr_reader :windows
36     def windows; @windows ||= Array.new; end
37     
38     # The `Window` responsible for accepting input to this Terminal. Defaults
39     # to the last created `Window`, unless one has been defined.
40     attr_accessor :acceptor
41     def acceptor; @acceptor || windows.last; end
42     def acceptor=(window)
43       @acceptor = window
44     end
45     
46     ##
47     # Responsible for creating a new `Terminal`. See `newterm(3X)`.
48     def initialize opts = Hash.new
49       { :output => STDOUT, :input => STDIN }.merge opts
50       @output = opts[:output]
51       @input = opts[:input]
52       @term = opts[:term]
53       
54       @wrapee = ::Ncurses.newterm(opts[:term], opts[:out], opts[:in])
55       Terminal.current = self
56       Terminal.terminals << self
57       Nfoiled::initialize
58     end
59     
60     ##
61     # 'Activates' a `Terminal`, destroying all windows and environment from
62     # the current `Terminal` and replacing it with those of this one. See
63     # `set_term(3X)`.
64     def activate!
65       ::Ncurses.set_term(wrapee)
66       Terminal.current = self
67     end
68     
69     ##
70     # Simply calls `#activate!` if this `Terminal` isn't already active.
71     def activate
72       activate! unless active?
73     end
74     
75     ##
76     # Simply cheks if `Terminal.current == self`
77     def active?
78       Terminal.current == self
79     end
80     
81     ##
82     # Destroys the `wrapee` of this `Terminal`, and removes this `Terminal`
83     # from `Terminal.terminals`. See `endwin(3X)` and `delscreen(3X)`.
84     def destroy!
85       previous = Terminal.current
86       activate
87       ::Ncurses.endwin
88       ::Ncurses.delscreen(wrapee)
89       @wrapee = nil
90       Terminal.terminals.delete self
91       previous.activate if previous
92     end
93   end
94 end