reflex-terminal 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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.doc/ext/reflex-terminal/native.cpp +19 -0
  3. data/.doc/ext/reflex-terminal/renderer.cpp +110 -0
  4. data/.doc/ext/reflex-terminal/terminal.cpp +530 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  6. data/.github/workflows/release-gem.yml +60 -0
  7. data/.github/workflows/tag.yml +35 -0
  8. data/.github/workflows/test.yml +46 -0
  9. data/.github/workflows/utils.rb +127 -0
  10. data/CONTRIBUTING.md +7 -0
  11. data/ChangeLog.md +6 -0
  12. data/Gemfile +5 -0
  13. data/LICENSE +21 -0
  14. data/README.md +100 -0
  15. data/Rakefile +44 -0
  16. data/VERSION +1 -0
  17. data/examples/terminal.rb +101 -0
  18. data/ext/reflex-terminal/defs.h +17 -0
  19. data/ext/reflex-terminal/extconf.rb +29 -0
  20. data/ext/reflex-terminal/native.cpp +19 -0
  21. data/ext/reflex-terminal/renderer.cpp +118 -0
  22. data/ext/reflex-terminal/terminal.cpp +572 -0
  23. data/include/reflex/terminal.h +233 -0
  24. data/include/reflex-terminal/defs.h +36 -0
  25. data/include/reflex-terminal/renderer.h +57 -0
  26. data/include/reflex-terminal/ruby/renderer.h +41 -0
  27. data/include/reflex-terminal/ruby/terminal.h +43 -0
  28. data/include/reflex-terminal/ruby.h +11 -0
  29. data/include/reflex-terminal.h +13 -0
  30. data/lib/reflex/bell_event.rb +15 -0
  31. data/lib/reflex/terminal.rb +168 -0
  32. data/lib/reflex/terminal_view.rb +268 -0
  33. data/lib/reflex-terminal/ext.rb +2 -0
  34. data/lib/reflex-terminal/extension.rb +41 -0
  35. data/lib/reflex-terminal.rb +7 -0
  36. data/reflex-terminal.gemspec +39 -0
  37. data/src/pty.cpp +236 -0
  38. data/src/renderer.cpp +365 -0
  39. data/src/terminal.cpp +1547 -0
  40. data/src/terminal.h +66 -0
  41. data/src/win32/pty.cpp +387 -0
  42. data/test/helper.rb +11 -0
  43. data/test/test_renderer.rb +113 -0
  44. data/test/test_terminal.rb +683 -0
  45. data/test/test_terminal_view.rb +182 -0
  46. metadata +152 -0
