rndk 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/demos/appointment.rb +40 -25
- data/demos/clock.rb +22 -11
- data/demos/fileview.rb +141 -0
- data/examples/01-hello-world.rb +1 -2
- data/examples/02-colors.rb +58 -0
- data/examples/03-markup.rb +70 -0
- data/examples/04-quick-widgets.rb +72 -0
- data/examples/05-position-widget.rb +3 -6
- data/examples/calendar.rb +104 -0
- data/examples/scroll.rb +106 -0
- data/lib/rndk/alphalist.rb +14 -14
- data/lib/rndk/button.rb +21 -21
- data/lib/rndk/buttonbox.rb +18 -18
- data/lib/rndk/calendar.rb +333 -240
- data/lib/rndk/core/color.rb +136 -0
- data/lib/rndk/core/display.rb +23 -12
- data/lib/rndk/core/draw.rb +32 -26
- data/lib/rndk/core/markup.rb +561 -0
- data/lib/rndk/core/quick_widgets.rb +232 -12
- data/lib/rndk/core/screen.rb +16 -17
- data/lib/rndk/core/utils.rb +143 -0
- data/lib/rndk/core/widget.rb +133 -92
- data/lib/rndk/dialog.rb +17 -17
- data/lib/rndk/entry.rb +21 -21
- data/lib/rndk/fselect.rb +16 -16
- data/lib/rndk/graph.rb +10 -10
- data/lib/rndk/histogram.rb +10 -10
- data/lib/rndk/itemlist.rb +20 -20
- data/lib/rndk/label.rb +66 -45
- data/lib/rndk/marquee.rb +10 -10
- data/lib/rndk/matrix.rb +27 -27
- data/lib/rndk/mentry.rb +22 -22
- data/lib/rndk/menu.rb +14 -14
- data/lib/rndk/radio.rb +19 -19
- data/lib/rndk/scale.rb +21 -21
- data/lib/rndk/scroll.rb +19 -19
- data/lib/rndk/scroller.rb +2 -0
- data/lib/rndk/selection.rb +20 -20
- data/lib/rndk/slider.rb +21 -21
- data/lib/rndk/swindow.rb +20 -20
- data/lib/rndk/template.rb +21 -21
- data/lib/rndk/version.rb +1 -1
- data/lib/rndk/viewer.rb +18 -18
- data/lib/rndk.rb +99 -777
- data/rndk.gemspec +1 -1
- metadata +12 -3
@@ -0,0 +1,561 @@
|
|
1
|
+
# # RNDK String Markup
|
2
|
+
#
|
3
|
+
# RNDK has special formatting commands which can be included
|
4
|
+
# in any String which add highlights, justification, or even
|
5
|
+
# colors to a basic String.
|
6
|
+
#
|
7
|
+
# These attributes, once set, remain in effect until changed
|
8
|
+
# explicitly, or until the end of the string.
|
9
|
+
#
|
10
|
+
# ## Colors
|
11
|
+
#
|
12
|
+
# RNDK has the capability to display colors in almost any text
|
13
|
+
# inside a Widget.
|
14
|
+
#
|
15
|
+
# To turn on colors, the function #initCDKColor has to be called. When
|
16
|
+
# this function is called 64 color pairs are created. Normally the
|
17
|
+
# color pairs are accessed via the COLOR_PAIR macro. You can still do
|
18
|
+
# this, but creating a string with multiple colors gets terribly
|
19
|
+
# difficult. That is why the color commands were created.
|
20
|
+
#
|
21
|
+
# The color settings are stored directly in the string. When the
|
22
|
+
# widget is created or activated, the string is converted to take
|
23
|
+
# advan- tage of any color commands in the string. To turn on a color
|
24
|
+
# pair insert </XX> into the string; where XX is a numeric value from
|
25
|
+
# 0 to 64. Color pair 0 is the standard default color pair for the
|
26
|
+
# screen. To turn off a color pair use the format command <!XX> where
|
27
|
+
# XX is a numeric value from 0 to 64.
|
28
|
+
#
|
29
|
+
# For example:
|
30
|
+
#
|
31
|
+
# "</31>This line should have a yellow foreground and a cyan background.<!31>"
|
32
|
+
# "</05>This line should have a white foreground and a blue background.<!05>"
|
33
|
+
# "</26>This line should have a yellow foreground and a red background.<!26>"
|
34
|
+
# "<C>This line should be set to whatever the screen default is."
|
35
|
+
#
|
36
|
+
# ## Attributes
|
37
|
+
#
|
38
|
+
# RNDK also provides attribute commands which allow different
|
39
|
+
# character attributes to be displayed in a Widget.
|
40
|
+
#
|
41
|
+
# To use a character attribute the format command is `</X>` where X is
|
42
|
+
# one of several command characters. To turn a attribute off use the
|
43
|
+
# command `<!X>`.
|
44
|
+
#
|
45
|
+
# Here's the command characters supported:
|
46
|
+
#
|
47
|
+
# B:: Bold
|
48
|
+
# U:: Underline
|
49
|
+
# K:: Blink
|
50
|
+
# R:: Reverse
|
51
|
+
# S:: Standout
|
52
|
+
# D:: Dim
|
53
|
+
# N:: Normal
|
54
|
+
#
|
55
|
+
# For example:
|
56
|
+
#
|
57
|
+
# "</B/31>Bold text yellow foreground / blue background.<!31>"
|
58
|
+
# "</U/05>Underlined text white foreground / blue background.<!05>"
|
59
|
+
# "</K/26>Blinking text yellow foreground / red background.<!26>"
|
60
|
+
# "<C>This line uses the screen default colors."
|
61
|
+
#
|
62
|
+
# ## Justification
|
63
|
+
#
|
64
|
+
# Justification commands can **left justify**, **right justify**, or
|
65
|
+
# **center** a string of text.
|
66
|
+
#
|
67
|
+
# A format command must be at the **beginning** of the string.
|
68
|
+
#
|
69
|
+
# To use a justification format in a string the command `<X>` is used.
|
70
|
+
#
|
71
|
+
# Format commands:
|
72
|
+
#
|
73
|
+
# <L>:: Left Justified. Default if not stated.
|
74
|
+
# <C>:: Centered text.
|
75
|
+
# <R>:: Right justified.
|
76
|
+
# <I=X>:: Indent the line X characters.
|
77
|
+
# <B=X>:: Bullet. X is the bullet string to use.
|
78
|
+
# <F=X>:: Links in a file where X is the filename. This works only with the viewer widget.
|
79
|
+
#
|
80
|
+
# For example:
|
81
|
+
#
|
82
|
+
# "<R></B/31>This line should have a yellow foreground and a blue background.<!31>"
|
83
|
+
# "</U/05>This line should have a white foreground and a blue background.<!05>"
|
84
|
+
# "<B=+>This is a bullet."
|
85
|
+
# "<I=10>This is indented 10 characters."
|
86
|
+
# "<C>This line should be set to whatever the screen default is."
|
87
|
+
#
|
88
|
+
# The bullet format command can take either a single character or a
|
89
|
+
# string. The bullet in the above example would look like
|
90
|
+
#
|
91
|
+
# + This is a bullet.
|
92
|
+
#
|
93
|
+
# but if we were to use the following command instead
|
94
|
+
#
|
95
|
+
# <B=***>This is a bullet.
|
96
|
+
#
|
97
|
+
# it would look like
|
98
|
+
#
|
99
|
+
# *** This is a bullet.
|
100
|
+
#
|
101
|
+
# ## Special Drawing Characters
|
102
|
+
#
|
103
|
+
# RNDK has a set of special drawing characters which can be inserted
|
104
|
+
# into any ASCII file. In order to use a special character the format
|
105
|
+
# command `<#XXX>` is used.
|
106
|
+
#
|
107
|
+
# Special character commands:
|
108
|
+
#
|
109
|
+
# <#UL>:: Upper Left Corner
|
110
|
+
# <#UR>:: Upper Right Corner
|
111
|
+
# <#LL>:: Lower Left Corner
|
112
|
+
# <#LR>:: Lower Right Corner
|
113
|
+
#
|
114
|
+
# <#LT>:: Left Tee
|
115
|
+
# <#RT>:: Right Tee
|
116
|
+
# <#TT>:: Top Tee
|
117
|
+
# <#BT>:: Bottom Tee
|
118
|
+
#
|
119
|
+
# <#HL>:: Horizontal Line
|
120
|
+
# <#VL>:: Vertical Line
|
121
|
+
#
|
122
|
+
# <#PL>:: Plus Sign
|
123
|
+
# <#PM>:: Plus or Minus Sign
|
124
|
+
# <#DG>:: Degree Sign
|
125
|
+
# <#CB>:: Checker Board
|
126
|
+
# <#DI>:: Diamond
|
127
|
+
# <#BU>:: Bullet
|
128
|
+
# <#S1>:: Scan line 1
|
129
|
+
# <#S9>:: Scan line 9
|
130
|
+
#
|
131
|
+
# <#LA>:: Left Arrow
|
132
|
+
# <#RA>:: Right Arrow
|
133
|
+
# <#TA>:: Top Arrow
|
134
|
+
# <#BA>:: Bottom Arrow
|
135
|
+
#
|
136
|
+
# The character formats can be repeated using an optional numeric
|
137
|
+
# repeat value. To repeat a character add the repeat count within
|
138
|
+
# parentheses to the end of the character format.
|
139
|
+
#
|
140
|
+
# The following example draws 10 horizontal-line characters:
|
141
|
+
#
|
142
|
+
# <#HL(10)>
|
143
|
+
#
|
144
|
+
# And the most complex example until now. Guess what it does:
|
145
|
+
#
|
146
|
+
# "<C><#UL><#HL(26)><#UR>"
|
147
|
+
# "<C><#VL></R>This text should be boxed.<!R><#VL>"
|
148
|
+
# "<C><#LL><#HL(26)><#LR>"
|
149
|
+
# "<C>While this is not."
|
150
|
+
|
151
|
+
module RNDK
|
152
|
+
|
153
|
+
# Takes a String full of format markers and translates it
|
154
|
+
# into a chtype array.
|
155
|
+
#
|
156
|
+
# This is better suited to curses because curses uses
|
157
|
+
# chtype almost exclusively
|
158
|
+
def RNDK.char2Chtype(string, to, align)
|
159
|
+
to << 0
|
160
|
+
align << LEFT
|
161
|
+
result = []
|
162
|
+
|
163
|
+
if string.size > 0
|
164
|
+
used = 0
|
165
|
+
|
166
|
+
# The original code makes two passes since it has to pre-allocate space but
|
167
|
+
# we should be able to make do with one since we can dynamically size it
|
168
|
+
adjust = 0
|
169
|
+
attrib = Ncurses::A_NORMAL
|
170
|
+
last_char = 0
|
171
|
+
start = 0
|
172
|
+
used = 0
|
173
|
+
x = 3
|
174
|
+
|
175
|
+
# Look for an alignment marker.
|
176
|
+
if string[0] == L_MARKER
|
177
|
+
if string[1] == 'C' && string[2] == R_MARKER
|
178
|
+
align[0] = CENTER
|
179
|
+
start = 3
|
180
|
+
elsif string[1] == 'R' && string[2] == R_MARKER
|
181
|
+
align[0] = RIGHT
|
182
|
+
start = 3
|
183
|
+
elsif string[1] == 'L' && string[2] == R_MARKER
|
184
|
+
start = 3
|
185
|
+
elsif string[1] == 'B' && string[2] == '='
|
186
|
+
# Set the item index value in the string.
|
187
|
+
result = [' '.ord, ' '.ord, ' '.ord]
|
188
|
+
|
189
|
+
# Pull out the bullet marker.
|
190
|
+
while x < string.size and string[x] != R_MARKER
|
191
|
+
result << (string[x].ord | Ncurses::A_BOLD)
|
192
|
+
x += 1
|
193
|
+
end
|
194
|
+
adjust = 1
|
195
|
+
|
196
|
+
# Set the alignment variables
|
197
|
+
start = x
|
198
|
+
used = x
|
199
|
+
elsif string[1] == 'I' && string[2] == '='
|
200
|
+
from = 3
|
201
|
+
x = 0
|
202
|
+
|
203
|
+
while from < string.size && string[from] != Ncurses.R_MARKER
|
204
|
+
if RNDK.digit?(string[from])
|
205
|
+
adjust = adjust * 10 + string[from].to_i
|
206
|
+
x += 1
|
207
|
+
end
|
208
|
+
from += 1
|
209
|
+
end
|
210
|
+
|
211
|
+
start = x + 4
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
while adjust > 0
|
216
|
+
adjust -= 1
|
217
|
+
result << ' '
|
218
|
+
used += 1
|
219
|
+
end
|
220
|
+
|
221
|
+
# Set the format marker boolean to false
|
222
|
+
inside_marker = false
|
223
|
+
|
224
|
+
# Start parsing the character string.
|
225
|
+
from = start
|
226
|
+
while from < string.size
|
227
|
+
# Are we inside a format marker?
|
228
|
+
if !inside_marker
|
229
|
+
if string[from] == L_MARKER &&
|
230
|
+
['/', '!', '#'].include?(string[from + 1])
|
231
|
+
inside_marker = true
|
232
|
+
elsif string[from] == "\\" && string[from + 1] == L_MARKER
|
233
|
+
from += 1
|
234
|
+
result << (string[from].ord | attrib)
|
235
|
+
used += 1
|
236
|
+
from += 1
|
237
|
+
elsif string[from] == "\t"
|
238
|
+
begin
|
239
|
+
result << ' '
|
240
|
+
used += 1
|
241
|
+
end while (used & 7).nonzero?
|
242
|
+
else
|
243
|
+
result << (string[from].ord | attrib)
|
244
|
+
used += 1
|
245
|
+
end
|
246
|
+
else
|
247
|
+
case string[from]
|
248
|
+
when R_MARKER
|
249
|
+
inside_marker = false
|
250
|
+
when '#'
|
251
|
+
last_char = 0
|
252
|
+
case string[from + 2]
|
253
|
+
when 'L'
|
254
|
+
case string[from + 1]
|
255
|
+
when 'L'
|
256
|
+
last_char = Ncurses::ACS_LLCORNER
|
257
|
+
when 'U'
|
258
|
+
last_char = Ncurses::ACS_ULCORNER
|
259
|
+
when 'H'
|
260
|
+
last_char = Ncurses::ACS_HLINE
|
261
|
+
when 'V'
|
262
|
+
last_char = Ncurses::ACS_VLINE
|
263
|
+
when 'P'
|
264
|
+
last_char = Ncurses::ACS_PLUS
|
265
|
+
end
|
266
|
+
when 'R'
|
267
|
+
case string[from + 1]
|
268
|
+
when 'L'
|
269
|
+
last_char = Ncurses::ACS_LRCORNER
|
270
|
+
when 'U'
|
271
|
+
last_char = Ncurses::ACS_URCORNER
|
272
|
+
end
|
273
|
+
when 'T'
|
274
|
+
case string[from + 1]
|
275
|
+
when 'T'
|
276
|
+
last_char = Ncurses::ACS_TTEE
|
277
|
+
when 'R'
|
278
|
+
last_char = Ncurses::ACS_RTEE
|
279
|
+
when 'L'
|
280
|
+
last_char = Ncurses::ACS_LTEE
|
281
|
+
when 'B'
|
282
|
+
last_char = Ncurses::ACS_BTEE
|
283
|
+
end
|
284
|
+
when 'A'
|
285
|
+
case string[from + 1]
|
286
|
+
when 'L'
|
287
|
+
last_char = Ncurses::ACS_LARROW
|
288
|
+
when 'R'
|
289
|
+
last_char = Ncurses::ACS_RARROW
|
290
|
+
when 'U'
|
291
|
+
last_char = Ncurses::ACS_UARROW
|
292
|
+
when 'D'
|
293
|
+
last_char = Ncurses::ACS_DARROW
|
294
|
+
end
|
295
|
+
else
|
296
|
+
case [string[from + 1], string[from + 2]]
|
297
|
+
when ['D', 'I']
|
298
|
+
last_char = Ncurses::ACS_DIAMOND
|
299
|
+
when ['C', 'B']
|
300
|
+
last_char = Ncurses::ACS_CKBOARD
|
301
|
+
when ['D', 'G']
|
302
|
+
last_char = Ncurses::ACS_DEGREE
|
303
|
+
when ['P', 'M']
|
304
|
+
last_char = Ncurses::ACS_PLMINUS
|
305
|
+
when ['B', 'U']
|
306
|
+
last_char = Ncurses::ACS_BULLET
|
307
|
+
when ['S', '1']
|
308
|
+
last_char = Ncurses::ACS_S1
|
309
|
+
when ['S', '9']
|
310
|
+
last_char = Ncurses::ACS_S9
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
if last_char.nonzero?
|
315
|
+
adjust = 1
|
316
|
+
from += 2
|
317
|
+
|
318
|
+
if string[from + 1] == '('
|
319
|
+
# check for a possible numeric modifier
|
320
|
+
from += 2
|
321
|
+
adjust = 0
|
322
|
+
|
323
|
+
while from < string.size && string[from] != ')'
|
324
|
+
if RNDK.digit?(string[from])
|
325
|
+
adjust = (adjust * 10) + string[from].to_i
|
326
|
+
end
|
327
|
+
from += 1
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
(0...adjust).each do |x|
|
332
|
+
result << (last_char | attrib)
|
333
|
+
used += 1
|
334
|
+
end
|
335
|
+
when '/'
|
336
|
+
mask = []
|
337
|
+
from = RNDK.encodeAttribute(string, from, mask)
|
338
|
+
attrib |= mask[0]
|
339
|
+
when '!'
|
340
|
+
mask = []
|
341
|
+
from = RNDK.encodeAttribute(string, from, mask)
|
342
|
+
attrib &= ~(mask[0])
|
343
|
+
end
|
344
|
+
end
|
345
|
+
from += 1
|
346
|
+
end
|
347
|
+
|
348
|
+
if result.size == 0
|
349
|
+
result << attrib
|
350
|
+
end
|
351
|
+
to[0] = used
|
352
|
+
else
|
353
|
+
result = []
|
354
|
+
end
|
355
|
+
return result
|
356
|
+
end
|
357
|
+
|
358
|
+
# Compare a regular string to a chtype string
|
359
|
+
def RNDK.cmpStrChstr(str, chstr)
|
360
|
+
i = 0
|
361
|
+
r = 0
|
362
|
+
|
363
|
+
if str.nil? && chstr.nil?
|
364
|
+
return 0
|
365
|
+
elsif str.nil?
|
366
|
+
return 1
|
367
|
+
elsif chstr.nil?
|
368
|
+
return -1
|
369
|
+
end
|
370
|
+
|
371
|
+
while i < str.size && i < chstr.size
|
372
|
+
if str[r].ord < chstr[r]
|
373
|
+
return -1
|
374
|
+
elsif str[r].ord > chstr[r]
|
375
|
+
return 1
|
376
|
+
end
|
377
|
+
i += 1
|
378
|
+
end
|
379
|
+
|
380
|
+
if str.size < chstr.size
|
381
|
+
return -1
|
382
|
+
elsif str.size > chstr.size
|
383
|
+
return 1
|
384
|
+
else
|
385
|
+
return 0
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
def RNDK.CharOf chtype
|
390
|
+
(chtype.ord & 255).chr
|
391
|
+
end
|
392
|
+
|
393
|
+
# This returns a string from a chtype array
|
394
|
+
# Formatting codes are omitted.
|
395
|
+
def RNDK.chtype2Char(string)
|
396
|
+
newstring = ''
|
397
|
+
|
398
|
+
unless string.nil?
|
399
|
+
string.each do |char|
|
400
|
+
newstring << RNDK.CharOf(char)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
return newstring
|
405
|
+
end
|
406
|
+
|
407
|
+
# This returns a string from a chtype array
|
408
|
+
# Formatting codes are embedded
|
409
|
+
def RNDK.chtype2String(string)
|
410
|
+
newstring = ''
|
411
|
+
unless string.nil?
|
412
|
+
need = 0
|
413
|
+
(0...string.size).each do |x|
|
414
|
+
need = RNDK.decodeAttribute(newstring, need,
|
415
|
+
x > 0 ? string[x - 1] : 0, string[x])
|
416
|
+
newstring << string[x]
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
return newstring
|
421
|
+
end
|
422
|
+
|
423
|
+
# This takes a string, a field width, and a justification type
|
424
|
+
# and returns the adjustment to make, to fill the justification
|
425
|
+
# requirement
|
426
|
+
def RNDK.justifyString (box_width, mesg_length, justify)
|
427
|
+
|
428
|
+
# make sure the message isn't longer than the width
|
429
|
+
# if it is, return 0
|
430
|
+
if mesg_length >= box_width
|
431
|
+
return 0
|
432
|
+
end
|
433
|
+
|
434
|
+
# try to justify the message
|
435
|
+
case justify
|
436
|
+
when LEFT
|
437
|
+
0
|
438
|
+
when RIGHT
|
439
|
+
box_width - mesg_length
|
440
|
+
when CENTER
|
441
|
+
(box_width - mesg_length) / 2
|
442
|
+
else
|
443
|
+
justify
|
444
|
+
end
|
445
|
+
end
|
446
|
+
|
447
|
+
def RNDK.encodeAttribute (string, from, mask)
|
448
|
+
mask << 0
|
449
|
+
case string[from + 1]
|
450
|
+
when 'B'
|
451
|
+
mask[0] = Ncurses::A_BOLD
|
452
|
+
when 'D'
|
453
|
+
mask[0] = Ncurses::A_DIM
|
454
|
+
when 'K'
|
455
|
+
mask[0] = Ncurses::A_BLINK
|
456
|
+
when 'R'
|
457
|
+
mask[0] = Ncurses::A_REVERSE
|
458
|
+
when 'S'
|
459
|
+
mask[0] = Ncurses::A_STANDOUT
|
460
|
+
when 'U'
|
461
|
+
mask[0] = Ncurses::A_UNDERLINE
|
462
|
+
end
|
463
|
+
|
464
|
+
if mask[0] != 0
|
465
|
+
from += 1
|
466
|
+
elsif RNDK.digit?(string[from+1]) and RNDK.digit?(string[from + 2])
|
467
|
+
if Ncurses.has_colors
|
468
|
+
# XXX: Only checks if terminal has colours not if colours are started
|
469
|
+
pair = string[from + 1..from + 2].to_i
|
470
|
+
mask[0] = Ncurses.COLOR_PAIR(pair)
|
471
|
+
else
|
472
|
+
mask[0] = Ncurses.A_BOLD
|
473
|
+
end
|
474
|
+
|
475
|
+
from += 2
|
476
|
+
elsif RNDK.digit?(string[from + 1])
|
477
|
+
if Ncurses.has_colors
|
478
|
+
# XXX: Only checks if terminal has colours not if colours are started
|
479
|
+
pair = string[from + 1].to_i
|
480
|
+
mask[0] = Ncurses.COLOR_PAIR(pair)
|
481
|
+
else
|
482
|
+
mask[0] = Ncurses.A_BOLD
|
483
|
+
end
|
484
|
+
|
485
|
+
from += 1
|
486
|
+
end
|
487
|
+
|
488
|
+
return from
|
489
|
+
end
|
490
|
+
|
491
|
+
# The reverse of encodeAttribute
|
492
|
+
# Well, almost. If attributes such as bold and underline are combined in the
|
493
|
+
# same string, we do not necessarily reconstruct them in the same order.
|
494
|
+
# Also, alignment markers and tabs are lost.
|
495
|
+
def RNDK.decodeAttribute (string, from, oldattr, newattr)
|
496
|
+
table = {
|
497
|
+
'B' => Ncurses::A_BOLD,
|
498
|
+
'D' => Ncurses::A_DIM,
|
499
|
+
'K' => Ncurses::A_BLINK,
|
500
|
+
'R' => Ncurses::A_REVERSE,
|
501
|
+
'S' => Ncurses::A_STANDOUT,
|
502
|
+
'U' => Ncurses::A_UNDERLINE
|
503
|
+
}
|
504
|
+
|
505
|
+
result = if string.nil? then '' else string end
|
506
|
+
base_len = result.size
|
507
|
+
tmpattr = oldattr & Ncurses::A_ATTRIBUTES
|
508
|
+
|
509
|
+
newattr &= Ncurses::A_ATTRIBUTES
|
510
|
+
if tmpattr != newattr
|
511
|
+
while tmpattr != newattr
|
512
|
+
found = false
|
513
|
+
table.keys.each do |key|
|
514
|
+
if (table[key] & tmpattr) != (table[key] & newattr)
|
515
|
+
found = true
|
516
|
+
result << RNDK::L_MARKER
|
517
|
+
if (table[key] & tmpattr).nonzero?
|
518
|
+
result << '!'
|
519
|
+
tmpattr &= ~(table[key])
|
520
|
+
else
|
521
|
+
result << '/'
|
522
|
+
tmpattr |= table[key]
|
523
|
+
end
|
524
|
+
result << key
|
525
|
+
break
|
526
|
+
end
|
527
|
+
end
|
528
|
+
# XXX: Only checks if terminal has colours not if colours are started
|
529
|
+
if Ncurses.has_colors
|
530
|
+
if (tmpattr & Ncurses::A_COLOR) != (newattr & Ncurses::A_COLOR)
|
531
|
+
oldpair = Ncurses.PAIR_NUMBER(tmpattr)
|
532
|
+
newpair = Ncurses.PAIR_NUMBER(newattr)
|
533
|
+
if !found
|
534
|
+
found = true
|
535
|
+
result << RNDK::L_MARKER
|
536
|
+
end
|
537
|
+
if newpair.zero?
|
538
|
+
result << '!'
|
539
|
+
result << oldpair.to_s
|
540
|
+
else
|
541
|
+
result << '/'
|
542
|
+
result << newpair.to_s
|
543
|
+
end
|
544
|
+
tmpattr &= ~(Ncurses::A_COLOR)
|
545
|
+
newattr &= ~(Ncurses::A_COLOR)
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
if found
|
550
|
+
result << RNDK::R_MARKER
|
551
|
+
else
|
552
|
+
break
|
553
|
+
end
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
557
|
+
return from + result.size - base_len
|
558
|
+
end
|
559
|
+
|
560
|
+
end
|
561
|
+
|