Added `Terminal#activate` and `Terminal#active?`, as well as removing all terminal...
[nfoiled.git] / lib / nfoiled / terminal.rb
blobcff0a18de309496e721ca93000cabbb803fd5b63
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     ##
39     # Responsible for creating a new `Terminal`. See `newterm(3X)`.
40     def initialize opts = Hash.new
41       { :output => STDOUT, :input => STDIN }.merge opts
42       @output = opts[:output]
43       @input = opts[:input]
44       @term = opts[:term]
45       
46       @wrapee = ::Ncurses.newterm(opts[:term], opts[:out], opts[:in])
47       Terminal.current = self
48       Terminal.terminals << self
49       Nfoiled::initialize
50     end
51     
52     ##
53     # 'Activates' a `Terminal`, destroying all windows and environment from
54     # the current `Terminal` and replacing it with those of this one.
55     def activate!
56       ::Ncurses.set_term(@wrapee)
57       previous, Terminal.current = Terminal.current, self
58       return previous
59     end
60     
61     ##
62     # Simply calls `#activate!` if this `Terminal` isn't already active.
63     def activate
64       activate! unless active?
65     end
66     
67     ##
68     # Simply cheks if `Terminal.current == self`
69     def active?
70       Terminal.current == self
71     end
72     
73     ##
74     # Destroys the `wrapee` of this `Terminal`, and removes this `Terminal`
75     # from `Terminal.terminals`
76     def destroy!
77       old_term = activate
78       ::Ncurses.endwin
79       ::Ncurses.delscreen(@wrapee)
80       Terminal.terminals.delete self
81       @wrapee = nil
82       old_term.activate if old_term
83     end
84   end
85 end