@@ -0,0 +1,118 @@
1
+ #include "reflex-terminal/ruby/renderer.h"
2
+
3
+
4
+ #include <rays/ruby/bounds.h>
5
+ #include <rays/ruby/font.h>
6
+ #include <rays/ruby/painter.h>
7
+ #include <reflex-terminal/ruby/terminal.h>
8
+ #include "defs.h"
9
+
10
+
11
+ RUCY_DEFINE_VALUE_FROM_TO(REFLEX_TERMINAL_EXPORT, ReflexTerminal::Renderer)
12
+
13
+ #define THIS to<ReflexTerminal::Renderer*>(self)
14
+
15
+ #define CHECK RUCY_CHECK_OBJ(ReflexTerminal::Renderer, self)
16
+
17
+
18
+ static
19
+ RUCY_DEF_ALLOC(alloc, klass)
20
+ {
21
+ return new_type<ReflexTerminal::Renderer>(klass);
22
+ }
23
+ RUCY_END
24
+
25
+ static
26
+ RUCY_DEF1(set_font, font)
27
+ {
28
+ CHECK;
29
+ THIS->set_font(to<Rays::Font&>(font));
30
+ return font;
31
+ }
32
+ RUCY_END
33
+
34
+ static
35
+ RUCY_DEF0(get_font)
36
+ {
37
+ CHECK;
38
+ return value(THIS->font());
39
+ }
40
+ RUCY_END
41
+
42
+ static
43
+ RUCY_DEF0(get_cell_width)
44
+ {
45
+ CHECK;
46
+ return value(THIS->cell_width());
47
+ }
48
+ RUCY_END
49
+
50
+ static
51
+ RUCY_DEF0(get_cell_height)
52
+ {
53
+ CHECK;
54
+ return value(THIS->cell_height());
55
+ }
56
+ RUCY_END
57
+
58
+ static
59
+ RUCY_DEF1(bake_glyphs, terminal)
60
+ {
61
+ CHECK;
62
+ THIS->bake_glyphs(to<Reflex::Terminal&>(terminal));
63
+ return self;
64
+ }
65
+ RUCY_END
66
+
67
+ static
68
+ RUCY_DEF0(get_glyph_count)
69
+ {
70
+ CHECK;
71
+ return value(THIS->glyph_count());
72
+ }
73
+ RUCY_END
74
+
75
+ static
76
+ RUCY_DEF3(draw, painter, terminal, bounds)
77
+ {
78
+ CHECK;
79
+ THIS->draw(
80
+ to<Rays::Painter*>(painter),
81
+ to<Reflex::Terminal&>(terminal),
82
+ to<Rays::Bounds>(bounds));
83
+ return self;
84
+ }
85
+ RUCY_END
86
+
87
+
88
+ static Class cRenderer;
89
+
90
+ void
91
+ Init_reflex_terminal_renderer ()
92
+ {
93
+ Module mReflexTerminal = define_module("ReflexTerminal");
94
+
95
+ cRenderer = mReflexTerminal.define_class("Renderer");
96
+ cRenderer.define_alloc_func(alloc);
97
+ cRenderer.define_method("font=", set_font);
98
+ cRenderer.define_method("font", get_font);
99
+ cRenderer.define_method("cell_width", get_cell_width);
100
+ cRenderer.define_method("cell_height", get_cell_height);
101
+ cRenderer.define_method("bake_glyphs", bake_glyphs);
102
+ cRenderer.define_method( "glyph_count", get_glyph_count);
103
+ cRenderer.define_method("draw", draw);
104
+ }
105
+
106
+
107
+ namespace ReflexTerminal
108
+ {
109
+
110
+
111
+ Class
112
+ renderer_class ()
113
+ {
114
+ return cRenderer;
115
+ }
116
+
117
+
118
+ }// ReflexTerminal
@@ -0,0 +1,572 @@
1
+ #include "reflex-terminal/ruby/terminal.h"
2
+
3
+
4
+ #include <xot/exception.h>
5
+ #include <rays/ruby/color.h>
6
+ #include <reflex/ruby/event.h>
7
+ #include "defs.h"
8
+
9
+
10
+ RUCY_DEFINE_VALUE_FROM_TO(REFLEX_TERMINAL_EXPORT, Reflex::Terminal)
11
+
12
+ RUCY_DEFINE_CONVERT_TO(REFLEX_TERMINAL_EXPORT, Reflex::Terminal::OptionAsAlt)
13
+
14
+ #define THIS to<Reflex::Terminal*>(self)
15
+
16
+ #define CHECK RUCY_CHECK_OBJECT(Reflex::Terminal, self)
17
+
18
+
19
+ static
20
+ RUCY_DEF_ALLOC(alloc, klass)
21
+ {
22
+ return new_type<Reflex::Terminal>(klass);
23
+ }
24
+ RUCY_END
25
+
26
+ static
27
+ RUCY_DEF3(initialize, columns, rows, scrollback)
28
+ {
29
+ RUCY_CHECK_OBJ(Reflex::Terminal, self);
30
+
31
+ *THIS = Reflex::Terminal(to<int>(columns), to<int>(rows), to<size_t>(scrollback));
32
+ return self;
33
+ }
34
+ RUCY_END
35
+
36
+ static
37
+ RUCY_DEF1(initialize_copy, obj)
38
+ {
39
+ Xot::invalid_state_error(__FILE__, __LINE__, "can not duplicate Terminal");
40
+ }
41
+ RUCY_END
42
+
43
+ static
44
+ RUCY_DEF0(update)
45
+ {
46
+ CHECK;
47
+ return value(THIS->update());
48
+ }
49
+ RUCY_END
50
+
51
+ static
52
+ RUCY_DEF0(reset)
53
+ {
54
+ CHECK;
55
+ THIS->reset();
56
+ return self;
57
+ }
58
+ RUCY_END
59
+
60
+ static
61
+ RUCY_DEF6(resize, columns, rows, cell_width, cell_height, screen_width, screen_height)
62
+ {
63
+ CHECK;
64
+ THIS->resize(
65
+ to<int>(columns), to<int>(rows),
66
+ to<int>(cell_width), to<int>(cell_height),
67
+ to<int>(screen_width), to<int>(screen_height));
68
+ return self;
69
+ }
70
+ RUCY_END
71
+
72
+ static
73
+ RUCY_DEF1(feed, bytes)
74
+ {
75
+ CHECK;
76
+ if (!bytes.is_s())
77
+ Rucy::type_error(__FILE__, __LINE__, "bytes must be a String");
78
+
79
+ // feed() takes a raw byte stream, so avoid to<const char*>/c_str()
80
+ // (StringValueCStr rejects NUL bytes) and Value#size (character
81
+ // count, not the byte length)
82
+ RubyValue str = bytes.value();
83
+ THIS->feed(RSTRING_PTR(str), RSTRING_LEN(str));
84
+ return self;
85
+ }
86
+ RUCY_END
87
+
88
+ static
89
+ RUCY_DEF0(read_pending_input)
90
+ {
91
+ CHECK;
92
+ // a raw byte stream for the child process
93
+ Reflex::String input = THIS->read_pending_input();
94
+ return value(input.data(), input.size(), rb_ascii8bit_encoding());
95
+ }
96
+ RUCY_END
97
+
98
+ static
99
+ RUCY_DEF2(spawn, args, envs)
100
+ {
101
+ CHECK;
102
+
103
+ Reflex::StringList list;
104
+ for (size_t i = 0, size = args.size(); i < size; ++i)
105
+ list.emplace_back(args[i].c_str());
106
+
107
+ Reflex::Terminal::EnvMap map;
108
+ Value names = envs.call("keys");
109
+ for (size_t i = 0, size = names.size(); i < size; ++i)
110
+ {
111
+ Value name = names[i];
112
+ Value value = envs.get(name);
113
+ if (value)
114
+ map[name.c_str()] = value.c_str();
115
+ else
116
+ map[name.c_str()] = std::nullopt;// nil removes the variable
117
+ }
118
+
119
+ THIS->spawn(list, map);
120
+ return self;
121
+ }
122
+ RUCY_END
123
+
124
+ static
125
+ RUCY_DEF0(close)
126
+ {
127
+ CHECK;
128
+ THIS->close();
129
+ return self;
130
+ }
131
+ RUCY_END
132
+
133
+ static
134
+ RUCY_DEF1(write, bytes)
135
+ {
136
+ CHECK;
137
+ if (!bytes.is_s())
138
+ Rucy::type_error(__FILE__, __LINE__, "bytes must be a String");
139
+
140
+ // write() takes a raw byte stream (see feed)
141
+ RubyValue str = bytes.value();
142
+ THIS->write(RSTRING_PTR(str), RSTRING_LEN(str));
143
+ return self;
144
+ }
145
+ RUCY_END
146
+
147
+ static
148
+ RUCY_DEF1(write_key, event)
149
+ {
150
+ CHECK;
151
+ THIS->write_key(to<Reflex::KeyEvent&>(event));
152
+ return self;
153
+ }
154
+ RUCY_END
155
+
156
+ static
157
+ RUCY_DEF1(write_pointer, event)
158
+ {
159
+ CHECK;
160
+ THIS->write_pointer(to<Reflex::PointerEvent&>(event));
161
+ return self;
162
+ }
163
+ RUCY_END
164
+
165
+ static
166
+ RUCY_DEF1(write_wheel, event)
167
+ {
168
+ CHECK;
169
+ THIS->write_wheel(to<Reflex::WheelEvent&>(event));
170
+ return self;
171
+ }
172
+ RUCY_END
173
+
174
+ static
175
+ RUCY_DEF1(paste, text)
176
+ {
177
+ CHECK;
178
+ if (!text.is_s())
179
+ Rucy::type_error(__FILE__, __LINE__, "text must be a String");
180
+
181
+ RubyValue str = text.value();
182
+ THIS->paste(RSTRING_PTR(str), RSTRING_LEN(str));
183
+ return self;
184
+ }
185
+ RUCY_END
186
+
187
+ static
188
+ RUCY_DEF0(is_alive)
189
+ {
190
+ CHECK;
191
+ return value(THIS->is_alive());
192
+ }
193
+ RUCY_END
194
+
195
+ static
196
+ RUCY_DEF0(is_mouse_tracking)
197
+ {
198
+ CHECK;
199
+ return value(THIS->is_mouse_tracking());
200
+ }
201
+ RUCY_END
202
+
203
+ static
204
+ RUCY_DEF4(select, x1, y1, x2, y2)
205
+ {
206
+ CHECK;
207
+ THIS->select(to<int>(x1), to<int>(y1), to<int>(x2), to<int>(y2));
208
+ return self;
209
+ }
210
+ RUCY_END
211
+
212
+ static
213
+ RUCY_DEF4(select_rect, x1, y1, x2, y2)
214
+ {
215
+ CHECK;
216
+ THIS->select_rect(to<int>(x1), to<int>(y1), to<int>(x2), to<int>(y2));
217
+ return self;
218
+ }
219
+ RUCY_END
220
+
221
+ static
222
+ RUCY_DEF2(select_word, x, y)
223
+ {
224
+ CHECK;
225
+ THIS->select_word(to<int>(x), to<int>(y));
226
+ return self;
227
+ }
228
+ RUCY_END
229
+
230
+ static
231
+ RUCY_DEF1(select_line, y)
232
+ {
233
+ CHECK;
234
+ THIS->select_line(to<int>(y));
235
+ return self;
236
+ }
237
+ RUCY_END
238
+
239
+ static
240
+ RUCY_DEF0(deselect)
241
+ {
242
+ CHECK;
243
+ THIS->deselect();
244
+ return self;
245
+ }
246
+ RUCY_END
247
+
248
+ static
249
+ RUCY_DEF0(has_selection)
250
+ {
251
+ CHECK;
252
+ return value(THIS->has_selection());
253
+ }
254
+ RUCY_END
255
+
256
+ static
257
+ RUCY_DEF0(get_selected_text)
258
+ {
259
+ CHECK;
260
+ Reflex::String text = THIS->selected_text();
261
+ return value(text.c_str(), text.size(), rb_utf8_encoding());
262
+ }
263
+ RUCY_END
264
+
265
+ static
266
+ RUCY_DEF1(scroll_to, row)
267
+ {
268
+ CHECK;
269
+ THIS->scroll_to(to<int>(row));
270
+ return self;
271
+ }
272
+ RUCY_END
273
+
274
+ static
275
+ RUCY_DEF1(scroll_by, rows)
276
+ {
277
+ CHECK;
278
+ THIS->scroll_by(to<int>(rows));
279
+ return self;
280
+ }
281
+ RUCY_END
282
+
283
+ static
284
+ RUCY_DEF0(get_scroll)
285
+ {
286
+ CHECK;
287
+ return value(THIS->scroll());
288
+ }
289
+ RUCY_END
290
+
291
+ static
292
+ RUCY_DEF0(each_line)
293
+ {
294
+ CHECK;
295
+
296
+ for (const auto& line : THIS->lines())
297
+ yield(value(line.c_str(), line.size(), rb_utf8_encoding()));
298
+ return self;
299
+ }
300
+ RUCY_END
301
+
302
+ static
303
+ RUCY_DEF0(each_span)
304
+ {
305
+ CHECK;
306
+
307
+ const auto& rows = THIS->spans();
308
+ for (size_t y = 0; y < rows.size(); ++y)
309
+ {
310
+ for (const auto& span : rows[y])
311
+ {
312
+ yield(
313
+ value(span.x), value((int) y), value(span.width),
314
+ value(span.text.c_str(), span.text.size(), rb_utf8_encoding()),
315
+ span.fg == Reflex::Terminal::Span::COLOR_NONE ? nil() : value(span.fg),
316
+ span.bg == Reflex::Terminal::Span::COLOR_NONE ? nil() : value(span.bg),
317
+ value(span.attribs));
318
+ }
319
+ }
320
+ return self;
321
+ }
322
+ RUCY_END
323
+
324
+ static
325
+ RUCY_DEF1(set_option_as_alt, state)
326
+ {
327
+ CHECK;
328
+ THIS->set_option_as_alt(to<Reflex::Terminal::OptionAsAlt>(state));
329
+ return state;
330
+ }
331
+ RUCY_END
332
+
333
+ static
334
+ RUCY_DEF0(get_option_as_alt)
335
+ {
336
+ CHECK;
337
+ return value((int) THIS->option_as_alt());
338
+ }
339
+ RUCY_END
340
+
341
+ static
342
+ RUCY_DEF0(get_columns)
343
+ {
344
+ CHECK;
345
+ return value(THIS->columns());
346
+ }
347
+ RUCY_END
348
+
349
+ static
350
+ RUCY_DEF0(get_rows)
351
+ {
352
+ CHECK;
353
+ return value(THIS->rows());
354
+ }
355
+ RUCY_END
356
+
357
+ static
358
+ RUCY_DEF0(get_cursor)
359
+ {
360
+ CHECK;
361
+
362
+ Reflex::Terminal::Cursor cursor = THIS->cursor();
363
+ Value values[] = {
364
+ value(cursor.x),
365
+ value(cursor.y),
366
+ value((int) cursor.style),
367
+ value(cursor.visible)
368
+ };
369
+ return array(values, 4);
370
+ }
371
+ RUCY_END
372
+
373
+ static Reflex::Terminal::ColorIndex
374
+ to_color_index (Value index)
375
+ {
376
+ int i = to<int>(index);
377
+ if (i < Reflex::Terminal::COLOR_FOREGROUND || Reflex::Terminal::COLOR_PALETTE_LAST < i)
378
+ Rucy::argument_error(__FILE__, __LINE__, "invalid color index: %d", i);
379
+
380
+ return (Reflex::Terminal::ColorIndex) i;
381
+ }
382
+
383
+ static
384
+ RUCY_DEF2(set_default_color, index, color)
385
+ {
386
+ CHECK;
387
+ THIS->set_default_color(to_color_index(index), to<Rays::Color>(color));
388
+ }
389
+ RUCY_END
390
+
391
+ static
392
+ RUCY_DEF1(clear_default_color, index)
393
+ {
394
+ CHECK;
395
+ THIS->clear_default_color(to_color_index(index));
396
+ }
397
+ RUCY_END
398
+
399
+ static
400
+ RUCY_DEF1(get_default_color, index)
401
+ {
402
+ CHECK;
403
+
404
+ Rays::Color color;
405
+ if (THIS->get_default_color(to_color_index(index), &color))
406
+ return value(color);
407
+ }
408
+ RUCY_END
409
+
410
+ static
411
+ RUCY_DEF1(get_color, index)
412
+ {
413
+ CHECK;
414
+
415
+ Rays::Color color;
416
+ if (THIS->get_color(to_color_index(index), &color))
417
+ return value(color);
418
+ }
419
+ RUCY_END
420
+
421
+ static
422
+ RUCY_DEF0(get_title)
423
+ {
424
+ CHECK;
425
+ return value(THIS->title(), rb_utf8_encoding());
426
+ }
427
+ RUCY_END
428
+
429
+ static
430
+ RUCY_DEF0(get_history_rows)
431
+ {
432
+ CHECK;
433
+ return value(THIS->history_rows());
434
+ }
435
+ RUCY_END
436
+
437
+ static
438
+ RUCY_DEF2(get_history_lines, offset, size)
439
+ {
440
+ CHECK;
441
+
442
+ Value result = array(NULL, 0);// a std::vector<Value> would be invisible to the gc
443
+ for (const auto& line : THIS->get_history_lines(to<int>(offset), to<int>(size)))
444
+ result.push(value(line.c_str(), line.size(), rb_utf8_encoding()));
445
+ return result;
446
+ }
447
+ RUCY_END
448
+
449
+ static
450
+ RUCY_DEF0(get_bells)
451
+ {
452
+ CHECK;
453
+ return value(THIS->bells());
454
+ }
455
+ RUCY_END
456
+
457
+
458
+ static Class cTerminal;
459
+
460
+ void
461
+ Init_reflex_terminal ()
462
+ {
463
+ Module mReflex = define_module("Reflex");
464
+
465
+ cTerminal = mReflex.define_class("Terminal");
466
+ cTerminal.define_alloc_func(alloc);
467
+ cTerminal.define_private_method("initialize!", initialize);
468
+ cTerminal.define_private_method("initialize_copy", initialize_copy);
469
+ cTerminal.define_method("update", update);
470
+ cTerminal.define_method("reset", reset);
471
+ cTerminal.define_method("resize!", resize);
472
+ cTerminal.define_method("feed", feed);
473
+ cTerminal.define_method("read_pending_input", read_pending_input);
474
+ cTerminal.define_method("spawn!", spawn);
475
+ cTerminal.define_method("close", close);
476
+ cTerminal.define_method("write", write);
477
+ cTerminal.define_method("write_key", write_key);
478
+ cTerminal.define_method("write_pointer", write_pointer);
479
+ cTerminal.define_method("write_wheel", write_wheel);
480
+ cTerminal.define_method("paste", paste);
481
+ cTerminal.define_method("alive?", is_alive);
482
+ cTerminal.define_method("mouse_tracking?", is_mouse_tracking);
483
+ cTerminal.define_method( "select", select);
484
+ cTerminal.define_method( "select_rect", select_rect);
485
+ cTerminal.define_method( "select_word", select_word);
486
+ cTerminal.define_method( "select_line", select_line);
487
+ cTerminal.define_method("deselect", deselect);
488
+ cTerminal.define_method( "selection?", has_selection);
489
+ cTerminal.define_method( "selected_text", get_selected_text);
490
+ cTerminal.define_method("scroll_to", scroll_to);
491
+ cTerminal.define_method("scroll_by", scroll_by);
492
+ cTerminal.define_method("scroll", get_scroll);
493
+ cTerminal.define_private_method("each_line!", each_line);
494
+ cTerminal.define_private_method("each_span!", each_span);
495
+ cTerminal.define_method("option_as_alt=", set_option_as_alt);
496
+ cTerminal.define_method("option_as_alt", get_option_as_alt);
497
+ cTerminal.define_method("columns", get_columns);
498
+ cTerminal.define_method("rows", get_rows);
499
+ cTerminal.define_method("cursor", get_cursor);
500
+ cTerminal.define_private_method( "set_default_color!", set_default_color);
501
+ cTerminal.define_private_method("clear_default_color!", clear_default_color);
502
+ cTerminal.define_private_method( "get_default_color!", get_default_color);
503
+ cTerminal.define_private_method( "get_color!", get_color);
504
+ cTerminal.define_method("title", get_title);
505
+ cTerminal.define_method( "history_rows", get_history_rows);
506
+ cTerminal.define_private_method("get_history_lines!", get_history_lines);
507
+ cTerminal.define_method("bells", get_bells);
508
+
509
+ cTerminal.define_const("BOLD", Reflex::Terminal::Span::BOLD);
510
+ cTerminal.define_const("ITALIC", Reflex::Terminal::Span::ITALIC);
511
+ cTerminal.define_const("FAINT", Reflex::Terminal::Span::FAINT);
512
+ cTerminal.define_const("BLINK", Reflex::Terminal::Span::BLINK);
513
+ cTerminal.define_const("INVISIBLE", Reflex::Terminal::Span::INVISIBLE);
514
+ cTerminal.define_const("STRIKETHROUGH", Reflex::Terminal::Span::STRIKETHROUGH);
515
+ cTerminal.define_const("OVERLINE", Reflex::Terminal::Span::OVERLINE);
516
+ cTerminal.define_const("INVERSE", Reflex::Terminal::Span::INVERSE);
517
+ cTerminal.define_const("SELECTED", Reflex::Terminal::Span::SELECTED);
518
+ cTerminal.define_const("UNDERLINE_SHIFT", Reflex::Terminal::Span::UNDERLINE_SHIFT);
519
+ cTerminal.define_const("UNDERLINE_MASK", Reflex::Terminal::Span::UNDERLINE_MASK);
520
+
521
+ cTerminal.define_const("CURSOR_BAR", Reflex::Terminal::Cursor::BAR);
522
+ cTerminal.define_const("CURSOR_BLOCK", Reflex::Terminal::Cursor::BLOCK);
523
+ cTerminal.define_const("CURSOR_UNDERLINE", Reflex::Terminal::Cursor::UNDERLINE);
524
+ cTerminal.define_const("CURSOR_BLOCK_HOLLOW", Reflex::Terminal::Cursor::BLOCK_HOLLOW);
525
+
526
+ cTerminal.define_const("COLOR_FOREGROUND", Reflex::Terminal::COLOR_FOREGROUND);
527
+ cTerminal.define_const("COLOR_BACKGROUND", Reflex::Terminal::COLOR_BACKGROUND);
528
+ cTerminal.define_const("COLOR_CURSOR", Reflex::Terminal::COLOR_CURSOR);
529
+ cTerminal.define_const("COLOR_PALETTE_FIRST", Reflex::Terminal::COLOR_PALETTE_FIRST);
530
+ cTerminal.define_const("COLOR_PALETTE_LAST", Reflex::Terminal::COLOR_PALETTE_LAST);
531
+
532
+ cTerminal.define_const("OPTION_AS_ALT_OFF", Reflex::Terminal::OPTION_AS_ALT_OFF);
533
+ cTerminal.define_const("OPTION_AS_ALT_ON", Reflex::Terminal::OPTION_AS_ALT_ON);
534
+ cTerminal.define_const("OPTION_AS_ALT_LEFT", Reflex::Terminal::OPTION_AS_ALT_LEFT);
535
+ cTerminal.define_const("OPTION_AS_ALT_RIGHT", Reflex::Terminal::OPTION_AS_ALT_RIGHT);
536
+ }
537
+
538
+
539
+ namespace Rucy
540
+ {
541
+
542
+
543
+ template <> REFLEX_TERMINAL_EXPORT Reflex::Terminal::OptionAsAlt
544
+ value_to<Reflex::Terminal::OptionAsAlt> (
545
+ int argc, const Value* argv, bool convert)
546
+ {
547
+ if (argc <= 0 || !argv)
548
+ argument_error(__FILE__, __LINE__);
549
+
550
+ int state = value_to<int>(*argv, convert);
551
+ if (state < 0 || Reflex::Terminal::OPTION_AS_ALT_MAX <= state)
552
+ argument_error(__FILE__, __LINE__, "invalid option_as_alt state");
553
+
554
+ return (Reflex::Terminal::OptionAsAlt) state;
555
+ }
556
+
557
+
558
+ }// Rucy
559
+
560
+
561
+ namespace Reflex
562
+ {
563
+
564
+
565
+ Class
566
+ terminal_class ()
567
+ {
568
+ return cTerminal;
569
+ }
570
+
571
+
572
+ }// Reflex