IRGoggles 0.0.1.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/IRGoggles.rb +52 -0
- data/lib/IRGoggles/Redicle.rb +215 -0
- data/lib/IRGoggles/Strap.rb +311 -0
- data/lib/IRGoggles/entities.rb +358 -0
- data/lib/IRGoggles/utilities.rb +51 -0
- data/lib/datum/Basicdots.ttf +0 -0
- metadata +67 -0
data/lib/IRGoggles.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module IRGoggles
|
2
|
+
|
3
|
+
require 'sdl'
|
4
|
+
require 'open3'
|
5
|
+
|
6
|
+
DURR = (File.dirname(__FILE__) + "/")
|
7
|
+
SRCFLD = DURR + "IRGoggles/"
|
8
|
+
DATFLD = DURR + "datum/"
|
9
|
+
|
10
|
+
SDL.init(SDL::INIT_VIDEO)
|
11
|
+
SDL::WM::set_caption("IR Goggles!",'Super Sexy Terminal Display for Lovers')
|
12
|
+
SDL::TTF.init
|
13
|
+
|
14
|
+
Frames = [
|
15
|
+
[0.0,0.0,1.0,1.0],
|
16
|
+
[0.2,0.2,0.8,0.8],
|
17
|
+
[0.0,0.0,1.0,0.6],
|
18
|
+
[0.0,0.6,1.0,1.0],
|
19
|
+
[0.0,0.0,1.0,0.55],
|
20
|
+
[0.0,0.65,1.0,1.0],
|
21
|
+
[0.0,0.55,1.0,0.65],
|
22
|
+
[0.0,0.8,1.0,1.0]
|
23
|
+
]
|
24
|
+
Opts = {
|
25
|
+
:Back_Color => [20,150,150],
|
26
|
+
:Text_Color => [210,230,210],
|
27
|
+
:Frame_Color => [40,200,200],
|
28
|
+
:Back_Alpha => 200,
|
29
|
+
:Text_Alpha => 200,
|
30
|
+
:Frame_Alpha => 200,
|
31
|
+
:Use_Font => [:LOCAL, 0],
|
32
|
+
:Font_Size => 24,
|
33
|
+
:Resolution => [800,600]
|
34
|
+
}
|
35
|
+
|
36
|
+
|
37
|
+
def IRGoggles.massload(duhrekt)
|
38
|
+
Dir.entries(duhrekt).each{|e|
|
39
|
+
if e[-3,3] == '.rb'
|
40
|
+
Kernel.load(duhrekt + e)
|
41
|
+
end
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def IRGoggles.start
|
46
|
+
Strap.engauge!
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
IRGoggles.massload(SRCFLD)
|
51
|
+
Strap = Session.new
|
52
|
+
end
|
@@ -0,0 +1,215 @@
|
|
1
|
+
module IRGoggles
|
2
|
+
|
3
|
+
class IRGoggleERR < Exception
|
4
|
+
end
|
5
|
+
|
6
|
+
class Redicle
|
7
|
+
|
8
|
+
attr_accessor :imary, :ents, :rin, :rout, :rerr
|
9
|
+
attr_reader :w, :h, :cx, :cy
|
10
|
+
|
11
|
+
def initialize(matron)
|
12
|
+
@matron = matron
|
13
|
+
@imary = []
|
14
|
+
@sorted = []
|
15
|
+
@ents = []
|
16
|
+
@w, @h = Opts[:Resolution]
|
17
|
+
@cx = 0
|
18
|
+
@cy = 0
|
19
|
+
@thrds = []
|
20
|
+
@datelist = []
|
21
|
+
@keeplist = []
|
22
|
+
@anilist = []
|
23
|
+
@corrections = []
|
24
|
+
@marked = []
|
25
|
+
@update = false
|
26
|
+
@upkeep = false
|
27
|
+
@aminate = false
|
28
|
+
@gtg = false
|
29
|
+
end
|
30
|
+
|
31
|
+
#@imary stores all the graphics to be printed to the mainscreen
|
32
|
+
#[surface,width,height,pos_x,pos_y,priority]
|
33
|
+
#everything is an integer, except for the surface
|
34
|
+
#priority :to determine display order for #sort_imgz command.
|
35
|
+
|
36
|
+
def add_img(e)
|
37
|
+
unless c = @imary.rindex(nil)
|
38
|
+
c = @imary.size
|
39
|
+
end
|
40
|
+
@imary[c] = e
|
41
|
+
return c
|
42
|
+
end
|
43
|
+
|
44
|
+
def del_img(e)
|
45
|
+
@sorted.delete(e)
|
46
|
+
@imary[e][0].destroy
|
47
|
+
@imary[e] = nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def sort_imgz
|
51
|
+
cow = 0
|
52
|
+
@imary.each_index.sort{|a,b| @imary[a][5] <=> @imary[b][5]}.each{|i|
|
53
|
+
@sorted[cow] = i
|
54
|
+
cow += 1
|
55
|
+
}
|
56
|
+
while @sorted.size > cow
|
57
|
+
@sorted.delete(-1)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def cull_lists
|
62
|
+
if @datelist.empty?
|
63
|
+
@update = false
|
64
|
+
end
|
65
|
+
if @keeplist.empty?
|
66
|
+
@upkeep = false
|
67
|
+
end
|
68
|
+
if @anilist.empty?
|
69
|
+
@aminate = false
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
#because I used this framework for other programs, an object contained in the @ents array
|
74
|
+
# are hardly ever of a uniform class. Therefore, they are referenced by index in the various
|
75
|
+
# update and display loops. Here, in #add_ent are they orginized:
|
76
|
+
|
77
|
+
def add_ent(e)
|
78
|
+
c = @ents.size
|
79
|
+
@ents[c] = e
|
80
|
+
if e.methods.include?(:animate)
|
81
|
+
@anilist << c
|
82
|
+
end
|
83
|
+
|
84
|
+
if e.methods.include?(:update)
|
85
|
+
@datelist << c
|
86
|
+
end
|
87
|
+
|
88
|
+
if e.methods.include?(:upkeep)
|
89
|
+
@keeplist << c
|
90
|
+
end
|
91
|
+
|
92
|
+
if e.methods.include?(:correct)
|
93
|
+
@corrections << c
|
94
|
+
end
|
95
|
+
|
96
|
+
if e.methods.include?(:set_dex)
|
97
|
+
@ents[c].set_dex(c)
|
98
|
+
end
|
99
|
+
return c
|
100
|
+
end
|
101
|
+
|
102
|
+
#auspizer :sets (or resets) the window and the display surfaces which rely on the size of the window:
|
103
|
+
def auspizer(w,h)
|
104
|
+
@w = w
|
105
|
+
@h = h
|
106
|
+
@img = SDL::Screen.open(@w, @h, 32, SDL::RESIZABLE)
|
107
|
+
@corrections.each{|e| @ents[e].correct(@w, @h)}
|
108
|
+
end
|
109
|
+
|
110
|
+
#begins update, upkeep and animation threads. Then, activates the display cycle
|
111
|
+
def instigate
|
112
|
+
raise IRGoggleERR, "Cannot display nothing!" if (@ents.size == 0)
|
113
|
+
@update = true
|
114
|
+
@upkeep = true
|
115
|
+
@aminate = true
|
116
|
+
@gtg = true
|
117
|
+
aniloop
|
118
|
+
updateloop
|
119
|
+
upkeeploop
|
120
|
+
mainloop
|
121
|
+
end
|
122
|
+
|
123
|
+
#resolve stops and clears any current threads, pausing a moment to complete, then ends the display cycle
|
124
|
+
def resolve
|
125
|
+
@update = false
|
126
|
+
@upkeep = false
|
127
|
+
@aminate = false
|
128
|
+
sleep 1
|
129
|
+
@thrds.clear
|
130
|
+
@gtg = false
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
private
|
135
|
+
|
136
|
+
|
137
|
+
#finally, we have various loops. Only the #mainloop function is called in the current processes,
|
138
|
+
# all other loops are inbedded within Threads.
|
139
|
+
# The intention here is to streamline the mainloop so any function which does not have do to with
|
140
|
+
# keyboard & mouse input or drawing the window is shunted elsewhere.
|
141
|
+
|
142
|
+
def aniloop
|
143
|
+
@thrds << Thread.new{
|
144
|
+
begin
|
145
|
+
while @aminate
|
146
|
+
@anilist.each{|a| @ents[a].animate}
|
147
|
+
sleep(0.6)
|
148
|
+
end
|
149
|
+
rescue Exception
|
150
|
+
@aminate = false
|
151
|
+
puts("animatino error\n#{$!}\n#{$!.backtrace}")
|
152
|
+
end
|
153
|
+
}
|
154
|
+
end
|
155
|
+
|
156
|
+
def updateloop
|
157
|
+
@thrds << Thread.new{
|
158
|
+
begin
|
159
|
+
while @update
|
160
|
+
@datelist.each{|a| @ents[a].update}
|
161
|
+
sleep(0.03)
|
162
|
+
end
|
163
|
+
rescue Exception
|
164
|
+
@update = false
|
165
|
+
p("update error\n#{$!}\n#{$!.backtrace}")
|
166
|
+
end
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
def upkeeploop
|
171
|
+
@thrds << Thread.new{
|
172
|
+
begin
|
173
|
+
while @upkeep
|
174
|
+
@keeplist.each{|a| @ents[a].upkeep}
|
175
|
+
sleep(0.05)
|
176
|
+
end
|
177
|
+
rescue Exception
|
178
|
+
@upkeep = false
|
179
|
+
p("upkeep error\n#{$!}\n#{$!.backtrace}")
|
180
|
+
end
|
181
|
+
}
|
182
|
+
end
|
183
|
+
|
184
|
+
def mainloop
|
185
|
+
while @gtg
|
186
|
+
@img.draw_rect(0,0,@w,@h,[0,0,0],true,50)
|
187
|
+
@sorted.each{|x|
|
188
|
+
SDL::Surface.blit(@imary[x][0],0,0,@imary[x][1],@imary[x][2],@img,@imary[x][3],@imary[x][4])
|
189
|
+
}
|
190
|
+
@img.flip
|
191
|
+
sleep(0.02)
|
192
|
+
while eve = SDL::Event.poll
|
193
|
+
case eve
|
194
|
+
when SDL::Event::VideoResize
|
195
|
+
auspizer(eve.w, eve.h)
|
196
|
+
when SDL::Event::Quit
|
197
|
+
@gtg = false
|
198
|
+
when SDL::Event::KeyUp
|
199
|
+
@matron.keyin.insert(0,[eve.sym,false])
|
200
|
+
when SDL::Event::KeyDown
|
201
|
+
@matron.keyin.insert(0, [eve.sym,true])
|
202
|
+
when SDL::Event::MouseMotion
|
203
|
+
@cx = eve.x
|
204
|
+
@cy = eve.y
|
205
|
+
when SDL::Event::MouseButtonUp
|
206
|
+
@matron.mousin.insert(0,[eve.button, false])
|
207
|
+
when SDL::Event::MouseButtonDown
|
208
|
+
@matron.mousin.insert(0,[eve.button, true])
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
@@ -0,0 +1,311 @@
|
|
1
|
+
module IRGoggles
|
2
|
+
|
3
|
+
class Session
|
4
|
+
attr_accessor :keyin, :mousin
|
5
|
+
attr_reader :active
|
6
|
+
def initialize
|
7
|
+
@matron = Redicle.new(self)
|
8
|
+
@sessions = []
|
9
|
+
@select = nil
|
10
|
+
@size = 0
|
11
|
+
@active = false
|
12
|
+
@threads = []
|
13
|
+
@keyin = []
|
14
|
+
@mousin = []
|
15
|
+
@shft_l = false
|
16
|
+
@cntrl_l = false
|
17
|
+
@shft_r = false
|
18
|
+
@caps = false
|
19
|
+
@caplock = false
|
20
|
+
@cntrl_r = false
|
21
|
+
end
|
22
|
+
|
23
|
+
def new_ir
|
24
|
+
@sessions[@size] = Open3.popen3('irb --noinspect')
|
25
|
+
@size += 1
|
26
|
+
return (@size-1)
|
27
|
+
end
|
28
|
+
|
29
|
+
def engauge!
|
30
|
+
unless @active
|
31
|
+
@active = true
|
32
|
+
@select = new_ir
|
33
|
+
w, h = IRGoggles::Opts[:Resolution]
|
34
|
+
@matron.auspizer(w,h)
|
35
|
+
@spout = @matron.add_ent(Texen.new(@matron, 4))
|
36
|
+
@spin = @matron.add_ent(Texen.new(@matron, 5))
|
37
|
+
text_relay
|
38
|
+
text_reply
|
39
|
+
logic_bomb
|
40
|
+
@matron.instigate
|
41
|
+
@active = false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def capcheck
|
46
|
+
if @caplock
|
47
|
+
if @shft_l
|
48
|
+
@caps = false
|
49
|
+
elsif @shft_r
|
50
|
+
@caps = false
|
51
|
+
else
|
52
|
+
@caps = true
|
53
|
+
end
|
54
|
+
else
|
55
|
+
if @shft_l
|
56
|
+
@caps = true
|
57
|
+
elsif @shft_r
|
58
|
+
@caps = true
|
59
|
+
else
|
60
|
+
@caps = false
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def controller(chr,bool)
|
66
|
+
if bool
|
67
|
+
case chr
|
68
|
+
when 8#backspace
|
69
|
+
@matron.ents[@spin].bckspx
|
70
|
+
#when 9#tab
|
71
|
+
when 13#return
|
72
|
+
if @cntrl_l || @cntrl_r
|
73
|
+
@sessions[@select][0].puts(@matron.ents[@spin].slasher)
|
74
|
+
else
|
75
|
+
@matron.ents[@spin].newlin
|
76
|
+
end
|
77
|
+
#when 27#esc
|
78
|
+
#when 32#space
|
79
|
+
when 39#'
|
80
|
+
if @shft_l || @sft_r
|
81
|
+
@matron.ents[@spin].append('"')
|
82
|
+
else
|
83
|
+
@matron.ents[@spin].append("'")
|
84
|
+
end
|
85
|
+
when 44# comma
|
86
|
+
if @shft_l || @sft_r
|
87
|
+
@matron.ents[@spin].append("<")
|
88
|
+
else
|
89
|
+
@matron.ents[@spin].append(",")
|
90
|
+
end
|
91
|
+
when 45#minus -
|
92
|
+
if @shft_l || @sft_r
|
93
|
+
@matron.ents[@spin].append("_")
|
94
|
+
else
|
95
|
+
@matron.ents[@spin].append("-")
|
96
|
+
end
|
97
|
+
when 46# period
|
98
|
+
if @shft_l || @sft_r
|
99
|
+
@matron.ents[@spin].append(">")
|
100
|
+
else
|
101
|
+
@matron.ents[@spin].append(".")
|
102
|
+
end
|
103
|
+
when 47#foreslash?
|
104
|
+
if @shft_l || @sft_r
|
105
|
+
@matron.ents[@spin].append("?")
|
106
|
+
else
|
107
|
+
@matron.ents[@spin].append("/")
|
108
|
+
end
|
109
|
+
when 48#0
|
110
|
+
if @shft_l || @sft_r
|
111
|
+
@matron.ents[@spin].append(")")
|
112
|
+
else
|
113
|
+
@matron.ents[@spin].append("0")
|
114
|
+
end
|
115
|
+
when 49#1
|
116
|
+
if @shft_l || @sft_r
|
117
|
+
@matron.ents[@spin].append("!")
|
118
|
+
else
|
119
|
+
@matron.ents[@spin].append("1")
|
120
|
+
end
|
121
|
+
when 50#2
|
122
|
+
if @shft_l || @sft_r
|
123
|
+
@matron.ents[@spin].append("@")
|
124
|
+
else
|
125
|
+
@matron.ents[@spin].append("2")
|
126
|
+
end
|
127
|
+
when 51#3
|
128
|
+
if @shft_l || @sft_r
|
129
|
+
@matron.ents[@spin].append("#")
|
130
|
+
else
|
131
|
+
@matron.ents[@spin].append("3")
|
132
|
+
end
|
133
|
+
when 52#4
|
134
|
+
if @shft_l || @sft_r
|
135
|
+
@matron.ents[@spin].append("$")
|
136
|
+
else
|
137
|
+
@matron.ents[@spin].append("4")
|
138
|
+
end
|
139
|
+
when 53#5
|
140
|
+
if @shft_l || @sft_r
|
141
|
+
@matron.ents[@spin].append("%")
|
142
|
+
else
|
143
|
+
@matron.ents[@spin].append("5")
|
144
|
+
end
|
145
|
+
when 54#6
|
146
|
+
if @shft_l || @sft_r
|
147
|
+
@matron.ents[@spin].append("^")
|
148
|
+
else
|
149
|
+
@matron.ents[@spin].append("6")
|
150
|
+
end
|
151
|
+
when 55#7
|
152
|
+
if @shft_l || @sft_r
|
153
|
+
@matron.ents[@spin].append("&")
|
154
|
+
else
|
155
|
+
@matron.ents[@spin].append("7")
|
156
|
+
end
|
157
|
+
when 56#8
|
158
|
+
if @shft_l || @sft_r
|
159
|
+
@matron.ents[@spin].append("*")
|
160
|
+
else
|
161
|
+
@matron.ents[@spin].append("8")
|
162
|
+
end
|
163
|
+
when 57#9
|
164
|
+
if @shft_l || @sft_r
|
165
|
+
@matron.ents[@spin].append("(")
|
166
|
+
else
|
167
|
+
@matron.ents[@spin].append("9")
|
168
|
+
end
|
169
|
+
when 59
|
170
|
+
if @shft_l || @sft_r
|
171
|
+
@matron.ents[@spin].append(":")
|
172
|
+
else
|
173
|
+
@matron.ents[@spin].append(";")
|
174
|
+
end
|
175
|
+
when 61#plus +
|
176
|
+
if @shft_l || @sft_r
|
177
|
+
@matron.ents[@spin].append("+")
|
178
|
+
else
|
179
|
+
@matron.ents[@spin].append("=")
|
180
|
+
end
|
181
|
+
when 91#bra
|
182
|
+
if @shft_l || @sft_r
|
183
|
+
@matron.ents[@spin].append("{")
|
184
|
+
else
|
185
|
+
@matron.ents[@spin].append("[")
|
186
|
+
end
|
187
|
+
when 92#bar and backslash
|
188
|
+
if @shft_l || @sft_r
|
189
|
+
@matron.ents[@spin].append("|")
|
190
|
+
else
|
191
|
+
@matron.ents[@spin].append("\\")
|
192
|
+
end
|
193
|
+
when 93#ket
|
194
|
+
if @shft_l || @sft_r
|
195
|
+
@matron.ents[@spin].append("}")
|
196
|
+
else
|
197
|
+
@matron.ents[@spin].append("]")
|
198
|
+
end
|
199
|
+
when 96#tilde&backquote
|
200
|
+
if @shft_l || @sft_r
|
201
|
+
@matron.ents[@spin].append("~")
|
202
|
+
else
|
203
|
+
@matron.ents[@spin].append("`")
|
204
|
+
end
|
205
|
+
when 127#delete
|
206
|
+
@matron.ents[@spin].leet
|
207
|
+
when 273#up
|
208
|
+
@matron.ents[@spin].uparrow
|
209
|
+
when 274#down
|
210
|
+
@matron.ents[@spin].downarrow
|
211
|
+
when 275#right
|
212
|
+
@matron.ents[@spin].rightarrow
|
213
|
+
when 276#left
|
214
|
+
@matron.ents[@spin].leftarrow
|
215
|
+
when 277#insert
|
216
|
+
@matron.ents[@spin].certify
|
217
|
+
when 278#HOme
|
218
|
+
@matron.ents[@spin].homekey
|
219
|
+
when 279#end
|
220
|
+
@matron.ents[@spin].endkey
|
221
|
+
when 280#pageup
|
222
|
+
@matron.ents[@spin].pageup
|
223
|
+
when 281#pagedown
|
224
|
+
@matron.ents[@spin].pagedown
|
225
|
+
#when 282#F1
|
226
|
+
#when 293#F12
|
227
|
+
when 303
|
228
|
+
@shft_r = true
|
229
|
+
when 304
|
230
|
+
@shft_l = true
|
231
|
+
when 305
|
232
|
+
@cntrl_l = true
|
233
|
+
when 306
|
234
|
+
@cntrl_r = true
|
235
|
+
|
236
|
+
else
|
237
|
+
capcheck
|
238
|
+
if (@caps == true)
|
239
|
+
@matron.ents[@spin].append(chr.chr.upcase)
|
240
|
+
else
|
241
|
+
@matron.ents[@spin].append(chr.chr)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
else #key is lifted
|
245
|
+
case chr
|
246
|
+
when 303
|
247
|
+
@shft_r = false
|
248
|
+
when 304
|
249
|
+
@shft_l = false
|
250
|
+
when 305
|
251
|
+
@cntrl_l = false
|
252
|
+
when 306
|
253
|
+
@cntrl_r = false
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def text_reply
|
259
|
+
@threads << Thread.new{
|
260
|
+
p("Thread start")
|
261
|
+
begin
|
262
|
+
while @active
|
263
|
+
while line = @sessions[@select][1].gets
|
264
|
+
p("GETTING LINE = #{line}")
|
265
|
+
@matron.ents[@spout].dump(line)
|
266
|
+
end
|
267
|
+
sleep(0.06)
|
268
|
+
end
|
269
|
+
rescue Exception
|
270
|
+
p("FEED error\n#{$!}\n#{$!.backtrace}")
|
271
|
+
@active = false
|
272
|
+
end
|
273
|
+
p("Threadstop ply")
|
274
|
+
}
|
275
|
+
|
276
|
+
end
|
277
|
+
def text_relay
|
278
|
+
@threads << Thread.new{
|
279
|
+
p("Thread start")
|
280
|
+
begin
|
281
|
+
while @active
|
282
|
+
while lout = @keyin.pop
|
283
|
+
controller(lout[0],lout[1])
|
284
|
+
p("KEYING INT = #{lout}")
|
285
|
+
end
|
286
|
+
sleep(0.1)
|
287
|
+
end
|
288
|
+
rescue Exception
|
289
|
+
p("FEED error\n#{$!}\n#{$!.backtrace}")
|
290
|
+
@active = false
|
291
|
+
end
|
292
|
+
p("Threadstop lay")
|
293
|
+
}
|
294
|
+
end
|
295
|
+
|
296
|
+
def logic_bomb
|
297
|
+
@threads << Thread.new{
|
298
|
+
begin
|
299
|
+
while @active
|
300
|
+
@matron.sort_imgz
|
301
|
+
@matron.cull_lists
|
302
|
+
sleep 2
|
303
|
+
end
|
304
|
+
rescue Exception
|
305
|
+
p("LOGICERR error\n#{$!}\n#{$!.backtrace}")
|
306
|
+
@active = false
|
307
|
+
end
|
308
|
+
}
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
@@ -0,0 +1,358 @@
|
|
1
|
+
module IRGoggles
|
2
|
+
|
3
|
+
class OperatingSystemErr < StandardError
|
4
|
+
end
|
5
|
+
|
6
|
+
class Overlay
|
7
|
+
def initialize(mat,frmst)
|
8
|
+
@matron = mat
|
9
|
+
@margie = [0.1,0.05,0.03,0.03]
|
10
|
+
@spd = 0.07
|
11
|
+
@frmst = IRGoggles::Frames[frmst]
|
12
|
+
@x = 0
|
13
|
+
@y = 0
|
14
|
+
@w = 0
|
15
|
+
@h = 0
|
16
|
+
@kex = Array.new(4, 0.0)
|
17
|
+
@p = 1000
|
18
|
+
@refresh = true
|
19
|
+
|
20
|
+
setdat
|
21
|
+
correct(@matron.w, @matron.h)
|
22
|
+
make_margin
|
23
|
+
|
24
|
+
set_image_array
|
25
|
+
end
|
26
|
+
def set_dex(c)
|
27
|
+
@entdex = c
|
28
|
+
end
|
29
|
+
def setdat
|
30
|
+
@bgc = Opts[:Back_Color]
|
31
|
+
@txtc = Opts[:Text_Color]
|
32
|
+
@fgc = Opts[:Frame_Color]
|
33
|
+
@bga = Opts[:Back_Alpha]
|
34
|
+
@txta = Opts[:Text_Alpha]
|
35
|
+
@fga = Opts[:Frame_Alpha]
|
36
|
+
end
|
37
|
+
def correct(w,h)
|
38
|
+
x,y,xx,yy = @frmst
|
39
|
+
@tw = ((xx - x)*w).to_i
|
40
|
+
@th = ((yy - y)*h).to_i
|
41
|
+
@tx = (x*w).to_i
|
42
|
+
@ty = (y*h).to_i
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def set_image_array
|
47
|
+
preren = SDL::Surface.new(SDL::HWSURFACE,@w,@h,32,0,0,0,0)
|
48
|
+
preren.set_color_key(SDL::SRCALPHA, 0)
|
49
|
+
@idex = @matron.add_img([preren.display_format_alpha,@w,@h,@x,@y,@p])
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_margin
|
53
|
+
@marg_t = (@h*@margie[0]).round
|
54
|
+
@marg_b = (@h*@margie[1]).round
|
55
|
+
@marg_l = (@w*@margie[2]).round
|
56
|
+
@marg_r = (@w*@margie[3]).round
|
57
|
+
end
|
58
|
+
def fixed_margin
|
59
|
+
@marg_t, @marg_b, @marg_l, @marg_r = @margie.collect{|e| (e*512).to_i}
|
60
|
+
end
|
61
|
+
|
62
|
+
def update
|
63
|
+
#p("tz = #{[@tx,@ty,@tw,@th]}\t\tzz = #{[@x,@y,@w,@h]}\n\tk = #{@kex}")
|
64
|
+
k = (@tx - @x)
|
65
|
+
#p("\n\t\t\tk = #{k}")
|
66
|
+
if k.abs < 10
|
67
|
+
@kex[0] = 0.0
|
68
|
+
@x = @tx
|
69
|
+
else
|
70
|
+
@kex[0] = (@kex[0] + k)*@spd
|
71
|
+
end
|
72
|
+
k = (@ty - @y)
|
73
|
+
#p("\n\t\t\tk = #{k}")
|
74
|
+
if k.abs < 10
|
75
|
+
@kex[1] = 0.0
|
76
|
+
@y = @ty
|
77
|
+
else
|
78
|
+
@kex[1] = (@kex[1] + k)*@spd
|
79
|
+
end
|
80
|
+
k = (@tw - @w)
|
81
|
+
#p("\n\t\t\tk = #{k}")
|
82
|
+
if k.abs < 10
|
83
|
+
@kex[2] = 0.0
|
84
|
+
@w = @tw
|
85
|
+
else
|
86
|
+
@kex[2] = (@kex[2] + k)*@spd
|
87
|
+
end
|
88
|
+
k = (@th - @h)
|
89
|
+
#p("\n\t\t\tk = #{k}")
|
90
|
+
if k.abs < 10
|
91
|
+
@kex[3] = 0.0
|
92
|
+
@h = @th
|
93
|
+
else
|
94
|
+
@kex[3] = (@kex[3] + k)*@spd
|
95
|
+
end
|
96
|
+
unless @kex[0] == 0.0
|
97
|
+
@matron.imary[@idex][3] = @x = (@x + @kex[0]).round
|
98
|
+
@refresh = true
|
99
|
+
end
|
100
|
+
unless @kex[1] == 0.0
|
101
|
+
@matron.imary[@idex][4] = @y = (@y + @kex[1]).round
|
102
|
+
@refresh = true
|
103
|
+
end
|
104
|
+
unless @kex[2] == 0.0
|
105
|
+
#p "matroim = #{@matron.imary[@idex]}"
|
106
|
+
@matron.imary[@idex][1] = @w = (@w + @kex[2]).round
|
107
|
+
@refresh = true
|
108
|
+
end
|
109
|
+
unless @kex[3] == 0.0
|
110
|
+
@matron.imary[@idex][2] = @h = (@h + @kex[3]).round
|
111
|
+
@refresh = true
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def upkeep
|
116
|
+
if @refresh
|
117
|
+
@matron.imary[@idex][0] = @matron.imary[@idex][0].copy_rect(0,0,@w,@h)
|
118
|
+
make_margin
|
119
|
+
@matron.imary[@idex][0].draw_rect(0,0,@w,@h,@bgc,true,@bga)
|
120
|
+
@matron.imary[@idex][0].draw_rect(0,0,@w,@marg_t,@fgc,true,@fga)
|
121
|
+
@matron.imary[@idex][0].draw_rect(0,@h-@marg_b,@w,@marg_b,@fgc,true,@fga)
|
122
|
+
@matron.imary[@idex][0].draw_rect(0,@marg_t,@marg_l,@h-@marg_b-@marg_b,@fgc,true,@fga)
|
123
|
+
@matron.imary[@idex][0].draw_rect(@w-@marg_r,@marg_t,@marg_r,@h-@marg_b-@marg_b,@fgc,true,@fga)
|
124
|
+
@refresh = false
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end#end overlayclass
|
128
|
+
|
129
|
+
|
130
|
+
class Texen < Overlay
|
131
|
+
def initialize(mat,frmst)
|
132
|
+
super
|
133
|
+
set_fawnt
|
134
|
+
@tileW = @fawn.text_size('W')[0]
|
135
|
+
@tileH = @ch = @fawn.line_skip
|
136
|
+
@space = @fawn.text_size(' ')[0]
|
137
|
+
@xset = 0
|
138
|
+
@yset = 0
|
139
|
+
@xcur = 0
|
140
|
+
@ycur = 0
|
141
|
+
@tlin = 0
|
142
|
+
@tcur = 0
|
143
|
+
@cursed = false
|
144
|
+
@wrap = false
|
145
|
+
@texas = ['']
|
146
|
+
@cert = true
|
147
|
+
@page = 0
|
148
|
+
@gappe = 0
|
149
|
+
@xscroll = 0
|
150
|
+
@yscroll = 0
|
151
|
+
@mamory = []
|
152
|
+
end
|
153
|
+
def dump(str)
|
154
|
+
str.lines("\n").to_a.collect{|e| e.lines("\r").to_a}.flatten.each{|w|
|
155
|
+
@texas << w.rstrip
|
156
|
+
@tlin += 1
|
157
|
+
}
|
158
|
+
@tcur = @texas[-1].size#-1
|
159
|
+
seek
|
160
|
+
@refresh = true
|
161
|
+
end
|
162
|
+
def slasher
|
163
|
+
dat = (@texas.join('') + "\r")
|
164
|
+
@mamory << dat
|
165
|
+
@texas = ['']
|
166
|
+
@tlin = 0
|
167
|
+
@tcur = 0
|
168
|
+
@refresh = true
|
169
|
+
return dat
|
170
|
+
end
|
171
|
+
def seek
|
172
|
+
@yscroll = (@tlin-(@page/2))
|
173
|
+
@xscroll = (@tcur-(@gappe/2))
|
174
|
+
if @yscroll < 0
|
175
|
+
@yscroll = 0
|
176
|
+
end
|
177
|
+
if @xscroll < 0
|
178
|
+
@xscroll = 0
|
179
|
+
end
|
180
|
+
@refresh = true
|
181
|
+
end
|
182
|
+
def homekey
|
183
|
+
@tcur = 0
|
184
|
+
seek
|
185
|
+
end
|
186
|
+
def endkey
|
187
|
+
@tcur = @texas[@tlin].size
|
188
|
+
seek
|
189
|
+
end
|
190
|
+
def pageup
|
191
|
+
@tlin -= @page
|
192
|
+
if @tlin < 0
|
193
|
+
@tlin = 0
|
194
|
+
end
|
195
|
+
seek
|
196
|
+
end
|
197
|
+
def pagedown
|
198
|
+
@tlin += @page
|
199
|
+
if @tlin > @texas.size
|
200
|
+
@tlin = @texas.size
|
201
|
+
end
|
202
|
+
seek
|
203
|
+
end
|
204
|
+
def uparrow
|
205
|
+
unless @tlin == 0
|
206
|
+
@tlin -= 1
|
207
|
+
seek
|
208
|
+
else
|
209
|
+
homekey
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def downarrow
|
214
|
+
if @tlin < (@texas.size-1)
|
215
|
+
@tlin += 1
|
216
|
+
seek
|
217
|
+
else
|
218
|
+
endkey
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def leftarrow
|
223
|
+
if @tcur == 0
|
224
|
+
uparrow
|
225
|
+
@tcur = @texas[@tlin].size
|
226
|
+
else
|
227
|
+
@tcur -= 1
|
228
|
+
end
|
229
|
+
seek
|
230
|
+
end
|
231
|
+
def rightarrow
|
232
|
+
if @tcur == @texas[@tlin].size
|
233
|
+
downarrow
|
234
|
+
@tcur = 0
|
235
|
+
else
|
236
|
+
@tcur += 1
|
237
|
+
end
|
238
|
+
seek
|
239
|
+
end
|
240
|
+
|
241
|
+
def newlin
|
242
|
+
a = "#{@texas[@tlin][0..@tcur]}\n"
|
243
|
+
b = "#{@texas[@tlin][@tcur+1..-1]}"
|
244
|
+
@texas[@tlin] = a
|
245
|
+
@tlin += 1
|
246
|
+
@texas.insert(@tlin,b)
|
247
|
+
@tcur = 0
|
248
|
+
end
|
249
|
+
def bckspx
|
250
|
+
leftarrow
|
251
|
+
@texas[@tlin][@tcur] = ''
|
252
|
+
@refresh = true
|
253
|
+
end
|
254
|
+
def leet
|
255
|
+
@texas[@tlin][@tcur] = ''
|
256
|
+
end
|
257
|
+
def append(crz)
|
258
|
+
if @cert
|
259
|
+
@texas[@tlin].insert(@tcur,crz)
|
260
|
+
@tcur += 1
|
261
|
+
else
|
262
|
+
@texas[@tlin][@tcur] = crz
|
263
|
+
@tcur += 1
|
264
|
+
end
|
265
|
+
@refresh = true
|
266
|
+
end
|
267
|
+
def certify
|
268
|
+
@cert = !@cert
|
269
|
+
end
|
270
|
+
def resolve_scope
|
271
|
+
@h_span = (@h - @marg_t - @marg_b)
|
272
|
+
@w_span = (@w - @marg_l - @marg_r)
|
273
|
+
@page = ( @h_span / @tileH)
|
274
|
+
@gappe = ( @w_span / @space)
|
275
|
+
end
|
276
|
+
def set_fawnt
|
277
|
+
param, val = Opts[:Use_Font]
|
278
|
+
case param
|
279
|
+
when :WINXP
|
280
|
+
raise OperatingSystemERR, "You're using windows xp? fuhreal?? ohmegurd, Mr. Babbage, you're not allowed."
|
281
|
+
when :WIN7
|
282
|
+
t = IRGoggles.win7_fonts[val]
|
283
|
+
when :NIXIE
|
284
|
+
t = IRGoggles.nix_fonts[val]
|
285
|
+
when :LOCAL
|
286
|
+
t = (IRGoggles.ttf_durr(DATFLD))[val]
|
287
|
+
end
|
288
|
+
@fawn = SDL::TTF.open(t[1],Opts[:Font_Size])
|
289
|
+
@fawn.style = SDL::TTF::STYLE_NORMAL
|
290
|
+
end
|
291
|
+
|
292
|
+
def rend(wrd)
|
293
|
+
wrd.rstrip!
|
294
|
+
unless wrd.size == 0
|
295
|
+
len = @fawn.text_size(wrd)[0]
|
296
|
+
if ((@xset + len) > (@w_span))
|
297
|
+
if @wrap
|
298
|
+
@xset = @marg_l
|
299
|
+
@yset += @tileH
|
300
|
+
@fawn.draw_solid_utf8(@matron.imary[@idex][0],wrd,@xset,@yset,@txtc[0],@txtc[1],@txtc[2])
|
301
|
+
@xset += (len + @space)
|
302
|
+
end
|
303
|
+
else
|
304
|
+
@fawn.draw_solid_utf8(@matron.imary[@idex][0],wrd,@xset,@yset,@txtc[0],@txtc[1],@txtc[2])
|
305
|
+
@xset += (len + @space)
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def texprint
|
311
|
+
# p("printing text!!! #{self.__id__}, #{@bstring}: :#{@fstring}")
|
312
|
+
@yset = @marg_t
|
313
|
+
@xset = @marg_l
|
314
|
+
sample = @texas[@yscroll,@page]
|
315
|
+
lin_cow = @yscroll
|
316
|
+
wrd_cow = @xscroll
|
317
|
+
sample.each{|line|
|
318
|
+
sline = line[@xscroll, @gappe]
|
319
|
+
unless sline == nil
|
320
|
+
if @tlin == lin_cow
|
321
|
+
sline[0..(@tcur-1)].lines(' ').each{|wrd| rend(wrd) }
|
322
|
+
nxcur = @xset-@space
|
323
|
+
nycur = @yset
|
324
|
+
@matron.imary[@idex][0].draw_rect(nxcur,nycur,@tileW,@tileH,[100,20,120],true,60)
|
325
|
+
unless sline[@tcur] == nil
|
326
|
+
sline[@tcur..-1].lines(' ').each{|wrd| rend(wrd) }
|
327
|
+
end
|
328
|
+
else
|
329
|
+
sline.lines(' ').each{|wrd| rend(wrd) }
|
330
|
+
end
|
331
|
+
end
|
332
|
+
lin_cow += 1
|
333
|
+
@yset += @tileH
|
334
|
+
@xset = @marg_l
|
335
|
+
}
|
336
|
+
end
|
337
|
+
def upkeep
|
338
|
+
if @refresh
|
339
|
+
#p("refreshing ket = #{@kex}")
|
340
|
+
@matron.imary[@idex][0] = @matron.imary[@idex][0].copy_rect(0,0,@w,@h)
|
341
|
+
@matron.imary[@idex][0].draw_rect(0,0,@w,@h,@bgc,true,@bga)
|
342
|
+
make_margin
|
343
|
+
resolve_scope
|
344
|
+
texprint
|
345
|
+
@matron.imary[@idex][0].draw_rect(0,0,@w,@marg_t,@fgc,true,@fga)
|
346
|
+
@matron.imary[@idex][0].draw_rect(0,@h-@marg_b,@w,@marg_b,@fgc,true,@fga)
|
347
|
+
@matron.imary[@idex][0].draw_rect(0,@marg_t,@marg_l,@h-@marg_b-@marg_b,@fgc,true,@fga)
|
348
|
+
@matron.imary[@idex][0].draw_rect(@w-@marg_r,@marg_t,@marg_r,@h-@marg_b-@marg_b,@fgc,true,@fga)
|
349
|
+
@refresh = false
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
end
|
354
|
+
|
355
|
+
end#end mod
|
356
|
+
|
357
|
+
|
358
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module IRGoggles
|
2
|
+
|
3
|
+
def IRGoggles.ttf_durr(lookin)
|
4
|
+
ret = []
|
5
|
+
Dir.entries(lookin).keep_if{|g| g[-4,4] == '.ttf'}.each{|v|
|
6
|
+
ret << [v[0..-4], (lookin + v)]
|
7
|
+
}
|
8
|
+
return ret
|
9
|
+
end
|
10
|
+
|
11
|
+
def IRGoggles.winXP_fonts
|
12
|
+
tink = []
|
13
|
+
lookin = ENV['SystemRoot'] + "/Fonts/"
|
14
|
+
Dir.entries(lookin).keep_if{|g| g[-4,4] == '.ttf'}.each{|v|
|
15
|
+
tink << [v[0..-4], (lookin + v)]
|
16
|
+
}
|
17
|
+
return tink
|
18
|
+
end
|
19
|
+
|
20
|
+
def IRGoggles.win7_fonts
|
21
|
+
fink = []
|
22
|
+
lookin = "C:/Windows/winsxs"
|
23
|
+
ffix = "amd64_microsoft-windows-font-truetype-/"
|
24
|
+
tup = Dir.entries(path).keep_if{|g| g[-4,4] == ".ttf"}
|
25
|
+
a = Dir.entries(lookin).keep_if{|x| (x[0,ffix.size] == ffix)}
|
26
|
+
b = a.collect{|v| Dir.entries(lookin + v) }
|
27
|
+
b.size.times{|g|
|
28
|
+
if b[g][-4,4] == ".ttf"
|
29
|
+
fink << [b[g][0..-4], a[g], tup]
|
30
|
+
end
|
31
|
+
}
|
32
|
+
return fink
|
33
|
+
end
|
34
|
+
|
35
|
+
def IRGoggles.nix_fonts
|
36
|
+
flib = []
|
37
|
+
sear = "/usr/share/fonts/truetype/"
|
38
|
+
Dir.entries(sear).each{|p|
|
39
|
+
unless ((p == '.') || (p == '..'))
|
40
|
+
fin = (sear + "/" + p)
|
41
|
+
Dir.entries(fin).each{|e|
|
42
|
+
if e[-4,4] == '.ttf'
|
43
|
+
flib << [e[0..-4], (fin + e)]
|
44
|
+
end
|
45
|
+
}
|
46
|
+
end
|
47
|
+
}
|
48
|
+
return flib
|
49
|
+
end
|
50
|
+
|
51
|
+
end#endmod
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: IRGoggles
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.alpha
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nietzschette
|
9
|
+
- Bangarang
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2015-06-26 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rubysdl
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 2.0.0
|
31
|
+
description: SDL-based interface for IRB.
|
32
|
+
email: Nietzschette01@gmail.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/IRGoggles.rb
|
38
|
+
- lib/IRGoggles/entities.rb
|
39
|
+
- lib/IRGoggles/Redicle.rb
|
40
|
+
- lib/IRGoggles/Strap.rb
|
41
|
+
- lib/IRGoggles/utilities.rb
|
42
|
+
- lib/datum/Basicdots.ttf
|
43
|
+
homepage: http://irgoggles.sourceforge.net
|
44
|
+
licenses: []
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>'
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.3.1
|
61
|
+
requirements: []
|
62
|
+
rubyforge_project:
|
63
|
+
rubygems_version: 1.8.23
|
64
|
+
signing_key:
|
65
|
+
specification_version: 3
|
66
|
+
summary: IR = Interactive Ruby. Goggles = for your face!
|
67
|
+
test_files: []
|