Id: | To index | |
Original: | Legend | |
Status: | ||
Mutant: | Show |
Testcases to display
Filter by kind
Filter by status
1: # include "window.h" |
2: # include "termbox.h" |
3: |
4: # include < iostream > |
5: # include < thread > |
6: |
7: # ifdef NO_WINDOW // Null window (for testing) |
8: |
9: # include < iostream > |
10: # include < thread > |
11: |
12: Window :: Window ( ) { } |
13: Window :: ~ Window ( ) { } |
14: |
15: int32_t Window :: width ( ) const { return 256 ; } |
16: int32_t Window :: height ( ) const { return 128 ; } |
17: |
18: bool Window :: handleEvents ( ) { |
19: events_ . clear ( ) ; |
20: static int i = 0 ; |
21: static const std :: vector < WindowEvent > evs { WindowEvent :: ArrowUp , WindowEvent :: ArrowLeft , |
22: WindowEvent :: ArrowDown , WindowEvent :: ArrowRight } ; |
23: events_ . push_back ( evs [ ( i ++ ) % 4 ] ) ; |
24: return true ; |
25: } |
26: |
27: void Window :: render ( ) { |
28: std :: cout << "Window::render()\n" ; |
29: using namespace std :: chrono_literals ; |
30: const auto delayPerFrame = 15ms ; |
31: if ( delayPerFrame != 0ms ) { |
32: std :: this_thread :: sleep_for ( delayPerFrame ) ; |
33: } |
34: } |
35: |
36: void Window :: clear ( ) { } |
37: |
38: void Window :: set ( int x , int y , char c , uint16_t fg , uint16_t bg ) { |
39: layoutEvents . push_back ( Pos { x , y , c } ) ; |
40: } |
41: |
42: # else // Terminal |
43: |
44: Window :: Window ( ) { |
45: int code = tb_init ( ) ; |
46: if ( code < 0 ) { |
47: std :: cerr << "termbox init failed, code: %d\n" ; |
48: throw std :: runtime_error ( "termbox failed" ) ; |
49: } |
50: |
51: tb_select_input_mode ( TB_INPUT_ESC ) ; |
52: tb_clear ( ) ; |
53: tb_select_output_mode ( TB_OUTPUT_NORMAL ) ; |
54: } |
55: |
56: Window :: ~ Window ( ) { tb_shutdown ( ) ; } |
57: |
58: bool Window :: handleEvents ( ) { |
59: events_ . clear ( ) ; |
60: |
61: struct tb_event ev ; |
62: if ( tb_peek_event ( & ev , 10 ) ) { |
63: switch ( ev . type ) { |
64: case TB_EVENT_KEY : |
65: switch ( ev . key ) { |
66: case TB_KEY_ESC : |
67: return false ; |
68: break ; |
69: case TB_KEY_ARROW_LEFT : |
70: events_ . push_back ( WindowEvent :: ArrowLeft ) ; |
71: break ; |
72: case TB_KEY_ARROW_RIGHT : |
73: events_ . push_back ( WindowEvent :: ArrowRight ) ; |
74: break ; |
75: case TB_KEY_ARROW_UP : |
76: events_ . push_back ( WindowEvent :: ArrowUp ) ; |
77: break ; |
78: case TB_KEY_ARROW_DOWN : |
79: events_ . push_back ( WindowEvent :: ArrowDown ) ; |
80: break ; |
81: } |
82: break ; |
83: case TB_EVENT_RESIZE : |
84: // draw_all(); |
85: break ; |
86: } |
87: } |
88: |
89: return true ; |
90: } |
91: |
92: void Window :: render ( ) { |
93: using namespace std :: chrono_literals ; |
94: const auto delayPerFrame = 15ms ; |
95: |
96: tb_present ( ) ; |
97: |
98: if ( delayPerFrame != 0ms ) { |
99: std :: this_thread :: sleep_for ( delayPerFrame ) ; |
100: } |
101: } |
102: |
103: void Window :: clear ( ) { tb_clear ( ) ; } |
104: |
105: void Window :: set ( int x , int y , char c , uint16_t fg , uint16_t bg ) { |
106: tb_change_cell ( x , y , c , fg , bg ) ; |
107: } |
108: |
109: int32_t Window :: width ( ) const { return tb_width ( ) ; } |
110: |
111: int32_t Window :: height ( ) const { return tb_height ( ) ; } |
112: |
113: # endif |