cura-termbox 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +119 -0
- data/LICENSE +20 -0
- data/README.md +24 -0
- data/Rakefile +31 -0
- data/VERSION +1 -0
- data/cura-termbox.gemspec +24 -0
- data/lib/cura/termbox/adapter.rb +192 -0
- data/lib/cura/termbox/color_mapper.rb +377 -0
- data/lib/cura/termbox/component/base.rb +28 -0
- data/lib/cura/termbox/error/base.rb +11 -0
- data/lib/cura/termbox/error/failed_to_open_tty.rb +13 -0
- data/lib/cura/termbox/error/not_running.rb +13 -0
- data/lib/cura/termbox/error/pipe_trap_error.rb +13 -0
- data/lib/cura/termbox/error/unsupported_terminal.rb +13 -0
- data/lib/cura/termbox/pencil.rb +56 -0
- data/lib/cura/termbox/window.rb +22 -0
- metadata +88 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 472b032d744709d45da7575030194f28c5df1cfb
|
4
|
+
data.tar.gz: 015266ad33e99172f56361326c6649739ce67339
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 51013f0e83448fbaabf8ab11b2890b6c6e796f14ee46230d9649b962a77933294d6f66d5b06df187fb31145f85086af35f5ee7109cc05657227042d38ac019bf
|
7
|
+
data.tar.gz: 02b4c785e9e66087937f52686cdbd92b0a5907920609895ec02ffca925a80cc13b6de5f6a961bc985050fe8e2520fa75cec84043fa7153458bb87ba9213749a7
|
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem "fuubar", "~> 2.0.0"
|
5
|
+
gem "mutant-rspec", "~> 0.8.0"
|
6
|
+
gem "rake", "~> 10.4.2"
|
7
|
+
gem "reek", "~> 3.0.4"
|
8
|
+
gem "rspec", "~> 3.3.0"
|
9
|
+
gem "rubocop", "~> 0.32.1"
|
10
|
+
gem "ruby-prof", "~> 0.15.8"
|
11
|
+
gem "simplecov-json", "~> 0.2"
|
12
|
+
gem "simplecov", "~> 0.10.0"
|
13
|
+
gem "yard", "~> 0.8.7.6"
|
14
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
abstract_type (0.0.7)
|
5
|
+
adamantium (0.2.0)
|
6
|
+
ice_nine (~> 0.11.0)
|
7
|
+
memoizable (~> 0.4.0)
|
8
|
+
anima (0.2.0)
|
9
|
+
abstract_type (~> 0.0.7)
|
10
|
+
adamantium (~> 0.1)
|
11
|
+
equalizer (~> 0.0.8)
|
12
|
+
ast (2.0.0)
|
13
|
+
astrolabe (1.3.1)
|
14
|
+
parser (~> 2.2)
|
15
|
+
concord (0.1.5)
|
16
|
+
adamantium (~> 0.2.0)
|
17
|
+
equalizer (~> 0.0.9)
|
18
|
+
diff-lcs (1.2.5)
|
19
|
+
docile (1.1.5)
|
20
|
+
equalizer (0.0.11)
|
21
|
+
fuubar (2.0.0)
|
22
|
+
rspec (~> 3.0)
|
23
|
+
ruby-progressbar (~> 1.4)
|
24
|
+
ice_nine (0.11.1)
|
25
|
+
json (1.8.3)
|
26
|
+
memoizable (0.4.2)
|
27
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
28
|
+
morpher (0.2.3)
|
29
|
+
abstract_type (~> 0.0.7)
|
30
|
+
adamantium (~> 0.2.0)
|
31
|
+
anima (~> 0.2.0)
|
32
|
+
ast (~> 2.0.0)
|
33
|
+
concord (~> 0.1.4)
|
34
|
+
equalizer (~> 0.0.9)
|
35
|
+
ice_nine (~> 0.11.0)
|
36
|
+
procto (~> 0.0.2)
|
37
|
+
mutant (0.8.0)
|
38
|
+
abstract_type (~> 0.0.7)
|
39
|
+
adamantium (~> 0.2.0)
|
40
|
+
anima (~> 0.2.0)
|
41
|
+
ast (~> 2.0)
|
42
|
+
concord (~> 0.1.5)
|
43
|
+
diff-lcs (~> 1.2)
|
44
|
+
equalizer (~> 0.0.9)
|
45
|
+
ice_nine (~> 0.11.1)
|
46
|
+
memoizable (~> 0.4.2)
|
47
|
+
morpher (~> 0.2.3)
|
48
|
+
parallel (~> 1.3)
|
49
|
+
parser (~> 2.2.2)
|
50
|
+
procto (~> 0.0.2)
|
51
|
+
unparser (~> 0.2.4)
|
52
|
+
mutant-rspec (0.8.0)
|
53
|
+
mutant (~> 0.8.0)
|
54
|
+
rspec-core (>= 3.2.0, < 3.4.0)
|
55
|
+
parallel (1.6.0)
|
56
|
+
parser (2.2.2.6)
|
57
|
+
ast (>= 1.1, < 3.0)
|
58
|
+
powerpack (0.1.1)
|
59
|
+
procto (0.0.2)
|
60
|
+
rainbow (2.0.0)
|
61
|
+
rake (10.4.2)
|
62
|
+
reek (3.0.4)
|
63
|
+
parser (~> 2.2.2.5)
|
64
|
+
rainbow (~> 2.0)
|
65
|
+
unparser (~> 0.2.2)
|
66
|
+
rspec (3.3.0)
|
67
|
+
rspec-core (~> 3.3.0)
|
68
|
+
rspec-expectations (~> 3.3.0)
|
69
|
+
rspec-mocks (~> 3.3.0)
|
70
|
+
rspec-core (3.3.1)
|
71
|
+
rspec-support (~> 3.3.0)
|
72
|
+
rspec-expectations (3.3.0)
|
73
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
74
|
+
rspec-support (~> 3.3.0)
|
75
|
+
rspec-mocks (3.3.1)
|
76
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
77
|
+
rspec-support (~> 3.3.0)
|
78
|
+
rspec-support (3.3.0)
|
79
|
+
rubocop (0.32.1)
|
80
|
+
astrolabe (~> 1.3)
|
81
|
+
parser (>= 2.2.2.5, < 3.0)
|
82
|
+
powerpack (~> 0.1)
|
83
|
+
rainbow (>= 1.99.1, < 3.0)
|
84
|
+
ruby-progressbar (~> 1.4)
|
85
|
+
ruby-prof (0.15.8)
|
86
|
+
ruby-progressbar (1.7.5)
|
87
|
+
simplecov (0.10.0)
|
88
|
+
docile (~> 1.1.0)
|
89
|
+
json (~> 1.8)
|
90
|
+
simplecov-html (~> 0.10.0)
|
91
|
+
simplecov-html (0.10.0)
|
92
|
+
simplecov-json (0.2)
|
93
|
+
json
|
94
|
+
simplecov
|
95
|
+
thread_safe (0.3.5)
|
96
|
+
unparser (0.2.4)
|
97
|
+
abstract_type (~> 0.0.7)
|
98
|
+
adamantium (~> 0.2.0)
|
99
|
+
concord (~> 0.1.5)
|
100
|
+
diff-lcs (~> 1.2.5)
|
101
|
+
equalizer (~> 0.0.9)
|
102
|
+
parser (~> 2.2.2)
|
103
|
+
procto (~> 0.0.2)
|
104
|
+
yard (0.8.7.6)
|
105
|
+
|
106
|
+
PLATFORMS
|
107
|
+
ruby
|
108
|
+
|
109
|
+
DEPENDENCIES
|
110
|
+
fuubar (~> 2.0.0)
|
111
|
+
mutant-rspec (~> 0.8.0)
|
112
|
+
rake (~> 10.4.2)
|
113
|
+
reek (~> 3.0.4)
|
114
|
+
rspec (~> 3.3.0)
|
115
|
+
rubocop (~> 0.32.1)
|
116
|
+
ruby-prof (~> 0.15.8)
|
117
|
+
simplecov (~> 0.10.0)
|
118
|
+
simplecov-json (~> 0.2)
|
119
|
+
yard (~> 0.8.7.6)
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2015 Ryan Scott Lewis <ryan@rynet.us>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Cura Termbox FFI Adapter
|
2
|
+
|
3
|
+
[Cura][cura] adapter for [Termbox][termbox].
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
### Bundler: `gem 'cura-termbox'`
|
8
|
+
|
9
|
+
### RubyGems: `gem install cura-termbox`
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
TODO
|
14
|
+
|
15
|
+
TODO: Note that when using MRuby, the include/mrbconf.h should define MRB_UTF8_STRING
|
16
|
+
|
17
|
+
## Copyright
|
18
|
+
|
19
|
+
Copyright © 2015 Ryan Scott Lewis <ryan@rynet.us>.
|
20
|
+
|
21
|
+
The MIT License (MIT) - See LICENSE for further details.
|
22
|
+
|
23
|
+
[cura]: https://github.com/RyanScottLewis/cura
|
24
|
+
[termbox]: https://github.com/nsf/termbox
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "pathname"
|
2
|
+
require "rubygems/package_task"
|
3
|
+
require "yard"
|
4
|
+
require "rspec/core/rake_task"
|
5
|
+
require "rubocop/rake_task"
|
6
|
+
require "reek/rake/task"
|
7
|
+
|
8
|
+
gemspec = Pathname.glob(Pathname.new(__FILE__).join("..", "*.gemspec")).first
|
9
|
+
spec = Gem::Specification.load(gemspec.to_s)
|
10
|
+
|
11
|
+
Gem::PackageTask.new(spec) do |task|
|
12
|
+
task.need_zip = false
|
13
|
+
end
|
14
|
+
|
15
|
+
YARD::Rake::YardocTask.new
|
16
|
+
|
17
|
+
RSpec::Core::RakeTask.new(:spec)
|
18
|
+
|
19
|
+
RuboCop::RakeTask.new do |task|
|
20
|
+
task.patterns = ["lib/**/*.rb"]
|
21
|
+
task.formatters = ["fuubar"]
|
22
|
+
end
|
23
|
+
|
24
|
+
Reek::Rake::Task.new do |t|
|
25
|
+
t.fail_on_error = false
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Mutation testing"
|
29
|
+
task :mutant do
|
30
|
+
exec("mutant --include lib --require cura --use rspec Cura*")
|
31
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
|
5
|
+
# Variables
|
6
|
+
s.author = 'Ryan Scott Lewis'
|
7
|
+
s.email = 'ryan@rynet.us'
|
8
|
+
s.summary = 'Cura Termbox adapter.'
|
9
|
+
s.license = 'MIT'
|
10
|
+
|
11
|
+
# Dependencies
|
12
|
+
s.add_dependency 'termbox-ffi', '~> 0.0.3'
|
13
|
+
s.add_development_dependency 'rake', '~> 10.1.1'
|
14
|
+
|
15
|
+
# Pragmatically set variables
|
16
|
+
s.homepage = "http://github.com/RyanScottLewis/#{s.name}"
|
17
|
+
s.version = Pathname.glob('VERSION*').first.read rescue '0.0.0'
|
18
|
+
s.description = s.summary
|
19
|
+
s.name = Pathname.new(__FILE__).basename('.gemspec').to_s
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
s.files = Dir['{{Rake,Gem}file{.lock,},README*,VERSION,LICENSE,*.gemspec,{lib,bin,spec}/**/*.rb}']
|
22
|
+
s.test_files = Dir['{examples,spec,test}/**/*']
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
if Kernel.respond_to?(:require)
|
2
|
+
require "cura/adapter"
|
3
|
+
|
4
|
+
require "cura/event/key_down"
|
5
|
+
require "cura/event/mouse_button"
|
6
|
+
require "cura/event/mouse_wheel_down"
|
7
|
+
require "cura/event/mouse_wheel_up"
|
8
|
+
require "cura/event/resize"
|
9
|
+
|
10
|
+
require "cura/termbox/error/unsupported_terminal"
|
11
|
+
require "cura/termbox/error/failed_to_open_tty"
|
12
|
+
require "cura/termbox/error/pipe_trap_error"
|
13
|
+
require "cura/termbox/error/not_running"
|
14
|
+
|
15
|
+
require "cura/termbox/component/base"
|
16
|
+
|
17
|
+
require "cura/termbox/pencil"
|
18
|
+
require "cura/termbox/window"
|
19
|
+
|
20
|
+
require "termbox"
|
21
|
+
end
|
22
|
+
|
23
|
+
module Cura
|
24
|
+
module Termbox
|
25
|
+
# Cura adapter for Termbox.
|
26
|
+
class Adapter < Cura::Adapter
|
27
|
+
mixin Cura::Pencil => Termbox::Pencil
|
28
|
+
mixin Cura::Window => Termbox::Window
|
29
|
+
mixin Cura::Component::Base => Termbox::Component::Base
|
30
|
+
|
31
|
+
def setup
|
32
|
+
case ::Termbox.tb_init
|
33
|
+
when ::Termbox::TB_EUNSUPPORTED_TERMINAL then raise Termbox::Error::UnsupportedTerminal
|
34
|
+
when ::Termbox::TB_EFAILED_TO_OPEN_TTY then raise Termbox::Error::FailedToOpenTTY
|
35
|
+
when ::Termbox::TB_EPIPE_TRAP_ERROR then raise Termbox::Error::PipeTrapError
|
36
|
+
end
|
37
|
+
|
38
|
+
::Termbox.tb_select_input_mode(::Termbox::TB_INPUT_ESC | ::Termbox::TB_INPUT_MOUSE)
|
39
|
+
# ::Termbox.tb_select_output_mode(::Termbox::TB_OUTPUT_216)
|
40
|
+
::Termbox.tb_select_output_mode(::Termbox::TB_OUTPUT_256)
|
41
|
+
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
def clear
|
46
|
+
::Termbox.tb_clear
|
47
|
+
end
|
48
|
+
|
49
|
+
def present
|
50
|
+
::Termbox.tb_present
|
51
|
+
end
|
52
|
+
|
53
|
+
def cleanup
|
54
|
+
::Termbox.tb_shutdown
|
55
|
+
|
56
|
+
super
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_cursor(x, y)
|
60
|
+
::Termbox.tb_set_cursor(x, y)
|
61
|
+
end
|
62
|
+
|
63
|
+
def hide_cursor
|
64
|
+
::Termbox.tb_set_cursor(::Termbox::TB_HIDE_CURSOR, ::Termbox::TB_HIDE_CURSOR)
|
65
|
+
end
|
66
|
+
|
67
|
+
def poll_event
|
68
|
+
event = ::Termbox::Event.new
|
69
|
+
::Termbox.tb_poll_event(event)
|
70
|
+
|
71
|
+
convert_termbox_event_to_cura_event(event)
|
72
|
+
end
|
73
|
+
|
74
|
+
def peek_event(milliseconds)
|
75
|
+
event = ::Termbox::Event.new
|
76
|
+
::Termbox.tb_peek_event(event, milliseconds)
|
77
|
+
|
78
|
+
convert_termbox_event_to_cura_event(event)
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
|
83
|
+
def convert_termbox_event_to_cura_event(event)
|
84
|
+
return nil if event.nil? # TODO: Would it even be nil? Wouldnt it be -1 on errors?
|
85
|
+
|
86
|
+
event = case event[:type]
|
87
|
+
when ::Termbox::TB_EVENT_KEY
|
88
|
+
if event[:key] != 0
|
89
|
+
name = convert_termbox_key_to_cura_key_name(event[:key])
|
90
|
+
|
91
|
+
name.nil? ? convert_termbox_control_key_to_cura_event(event[:key]) : Event::KeyDown.new(name: name)
|
92
|
+
elsif event[:ch] != 0
|
93
|
+
character = event[:ch].chr
|
94
|
+
key_name = Cura::Key.name_from_character(character)
|
95
|
+
|
96
|
+
Event::KeyDown.new(name: key_name)
|
97
|
+
end
|
98
|
+
when ::Termbox::TB_EVENT_MOUSE
|
99
|
+
case event[:key]
|
100
|
+
when ::Termbox::TB_KEY_MOUSE_LEFT then Event::MouseButton.new(name: :left, state: :down, x: event[:x], y: event[:y])
|
101
|
+
when ::Termbox::TB_KEY_MOUSE_MIDDLE then Event::MouseButton.new(name: :middle, state: :down, x: event[:x], y: event[:y])
|
102
|
+
when ::Termbox::TB_KEY_MOUSE_RIGHT then Event::MouseButton.new(name: :right, state: :down, x: event[:x], y: event[:y])
|
103
|
+
when ::Termbox::TB_KEY_MOUSE_RELEASE then Event::MouseButton.new(state: :up, x: event[:x], y: event[:y])
|
104
|
+
when ::Termbox::TB_KEY_MOUSE_WHEEL_UP then Event::MouseWheelUp.new(x: event[:x], y: event[:y])
|
105
|
+
when ::Termbox::TB_KEY_MOUSE_WHEEL_DOWN then Event::MouseWheelDown.new(x: event[:x], y: event[:y])
|
106
|
+
end
|
107
|
+
when ::Termbox::TB_EVENT_RESIZE then Event::Resize.new(width: event[:w], height: event[:h])
|
108
|
+
end
|
109
|
+
|
110
|
+
event
|
111
|
+
end
|
112
|
+
|
113
|
+
def convert_termbox_control_key_to_cura_event(key)
|
114
|
+
case key
|
115
|
+
# when ::Termbox::TB_KEY_CTRL_2 then Event::KeyDown.new( name: :"2", control: true ) # clash with 'CTRL_TILDE'
|
116
|
+
# when ::Termbox::TB_KEY_CTRL_3 then Event::KeyDown.new( name: :"3", control: true ) # clash with 'ESC'
|
117
|
+
# when ::Termbox::TB_KEY_CTRL_4 then Event::KeyDown.new( name: :"4", control: true ) # clash with 'CTRL_BACKSLASH'
|
118
|
+
# when ::Termbox::TB_KEY_CTRL_5 then Event::KeyDown.new( name: :"5", control: true ) # clash with 'CTRL_RSQ_BRACKET'
|
119
|
+
when ::Termbox::TB_KEY_CTRL_6 then Event::KeyDown.new(name: :"6", control: true)
|
120
|
+
# when ::Termbox::TB_KEY_CTRL_7 then Event::KeyDown.new( name: :"7", control: true ) # clash with 'CTRL_SLASH' # clash with 'CTRL_UNDERSCORE'
|
121
|
+
# when ::Termbox::TB_KEY_CTRL_8 then Event::KeyDown.new( name: :"8", control: true ) # clash with 'TB_KEY_BACKSPACE2'
|
122
|
+
when ::Termbox::TB_KEY_CTRL_A then Event::KeyDown.new(name: :A, control: true)
|
123
|
+
when ::Termbox::TB_KEY_CTRL_B then Event::KeyDown.new(name: :B, control: true)
|
124
|
+
when ::Termbox::TB_KEY_CTRL_C then Event::KeyDown.new(name: :C, control: true)
|
125
|
+
when ::Termbox::TB_KEY_CTRL_D then Event::KeyDown.new(name: :D, control: true)
|
126
|
+
when ::Termbox::TB_KEY_CTRL_E then Event::KeyDown.new(name: :E, control: true)
|
127
|
+
when ::Termbox::TB_KEY_CTRL_F then Event::KeyDown.new(name: :F, control: true)
|
128
|
+
when ::Termbox::TB_KEY_CTRL_G then Event::KeyDown.new(name: :G, control: true)
|
129
|
+
# when ::Termbox::TB_KEY_CTRL_H then Event::KeyDown.new( name: :H, control: true ) # clash with 'CTRL_BACKSPACE'
|
130
|
+
# when ::Termbox::TB_KEY_CTRL_I then Event::KeyDown.new( name: :I, control: true ) # clash with 'TAB'
|
131
|
+
when ::Termbox::TB_KEY_CTRL_J then Event::KeyDown.new(name: :J, control: true)
|
132
|
+
when ::Termbox::TB_KEY_CTRL_K then Event::KeyDown.new(name: :K, control: true)
|
133
|
+
when ::Termbox::TB_KEY_CTRL_L then Event::KeyDown.new(name: :L, control: true)
|
134
|
+
# when ::Termbox::TB_KEY_CTRL_M then Event::KeyDown.new( name: :M, control: true ) # clash with 'ENTER'
|
135
|
+
when ::Termbox::TB_KEY_CTRL_N then Event::KeyDown.new(name: :N, control: true)
|
136
|
+
when ::Termbox::TB_KEY_CTRL_O then Event::KeyDown.new(name: :O, control: true)
|
137
|
+
when ::Termbox::TB_KEY_CTRL_P then Event::KeyDown.new(name: :P, control: true)
|
138
|
+
when ::Termbox::TB_KEY_CTRL_Q then Event::KeyDown.new(name: :Q, control: true)
|
139
|
+
when ::Termbox::TB_KEY_CTRL_R then Event::KeyDown.new(name: :R, control: true)
|
140
|
+
when ::Termbox::TB_KEY_CTRL_S then Event::KeyDown.new(name: :S, control: true)
|
141
|
+
when ::Termbox::TB_KEY_CTRL_T then Event::KeyDown.new(name: :T, control: true)
|
142
|
+
when ::Termbox::TB_KEY_CTRL_U then Event::KeyDown.new(name: :U, control: true)
|
143
|
+
when ::Termbox::TB_KEY_CTRL_V then Event::KeyDown.new(name: :V, control: true)
|
144
|
+
when ::Termbox::TB_KEY_CTRL_W then Event::KeyDown.new(name: :W, control: true)
|
145
|
+
when ::Termbox::TB_KEY_CTRL_X then Event::KeyDown.new(name: :X, control: true)
|
146
|
+
when ::Termbox::TB_KEY_CTRL_Y then Event::KeyDown.new(name: :Y, control: true)
|
147
|
+
when ::Termbox::TB_KEY_CTRL_Z then Event::KeyDown.new(name: :Z, control: true)
|
148
|
+
when ::Termbox::TB_KEY_CTRL_BACKSLASH then Event::KeyDown.new(name: :backslash, control: true) # clash with 'CTRL_4'
|
149
|
+
when ::Termbox::TB_KEY_CTRL_LSQ_BRACKET then Event::KeyDown.new(name: :left_bracket, control: true) # clash with 'ESC'
|
150
|
+
when ::Termbox::TB_KEY_CTRL_RSQ_BRACKET then Event::KeyDown.new(name: :right_bracket, control: true) # clash with 'CTRL_5'
|
151
|
+
when ::Termbox::TB_KEY_CTRL_SLASH then Event::KeyDown.new(name: :slash, control: true) # clash with 'CTRL_7'
|
152
|
+
when ::Termbox::TB_KEY_CTRL_TILDE then Event::KeyDown.new(name: :tilde, control: true) # clash with 'CTRL_2'
|
153
|
+
when ::Termbox::TB_KEY_CTRL_UNDERSCORE then Event::KeyDown.new(name: :underscore, control: true) # clash with 'CTRL_7' # clash with 'CTRL_SLASH'
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def convert_termbox_key_to_cura_key_name(key)
|
158
|
+
case key
|
159
|
+
when ::Termbox::TB_KEY_F1 then :f1
|
160
|
+
when ::Termbox::TB_KEY_F2 then :f2
|
161
|
+
when ::Termbox::TB_KEY_F3 then :f3
|
162
|
+
when ::Termbox::TB_KEY_F4 then :f4
|
163
|
+
when ::Termbox::TB_KEY_F5 then :f5
|
164
|
+
when ::Termbox::TB_KEY_F6 then :f6
|
165
|
+
when ::Termbox::TB_KEY_F7 then :f7
|
166
|
+
when ::Termbox::TB_KEY_F8 then :f8
|
167
|
+
when ::Termbox::TB_KEY_F9 then :f9
|
168
|
+
when ::Termbox::TB_KEY_F10 then :f10
|
169
|
+
when ::Termbox::TB_KEY_F11 then :f11
|
170
|
+
when ::Termbox::TB_KEY_F12 then :f12
|
171
|
+
when ::Termbox::TB_KEY_F12 then :f12
|
172
|
+
when ::Termbox::TB_KEY_INSERT then :insert
|
173
|
+
when ::Termbox::TB_KEY_DELETE then :delete
|
174
|
+
when ::Termbox::TB_KEY_HOME then :home
|
175
|
+
when ::Termbox::TB_KEY_END then :end
|
176
|
+
when ::Termbox::TB_KEY_PGUP then :page_up
|
177
|
+
when ::Termbox::TB_KEY_PGDN then :page_down
|
178
|
+
when ::Termbox::TB_KEY_ARROW_UP then :up
|
179
|
+
when ::Termbox::TB_KEY_ARROW_DOWN then :down
|
180
|
+
when ::Termbox::TB_KEY_ARROW_LEFT then :left
|
181
|
+
when ::Termbox::TB_KEY_ARROW_RIGHT then :right
|
182
|
+
when ::Termbox::TB_KEY_BACKSPACE then :backspace
|
183
|
+
when ::Termbox::TB_KEY_BACKSPACE2 then :backspace
|
184
|
+
when ::Termbox::TB_KEY_ENTER then :enter
|
185
|
+
when ::Termbox::TB_KEY_ESC then :escape
|
186
|
+
when ::Termbox::TB_KEY_SPACE then :space
|
187
|
+
when ::Termbox::TB_KEY_TAB then :tab
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
@@ -0,0 +1,377 @@
|
|
1
|
+
# /* Colors (see struct tb_cell's fg and bg fields). */
|
2
|
+
# #define TB_DEFAULT 0x00
|
3
|
+
# #define TB_BLACK 0x01
|
4
|
+
# #define TB_RED 0x02
|
5
|
+
# #define TB_GREEN 0x03
|
6
|
+
# #define TB_YELLOW 0x04
|
7
|
+
# #define TB_BLUE 0x05
|
8
|
+
# #define TB_MAGENTA 0x06
|
9
|
+
# #define TB_CYAN 0x07
|
10
|
+
# #define TB_WHITE 0x08
|
11
|
+
#
|
12
|
+
# /* Attributes, it is possible to use multiple attributes by combining them
|
13
|
+
# * using bitwise OR ('|'). Although, colors cannot be combined. But you can
|
14
|
+
# * combine attributes and a single color. See also struct tb_cell's fg and bg
|
15
|
+
# * fields.
|
16
|
+
# */
|
17
|
+
# #define TB_BOLD 0x0100
|
18
|
+
# #define TB_UNDERLINE 0x0200
|
19
|
+
# #define TB_REVERSE 0x0400
|
20
|
+
#
|
21
|
+
# #define TB_OUTPUT_CURRENT 0
|
22
|
+
# #define TB_OUTPUT_NORMAL 1
|
23
|
+
# #define TB_OUTPUT_256 2
|
24
|
+
# #define TB_OUTPUT_216 3
|
25
|
+
# #define TB_OUTPUT_GRAYSCALE 4
|
26
|
+
#
|
27
|
+
# /* Sets the termbox output mode. Termbox has three output options:
|
28
|
+
# * 1. TB_OUTPUT_NORMAL => [1..8]
|
29
|
+
# * This mode provides 8 different colors:
|
30
|
+
# * black, red, green, yellow, blue, magenta, cyan, white
|
31
|
+
# * Shortcut: TB_BLACK, TB_RED, ...
|
32
|
+
# * Attributes: TB_BOLD, TB_UNDERLINE, TB_REVERSE
|
33
|
+
# *
|
34
|
+
# * Example usage:
|
35
|
+
# * tb_change_cell(x, y, '@', TB_BLACK | TB_BOLD, TB_RED);
|
36
|
+
# *
|
37
|
+
# * 2. TB_OUTPUT_256 => [0..256]
|
38
|
+
# * In this mode you can leverage the 256 terminal mode:
|
39
|
+
# * 0x00 - 0x07: the 8 colors as in TB_OUTPUT_NORMAL
|
40
|
+
# * 0x08 - 0x0f: TB_* | TB_BOLD
|
41
|
+
# * 0x10 - 0xe7: 216 different colors
|
42
|
+
# * 0xe8 - 0xff: 24 different shades of grey
|
43
|
+
# *
|
44
|
+
# * Example usage:
|
45
|
+
# * tb_change_cell(x, y, '@', 184, 240);
|
46
|
+
# * tb_change_cell(x, y, '@', 0xb8, 0xf0);
|
47
|
+
# *
|
48
|
+
# * 2. TB_OUTPUT_216 => [0..216]
|
49
|
+
# * This mode supports the 3rd range of the 256 mode only.
|
50
|
+
# * But you don't need to provide an offset.
|
51
|
+
# *
|
52
|
+
# * 3. TB_OUTPUT_GRAYSCALE => [0..23]
|
53
|
+
# * This mode supports the 4th range of the 256 mode only.
|
54
|
+
# * But you dont need to provide an offset.
|
55
|
+
# *
|
56
|
+
# * Execute build/src/demo/output to see its impact on your terminal.
|
57
|
+
# *
|
58
|
+
# * If 'mode' is TB_OUTPUT_CURRENT, it returns the current output mode.
|
59
|
+
# *
|
60
|
+
# * Default termbox output mode is TB_OUTPUT_NORMAL.
|
61
|
+
# */
|
62
|
+
# SO_IMPORT int tb_select_output_mode(int mode);
|
63
|
+
|
64
|
+
if Kernel.respond_to?(:require)
|
65
|
+
require "termbox"
|
66
|
+
require "cura/color"
|
67
|
+
end
|
68
|
+
|
69
|
+
module Cura
|
70
|
+
module Termbox
|
71
|
+
# A cached map comparing a color's rgb values with the 256 terminal color codes.
|
72
|
+
module ColorMapper
|
73
|
+
COLOR_CODES = [
|
74
|
+
Color.new(0, 0, 0),
|
75
|
+
Color.new(128, 0, 0),
|
76
|
+
Color.new(0, 128, 0),
|
77
|
+
Color.new(128, 128, 0),
|
78
|
+
Color.new(0, 0, 128),
|
79
|
+
Color.new(128, 0, 128),
|
80
|
+
Color.new(0, 128, 128),
|
81
|
+
Color.new(192, 192, 192),
|
82
|
+
Color.new(128, 128, 128),
|
83
|
+
Color.new(255, 0, 0),
|
84
|
+
Color.new(0, 255, 0),
|
85
|
+
Color.new(255, 255, 0),
|
86
|
+
Color.new(0, 0, 255),
|
87
|
+
Color.new(255, 0, 255),
|
88
|
+
Color.new(0, 255, 255),
|
89
|
+
Color.new(255, 255, 255),
|
90
|
+
Color.new(0, 0, 0),
|
91
|
+
Color.new(0, 0, 95),
|
92
|
+
Color.new(0, 0, 135),
|
93
|
+
Color.new(0, 0, 175),
|
94
|
+
Color.new(0, 0, 215),
|
95
|
+
Color.new(0, 0, 255),
|
96
|
+
Color.new(0, 95, 0),
|
97
|
+
Color.new(0, 95, 95),
|
98
|
+
Color.new(0, 95, 135),
|
99
|
+
Color.new(0, 95, 175),
|
100
|
+
Color.new(0, 95, 215),
|
101
|
+
Color.new(0, 95, 255),
|
102
|
+
Color.new(0, 135, 0),
|
103
|
+
Color.new(0, 135, 95),
|
104
|
+
Color.new(0, 135, 135),
|
105
|
+
Color.new(0, 135, 175),
|
106
|
+
Color.new(0, 135, 215),
|
107
|
+
Color.new(0, 135, 255),
|
108
|
+
Color.new(0, 175, 0),
|
109
|
+
Color.new(0, 175, 95),
|
110
|
+
Color.new(0, 175, 135),
|
111
|
+
Color.new(0, 175, 175),
|
112
|
+
Color.new(0, 175, 215),
|
113
|
+
Color.new(0, 175, 255),
|
114
|
+
Color.new(0, 215, 0),
|
115
|
+
Color.new(0, 215, 95),
|
116
|
+
Color.new(0, 215, 135),
|
117
|
+
Color.new(0, 215, 175),
|
118
|
+
Color.new(0, 215, 215),
|
119
|
+
Color.new(0, 215, 255),
|
120
|
+
Color.new(0, 255, 0),
|
121
|
+
Color.new(0, 255, 95),
|
122
|
+
Color.new(0, 255, 135),
|
123
|
+
Color.new(0, 255, 175),
|
124
|
+
Color.new(0, 255, 215),
|
125
|
+
Color.new(0, 255, 255),
|
126
|
+
Color.new(95, 0, 0),
|
127
|
+
Color.new(95, 0, 95),
|
128
|
+
Color.new(95, 0, 135),
|
129
|
+
Color.new(95, 0, 175),
|
130
|
+
Color.new(95, 0, 215),
|
131
|
+
Color.new(95, 0, 255),
|
132
|
+
Color.new(95, 95, 0),
|
133
|
+
Color.new(95, 95, 95),
|
134
|
+
Color.new(95, 95, 135),
|
135
|
+
Color.new(95, 95, 175),
|
136
|
+
Color.new(95, 95, 215),
|
137
|
+
Color.new(95, 95, 255),
|
138
|
+
Color.new(95, 135, 0),
|
139
|
+
Color.new(95, 135, 95),
|
140
|
+
Color.new(95, 135, 135),
|
141
|
+
Color.new(95, 135, 175),
|
142
|
+
Color.new(95, 135, 215),
|
143
|
+
Color.new(95, 135, 255),
|
144
|
+
Color.new(95, 175, 0),
|
145
|
+
Color.new(95, 175, 95),
|
146
|
+
Color.new(95, 175, 135),
|
147
|
+
Color.new(95, 175, 175),
|
148
|
+
Color.new(95, 175, 215),
|
149
|
+
Color.new(95, 175, 255),
|
150
|
+
Color.new(95, 215, 0),
|
151
|
+
Color.new(95, 215, 95),
|
152
|
+
Color.new(95, 215, 135),
|
153
|
+
Color.new(95, 215, 175),
|
154
|
+
Color.new(95, 215, 215),
|
155
|
+
Color.new(95, 215, 255),
|
156
|
+
Color.new(95, 255, 0),
|
157
|
+
Color.new(95, 255, 95),
|
158
|
+
Color.new(95, 255, 135),
|
159
|
+
Color.new(95, 255, 175),
|
160
|
+
Color.new(95, 255, 215),
|
161
|
+
Color.new(95, 255, 255),
|
162
|
+
Color.new(135, 0, 0),
|
163
|
+
Color.new(135, 0, 95),
|
164
|
+
Color.new(135, 0, 135),
|
165
|
+
Color.new(135, 0, 175),
|
166
|
+
Color.new(135, 0, 215),
|
167
|
+
Color.new(135, 0, 255),
|
168
|
+
Color.new(135, 95, 0),
|
169
|
+
Color.new(135, 95, 95),
|
170
|
+
Color.new(135, 95, 135),
|
171
|
+
Color.new(135, 95, 175),
|
172
|
+
Color.new(135, 95, 215),
|
173
|
+
Color.new(135, 95, 255),
|
174
|
+
Color.new(135, 135, 0),
|
175
|
+
Color.new(135, 135, 95),
|
176
|
+
Color.new(135, 135, 135),
|
177
|
+
Color.new(135, 135, 175),
|
178
|
+
Color.new(135, 135, 215),
|
179
|
+
Color.new(135, 135, 255),
|
180
|
+
Color.new(135, 175, 0),
|
181
|
+
Color.new(135, 175, 95),
|
182
|
+
Color.new(135, 175, 135),
|
183
|
+
Color.new(135, 175, 175),
|
184
|
+
Color.new(135, 175, 215),
|
185
|
+
Color.new(135, 175, 255),
|
186
|
+
Color.new(135, 215, 0),
|
187
|
+
Color.new(135, 215, 95),
|
188
|
+
Color.new(135, 215, 135),
|
189
|
+
Color.new(135, 215, 175),
|
190
|
+
Color.new(135, 215, 215),
|
191
|
+
Color.new(135, 215, 255),
|
192
|
+
Color.new(135, 255, 0),
|
193
|
+
Color.new(135, 255, 95),
|
194
|
+
Color.new(135, 255, 135),
|
195
|
+
Color.new(135, 255, 175),
|
196
|
+
Color.new(135, 255, 215),
|
197
|
+
Color.new(135, 255, 255),
|
198
|
+
Color.new(175, 0, 0),
|
199
|
+
Color.new(175, 0, 95),
|
200
|
+
Color.new(175, 0, 135),
|
201
|
+
Color.new(175, 0, 175),
|
202
|
+
Color.new(175, 0, 215),
|
203
|
+
Color.new(175, 0, 255),
|
204
|
+
Color.new(175, 95, 0),
|
205
|
+
Color.new(175, 95, 95),
|
206
|
+
Color.new(175, 95, 135),
|
207
|
+
Color.new(175, 95, 175),
|
208
|
+
Color.new(175, 95, 215),
|
209
|
+
Color.new(175, 95, 255),
|
210
|
+
Color.new(175, 135, 0),
|
211
|
+
Color.new(175, 135, 95),
|
212
|
+
Color.new(175, 135, 135),
|
213
|
+
Color.new(175, 135, 175),
|
214
|
+
Color.new(175, 135, 215),
|
215
|
+
Color.new(175, 135, 255),
|
216
|
+
Color.new(175, 175, 0),
|
217
|
+
Color.new(175, 175, 95),
|
218
|
+
Color.new(175, 175, 135),
|
219
|
+
Color.new(175, 175, 175),
|
220
|
+
Color.new(175, 175, 215),
|
221
|
+
Color.new(175, 175, 255),
|
222
|
+
Color.new(175, 215, 0),
|
223
|
+
Color.new(175, 215, 95),
|
224
|
+
Color.new(175, 215, 135),
|
225
|
+
Color.new(175, 215, 175),
|
226
|
+
Color.new(175, 215, 215),
|
227
|
+
Color.new(175, 215, 255),
|
228
|
+
Color.new(175, 255, 0),
|
229
|
+
Color.new(175, 255, 95),
|
230
|
+
Color.new(175, 255, 135),
|
231
|
+
Color.new(175, 255, 175),
|
232
|
+
Color.new(175, 255, 215),
|
233
|
+
Color.new(175, 255, 255),
|
234
|
+
Color.new(215, 0, 0),
|
235
|
+
Color.new(215, 0, 95),
|
236
|
+
Color.new(215, 0, 135),
|
237
|
+
Color.new(215, 0, 175),
|
238
|
+
Color.new(215, 0, 215),
|
239
|
+
Color.new(215, 0, 255),
|
240
|
+
Color.new(215, 95, 0),
|
241
|
+
Color.new(215, 95, 95),
|
242
|
+
Color.new(215, 95, 135),
|
243
|
+
Color.new(215, 95, 175),
|
244
|
+
Color.new(215, 95, 215),
|
245
|
+
Color.new(215, 95, 255),
|
246
|
+
Color.new(215, 135, 0),
|
247
|
+
Color.new(215, 135, 95),
|
248
|
+
Color.new(215, 135, 135),
|
249
|
+
Color.new(215, 135, 175),
|
250
|
+
Color.new(215, 135, 215),
|
251
|
+
Color.new(215, 135, 255),
|
252
|
+
Color.new(215, 175, 0),
|
253
|
+
Color.new(215, 175, 95),
|
254
|
+
Color.new(215, 175, 135),
|
255
|
+
Color.new(215, 175, 175),
|
256
|
+
Color.new(215, 175, 215),
|
257
|
+
Color.new(215, 175, 255),
|
258
|
+
Color.new(215, 215, 0),
|
259
|
+
Color.new(215, 215, 95),
|
260
|
+
Color.new(215, 215, 135),
|
261
|
+
Color.new(215, 215, 175),
|
262
|
+
Color.new(215, 215, 215),
|
263
|
+
Color.new(215, 215, 255),
|
264
|
+
Color.new(215, 255, 0),
|
265
|
+
Color.new(215, 255, 95),
|
266
|
+
Color.new(215, 255, 135),
|
267
|
+
Color.new(215, 255, 175),
|
268
|
+
Color.new(215, 255, 215),
|
269
|
+
Color.new(215, 255, 255),
|
270
|
+
Color.new(255, 0, 0),
|
271
|
+
Color.new(255, 0, 95),
|
272
|
+
Color.new(255, 0, 135),
|
273
|
+
Color.new(255, 0, 175),
|
274
|
+
Color.new(255, 0, 215),
|
275
|
+
Color.new(255, 0, 255),
|
276
|
+
Color.new(255, 95, 0),
|
277
|
+
Color.new(255, 95, 95),
|
278
|
+
Color.new(255, 95, 135),
|
279
|
+
Color.new(255, 95, 175),
|
280
|
+
Color.new(255, 95, 215),
|
281
|
+
Color.new(255, 95, 255),
|
282
|
+
Color.new(255, 135, 0),
|
283
|
+
Color.new(255, 135, 95),
|
284
|
+
Color.new(255, 135, 135),
|
285
|
+
Color.new(255, 135, 175),
|
286
|
+
Color.new(255, 135, 215),
|
287
|
+
Color.new(255, 135, 255),
|
288
|
+
Color.new(255, 175, 0),
|
289
|
+
Color.new(255, 175, 95),
|
290
|
+
Color.new(255, 175, 135),
|
291
|
+
Color.new(255, 175, 175),
|
292
|
+
Color.new(255, 175, 215),
|
293
|
+
Color.new(255, 175, 255),
|
294
|
+
Color.new(255, 215, 0),
|
295
|
+
Color.new(255, 215, 95),
|
296
|
+
Color.new(255, 215, 135),
|
297
|
+
Color.new(255, 215, 175),
|
298
|
+
Color.new(255, 215, 215),
|
299
|
+
Color.new(255, 215, 255),
|
300
|
+
Color.new(255, 255, 0),
|
301
|
+
Color.new(255, 255, 95),
|
302
|
+
Color.new(255, 255, 135),
|
303
|
+
Color.new(255, 255, 175),
|
304
|
+
Color.new(255, 255, 215),
|
305
|
+
Color.new(255, 255, 255),
|
306
|
+
Color.new(8, 8, 8),
|
307
|
+
Color.new(18, 18, 18),
|
308
|
+
Color.new(28, 28, 28),
|
309
|
+
Color.new(38, 38, 38),
|
310
|
+
Color.new(48, 48, 48),
|
311
|
+
Color.new(58, 58, 58),
|
312
|
+
Color.new(68, 68, 68),
|
313
|
+
Color.new(78, 78, 78),
|
314
|
+
Color.new(88, 88, 88),
|
315
|
+
Color.new(96, 96, 96),
|
316
|
+
Color.new(102, 102, 102),
|
317
|
+
Color.new(118, 118, 118),
|
318
|
+
Color.new(128, 128, 128),
|
319
|
+
Color.new(138, 138, 138),
|
320
|
+
Color.new(148, 148, 148),
|
321
|
+
Color.new(158, 158, 158),
|
322
|
+
Color.new(168, 168, 168),
|
323
|
+
Color.new(178, 178, 178),
|
324
|
+
Color.new(188, 188, 188),
|
325
|
+
Color.new(198, 198, 198),
|
326
|
+
Color.new(208, 208, 208),
|
327
|
+
Color.new(218, 218, 218),
|
328
|
+
Color.new(228, 228, 228),
|
329
|
+
Color.new(238, 238, 238)
|
330
|
+
]
|
331
|
+
|
332
|
+
CACHE = {}
|
333
|
+
|
334
|
+
class << self
|
335
|
+
# Find the closest terminal color code from the given RGB values.
|
336
|
+
#
|
337
|
+
# @param [#to_i] number_of_colors The number of colors in the code list to search. 9 is Termbox without 256 colors enabled I.E. 3-bit.
|
338
|
+
# @return [Integer]
|
339
|
+
def code(color, _number_of_colors=256)
|
340
|
+
code = CACHE[color.hex]
|
341
|
+
|
342
|
+
if code.nil?
|
343
|
+
# code = find_closest_code(rgb, number_of_colors)
|
344
|
+
|
345
|
+
distances = COLOR_CODES.map { |code| code - color }
|
346
|
+
code = distances.each_with_index.min[1]
|
347
|
+
|
348
|
+
CACHE[color.hex] = code
|
349
|
+
end
|
350
|
+
|
351
|
+
code
|
352
|
+
end
|
353
|
+
|
354
|
+
protected
|
355
|
+
|
356
|
+
def find_closest_code(rgb, number_of_colors=256)
|
357
|
+
last = nil
|
358
|
+
COLOR_CODES.first(number_of_colors).each_with_index do |color, code|
|
359
|
+
difference = compare_rgb_array(rgb, color)
|
360
|
+
|
361
|
+
last = { difference: difference, code: code } if last.nil? || difference < last[:difference]
|
362
|
+
end
|
363
|
+
|
364
|
+
last.nil? ? nil : last[:code]
|
365
|
+
end
|
366
|
+
|
367
|
+
def compare_rgb_array(a1, a2)
|
368
|
+
Math.sqrt(
|
369
|
+
(a1[0] - a2[0]).abs ^ 2 +
|
370
|
+
(a1[1] - a2[1]).abs ^ 2 +
|
371
|
+
(a1[2] - a2[2]).abs ^ 2
|
372
|
+
)
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Cura
|
2
|
+
module Termbox
|
3
|
+
module Component
|
4
|
+
module Base
|
5
|
+
def self.included(base)
|
6
|
+
base.instance_eval do
|
7
|
+
remove_method(:foreground)
|
8
|
+
remove_method(:background)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Get the foreground color of this component.
|
13
|
+
#
|
14
|
+
# @return [Color]
|
15
|
+
def foreground
|
16
|
+
get_or_inherit_color(:foreground, Cura::Color.white)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get the background color of this component.
|
20
|
+
#
|
21
|
+
# @return [Color]
|
22
|
+
def background
|
23
|
+
get_or_inherit_color(:background, Cura::Color.black)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "cura/termbox/color_mapper" if Kernel.respond_to?(:require)
|
2
|
+
|
3
|
+
module Cura
|
4
|
+
module Termbox
|
5
|
+
# TODO: terminal_code(9) should be 9 or 256 depending on the termbox configuration
|
6
|
+
module Pencil
|
7
|
+
# Change a point relative to this component's coordinates.
|
8
|
+
def draw_point(x, y, color=Cura::Color.black)
|
9
|
+
x = x.to_i
|
10
|
+
y = y.to_i
|
11
|
+
color = ColorMapper.code(color, 256) if color.is_a?(Color)
|
12
|
+
|
13
|
+
::Termbox.tb_change_cell(x, y, 0, color, color)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Change a rectangle of points relative to this component's coordinates.
|
17
|
+
def draw_rectangle(x, y, width, height, color=Cura::Color.black)
|
18
|
+
x = x.to_i
|
19
|
+
y = y.to_i
|
20
|
+
width = width.to_i
|
21
|
+
height = height.to_i
|
22
|
+
color = ColorMapper.code(color, 256) if color.is_a?(Color)
|
23
|
+
|
24
|
+
width = 1 if width < 1
|
25
|
+
height = 1 if height < 1
|
26
|
+
|
27
|
+
width.times do |x_offset|
|
28
|
+
height.times do |y_offset|
|
29
|
+
::Termbox.tb_change_cell(x + x_offset, y + y_offset, 0, color, color)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def draw_character(x, y, character, foreground=Cura::Color.black, background=Cura::Color.white, bold=false, underline=false)
|
35
|
+
x = x.to_i
|
36
|
+
y = y.to_i
|
37
|
+
foreground = ColorMapper.code(foreground, 256) if foreground.is_a?(Color)
|
38
|
+
background = ColorMapper.code(background, 256) if background.is_a?(Color)
|
39
|
+
|
40
|
+
character = character.to_s[0].codepoints.first
|
41
|
+
character ||= 0
|
42
|
+
|
43
|
+
foreground |= ::Termbox::TB_BOLD if bold
|
44
|
+
foreground |= ::Termbox::TB_UNDERLINE if underline
|
45
|
+
|
46
|
+
::Termbox.tb_change_cell(x, y, character, foreground, background)
|
47
|
+
end
|
48
|
+
|
49
|
+
def draw_text(x, y, text, foreground=Cura::Color.black, background=Cura::Color.white, bold=false, underline=false)
|
50
|
+
text.to_s.each_char do |character|
|
51
|
+
draw_character(x, y, character, foreground, background, bold, underline)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "termbox" if Kernel.respond_to?(:require)
|
2
|
+
|
3
|
+
module Cura
|
4
|
+
module Termbox
|
5
|
+
# Termbox specific mixins for Cura::Window.
|
6
|
+
module Window
|
7
|
+
# Get the width of this window.
|
8
|
+
#
|
9
|
+
# @return [Integer]
|
10
|
+
def width
|
11
|
+
::Termbox.tb_width
|
12
|
+
end
|
13
|
+
|
14
|
+
# Get the height of this window.
|
15
|
+
#
|
16
|
+
# @return [Integer]
|
17
|
+
def height
|
18
|
+
::Termbox.tb_height
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cura-termbox
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Scott Lewis
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: termbox-ffi
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.0.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.0.3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 10.1.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 10.1.1
|
41
|
+
description: Cura Termbox adapter.
|
42
|
+
email: ryan@rynet.us
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- Gemfile
|
48
|
+
- Gemfile.lock
|
49
|
+
- LICENSE
|
50
|
+
- README.md
|
51
|
+
- Rakefile
|
52
|
+
- VERSION
|
53
|
+
- cura-termbox.gemspec
|
54
|
+
- lib/cura/termbox/adapter.rb
|
55
|
+
- lib/cura/termbox/color_mapper.rb
|
56
|
+
- lib/cura/termbox/component/base.rb
|
57
|
+
- lib/cura/termbox/error/base.rb
|
58
|
+
- lib/cura/termbox/error/failed_to_open_tty.rb
|
59
|
+
- lib/cura/termbox/error/not_running.rb
|
60
|
+
- lib/cura/termbox/error/pipe_trap_error.rb
|
61
|
+
- lib/cura/termbox/error/unsupported_terminal.rb
|
62
|
+
- lib/cura/termbox/pencil.rb
|
63
|
+
- lib/cura/termbox/window.rb
|
64
|
+
homepage: http://github.com/RyanScottLewis/
|
65
|
+
licenses:
|
66
|
+
- MIT
|
67
|
+
metadata: {}
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
require_paths:
|
71
|
+
- lib
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
requirements: []
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 2.4.5
|
85
|
+
signing_key:
|
86
|
+
specification_version: 4
|
87
|
+
summary: Cura Termbox adapter.
|
88
|
+
test_files: []
|