Go Back

0 /*

1 MIT License

2

3 Copyright (c) 2010-2020 nsf <no.smile.face@gmail.com>

4 2015-2022 Adam Saponara <as@php.net>

5

6 Permission is hereby granted, free of charge, to any person obtaining a copy

7 of this software and associated documentation files (the "Software"), to deal

8 in the Software without restriction, including without limitation the rights

9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

10 copies of the Software, and to permit persons to whom the Software is

11 furnished to do so, subject to the following conditions:

12

13 The above copyright notice and this permission notice shall be included in all

14 copies or substantial portions of the Software.

15

16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE

22 SOFTWARE.

23 */

24

25 #ifndef __TERMBOX_H

26 #define __TERMBOX_H

27

28 /* __ffi_start */

29

30 #define TB_VERSION_STR "2.1.0-dev"

31

32 #if defined(TB_LIB_OPTS) || 0 /* __tb_lib_opts */

33 /* Ensure consistent compile-time options when using as a library */

34 #undef TB_OPT_TRUECOLOR

35 #undef TB_OPT_EGC

36 #undef TB_OPT_PRINTF_BUF

37 #undef TB_OPT_READ_BUF

38 #define TB_OPT_TRUECOLOR

39 #define TB_OPT_EGC

40 #endif

41

42 /* ASCII key constants (tb_event.key) */

43 #define TB_KEY_CTRL_TILDE 0x00

44 #define TB_KEY_CTRL_2 0x00 /* clash with 'CTRL_TILDE' */

45 #define TB_KEY_CTRL_A 0x01

46 #define TB_KEY_CTRL_B 0x02

47 #define TB_KEY_CTRL_C 0x03

48 #define TB_KEY_CTRL_D 0x04

49 #define TB_KEY_CTRL_E 0x05

50 #define TB_KEY_CTRL_F 0x06

51 #define TB_KEY_CTRL_G 0x07

52 #define TB_KEY_BACKSPACE 0x08

53 #define TB_KEY_CTRL_H 0x08 /* clash with 'CTRL_BACKSPACE' */

54 #define TB_KEY_TAB 0x09

55 #define TB_KEY_CTRL_I 0x09 /* clash with 'TAB' */

56 #define TB_KEY_CTRL_J 0x0a

57 #define TB_KEY_CTRL_K 0x0b

58 #define TB_KEY_CTRL_L 0x0c

59 #define TB_KEY_ENTER 0x0d

60 #define TB_KEY_CTRL_M 0x0d /* clash with 'ENTER' */

61 #define TB_KEY_CTRL_N 0x0e

62 #define TB_KEY_CTRL_O 0x0f

63 #define TB_KEY_CTRL_P 0x10

64 #define TB_KEY_CTRL_Q 0x11

65 #define TB_KEY_CTRL_R 0x12

66 #define TB_KEY_CTRL_S 0x13

67 #define TB_KEY_CTRL_T 0x14

68 #define TB_KEY_CTRL_U 0x15

69 #define TB_KEY_CTRL_V 0x16

70 #define TB_KEY_CTRL_W 0x17

71 #define TB_KEY_CTRL_X 0x18

72 #define TB_KEY_CTRL_Y 0x19

73 #define TB_KEY_CTRL_Z 0x1a

74 #define TB_KEY_ESC 0x1b

75 #define TB_KEY_CTRL_LSQ_BRACKET 0x1b /* clash with 'ESC' */

76 #define TB_KEY_CTRL_3 0x1b /* clash with 'ESC' */

77 #define TB_KEY_CTRL_4 0x1c

78 #define TB_KEY_CTRL_BACKSLASH 0x1c /* clash with 'CTRL_4' */

79 #define TB_KEY_CTRL_5 0x1d

80 #define TB_KEY_CTRL_RSQ_BRACKET 0x1d /* clash with 'CTRL_5' */

81 #define TB_KEY_CTRL_6 0x1e

82 #define TB_KEY_CTRL_7 0x1f

83 #define TB_KEY_CTRL_SLASH 0x1f /* clash with 'CTRL_7' */

84 #define TB_KEY_CTRL_UNDERSCORE 0x1f /* clash with 'CTRL_7' */

85 #define TB_KEY_SPACE 0x20

86 #define TB_KEY_BACKSPACE2 0x7f

87 #define TB_KEY_CTRL_8 0x7f /* clash with 'BACKSPACE2' */

88

89 #define tb_key_i(i) 0xffff - (i)

90 /* Terminal-dependent key constants (tb_event.key) and terminfo capabilities */

91 /* BEGIN codegen h */

92 /* Produced by ./codegen.sh on Sun, 19 Sep 2021 01:02:02 +0000 */

93 #define TB_KEY_F1 (0xffff - 0)

94 #define TB_KEY_F2 (0xffff - 1)

95 #define TB_KEY_F3 (0xffff - 2)

96 #define TB_KEY_F4 (0xffff - 3)

97 #define TB_KEY_F5 (0xffff - 4)

98 #define TB_KEY_F6 (0xffff - 5)

99 #define TB_KEY_F7 (0xffff - 6)

100 #define TB_KEY_F8 (0xffff - 7)

101 #define TB_KEY_F9 (0xffff - 8)

102 #define TB_KEY_F10 (0xffff - 9)

103 #define TB_KEY_F11 (0xffff - 10)

104 #define TB_KEY_F12 (0xffff - 11)

105 #define TB_KEY_INSERT (0xffff - 12)

106 #define TB_KEY_DELETE (0xffff - 13)

107 #define TB_KEY_HOME (0xffff - 14)

108 #define TB_KEY_END (0xffff - 15)

109 #define TB_KEY_PGUP (0xffff - 16)

110 #define TB_KEY_PGDN (0xffff - 17)

111 #define TB_KEY_ARROW_UP (0xffff - 18)

112 #define TB_KEY_ARROW_DOWN (0xffff - 19)

113 #define TB_KEY_ARROW_LEFT (0xffff - 20)

114 #define TB_KEY_ARROW_RIGHT (0xffff - 21)

115 #define TB_KEY_BACK_TAB (0xffff - 22)

116 #define TB_KEY_MOUSE_LEFT (0xffff - 23)

117 #define TB_KEY_MOUSE_RIGHT (0xffff - 24)

118 #define TB_KEY_MOUSE_MIDDLE (0xffff - 25)

119 #define TB_KEY_MOUSE_RELEASE (0xffff - 26)

120 #define TB_KEY_MOUSE_WHEEL_UP (0xffff - 27)

121 #define TB_KEY_MOUSE_WHEEL_DOWN (0xffff - 28)

122

123 #define TB_CAP_F1 0

124 #define TB_CAP_F2 1

125 #define TB_CAP_F3 2

126 #define TB_CAP_F4 3

127 #define TB_CAP_F5 4

128 #define TB_CAP_F6 5

129 #define TB_CAP_F7 6

130 #define TB_CAP_F8 7

131 #define TB_CAP_F9 8

132 #define TB_CAP_F10 9

133 #define TB_CAP_F11 10

134 #define TB_CAP_F12 11

135 #define TB_CAP_INSERT 12

136 #define TB_CAP_DELETE 13

137 #define TB_CAP_HOME 14

138 #define TB_CAP_END 15

139 #define TB_CAP_PGUP 16

140 #define TB_CAP_PGDN 17

141 #define TB_CAP_ARROW_UP 18

142 #define TB_CAP_ARROW_DOWN 19

143 #define TB_CAP_ARROW_LEFT 20

144 #define TB_CAP_ARROW_RIGHT 21

145 #define TB_CAP_BACK_TAB 22

146 #define TB_CAP__COUNT_KEYS 23

147 #define TB_CAP_ENTER_CA 23

148 #define TB_CAP_EXIT_CA 24

149 #define TB_CAP_SHOW_CURSOR 25

150 #define TB_CAP_HIDE_CURSOR 26

151 #define TB_CAP_CLEAR_SCREEN 27

152 #define TB_CAP_SGR0 28

153 #define TB_CAP_UNDERLINE 29

154 #define TB_CAP_BOLD 30

155 #define TB_CAP_BLINK 31

156 #define TB_CAP_ITALIC 32

157 #define TB_CAP_REVERSE 33

158 #define TB_CAP_ENTER_KEYPAD 34

159 #define TB_CAP_EXIT_KEYPAD 35

160 #define TB_CAP__COUNT 36

161 /* END codegen h */

162

163 /* Some hard-coded caps */

164 #define TB_HARDCAP_ENTER_MOUSE "\x1b[?1000h\x1b[?1002h\x1b[?1015h\x1b[?1006h"

165 #define TB_HARDCAP_EXIT_MOUSE "\x1b[?1006l\x1b[?1015l\x1b[?1002l\x1b[?1000l"

166

167 /* Colors (numeric) and attributes (bitwise) (tb_cell.fg, tb_cell.bg) */

168 #define TB_BLACK 0x0001

169 #define TB_RED 0x0002

170 #define TB_GREEN 0x0003

171 #define TB_YELLOW 0x0004

172 #define TB_BLUE 0x0005

173 #define TB_MAGENTA 0x0006

174 #define TB_CYAN 0x0007

175 #define TB_WHITE 0x0008

176 #define TB_BOLD 0x0100

177 #define TB_UNDERLINE 0x0200

178 #define TB_REVERSE 0x0400

179 #define TB_ITALIC 0x0800

180 #define TB_BLINK 0x1000

181 #define TB_DEFAULT 0x2000

182 #ifdef TB_OPT_TRUECOLOR

183 #define TB_TRUECOLOR_BOLD 0x01000000

184 #define TB_TRUECOLOR_UNDERLINE 0x02000000

185 #define TB_TRUECOLOR_REVERSE 0x04000000

186 #define TB_TRUECOLOR_ITALIC 0x08000000

187 #define TB_TRUECOLOR_BLINK 0x10000000

188 #define TB_TRUECOLOR_DEFAULT 0x20000000

189 #endif

190

191 /* Event types (tb_event.type) */

192 #define TB_EVENT_KEY 1

193 #define TB_EVENT_RESIZE 2

194 #define TB_EVENT_MOUSE 3

195

196 /* Key modifiers (bitwise) (tb_event.mod) */

197 #define TB_MOD_ALT 1

198 #define TB_MOD_CTRL 2

199 #define TB_MOD_SHIFT 4

200 #define TB_MOD_MOTION 8

201

202 /* Input modes (bitwise) (tb_set_input_mode) */

203 #define TB_INPUT_CURRENT 0

204 #define TB_INPUT_ESC 1

205 #define TB_INPUT_ALT 2

206 #define TB_INPUT_MOUSE 4

207

208 /* Output modes (tb_set_output_mode) */

209 #define TB_OUTPUT_CURRENT 0

210 #define TB_OUTPUT_NORMAL 1

211 #define TB_OUTPUT_256 2

212 #define TB_OUTPUT_216 3

213 #define TB_OUTPUT_GRAYSCALE 4

214 #ifdef TB_OPT_TRUECOLOR

215 #define TB_OUTPUT_TRUECOLOR 5

216 #endif

217

218 /* Common function return values unless otherwise noted.

219 *

220 * Library behavior is undefined after receiving TB_ERR_MEM. Callers may

221 * attempt reinitializing by freeing memory, invoking tb_shutdown, then

222 * tb_init.

223 */

224 #define TB_OK 0

225 #define TB_ERR -1

226 #define TB_ERR_NEED_MORE -2

227 #define TB_ERR_INIT_ALREADY -3

228 #define TB_ERR_INIT_OPEN -4

229 #define TB_ERR_MEM -5

230 #define TB_ERR_NO_EVENT -6

231 #define TB_ERR_NO_TERM -7

232 #define TB_ERR_NOT_INIT -8

233 #define TB_ERR_OUT_OF_BOUNDS -9

234 #define TB_ERR_READ -10

235 #define TB_ERR_RESIZE_IOCTL -11

236 #define TB_ERR_RESIZE_PIPE -12

237 #define TB_ERR_RESIZE_SIGACTION -13

238 #define TB_ERR_POLL -14

239 #define TB_ERR_TCGETATTR -15

240 #define TB_ERR_TCSETATTR -16

241 #define TB_ERR_UNSUPPORTED_TERM -17

242 #define TB_ERR_RESIZE_WRITE -18

243 #define TB_ERR_RESIZE_POLL -19

244 #define TB_ERR_RESIZE_READ -20

245 #define TB_ERR_RESIZE_SSCANF -21

246 #define TB_ERR_CAP_COLLISION -22

247

248 #define TB_ERR_SELECT TB_ERR_POLL

249 #define TB_ERR_RESIZE_SELECT TB_ERR_RESIZE_POLL

250

251 /* Function types to be used with tb_set_func() */

252 #define TB_FUNC_EXTRACT_PRE 0

253 #define TB_FUNC_EXTRACT_POST 1

254

255 /* Define this to set the size of the buffer used in tb_printf()

256 * and tb_sendf()

257 */

258 #ifndef TB_OPT_PRINTF_BUF

259 #define TB_OPT_PRINTF_BUF 4096

260 #endif

261

262 /* Define this to set the size of the read buffer used when reading

263 * from the tty

264 */

265 #ifndef TB_OPT_READ_BUF

266 #define TB_OPT_READ_BUF 64

267 #endif

268

269 /* Define this for limited back compat with termbox v1 */

270 #ifdef TB_OPT_V1_COMPAT

271 #define tb_change_cell tb_set_cell

272 #define tb_put_cell(x, y, c) tb_set_cell((x), (y), (c)->ch, (c)->fg, (c)->bg)

273 #define tb_set_clear_attributes tb_set_clear_attrs

274 #define tb_select_input_mode tb_set_input_mode

275 #define tb_select_output_mode tb_set_output_mode

276 #endif

277

278 /* Define these to swap in a different allocator */

279 #ifndef tb_malloc

280 #define tb_malloc malloc

281 #define tb_realloc realloc

282 #define tb_free free

283 #endif

284

285 #ifdef TB_OPT_TRUECOLOR

286 typedef uint32_t uintattr_t;

287 #else

288 typedef uint16_t uintattr_t;

289 #endif

290

291 /* The terminal screen is represented as 2d array of cells. The structure is

292 * optimized for dealing with single-width (wcwidth()==1) Unicode code points,

293 * however some support for grapheme clusters (e.g., combining diacritical

294 * marks) and wide code points (e.g., Hiragana) is provided through ech, nech,

295 * cech via tb_set_cell_ex(). ech is only valid when nech>0, otherwise ch is

296 * used.

297 *

298 * For non-single-width code points, given N=wcwidth(ch)/wcswidth(ech):

299 *

300 * when N==0: termbox forces a single-width cell. Callers should avoid this

301 * if aiming to render text accurately.

302 *

303 * when N>1: termbox zeroes out the following N-1 cells and skips sending

304 * them to the tty. So, e.g., if the caller sets x=0,y=0 to an N==2

305 * code point, the caller's next set should be at x=2,y=0. Anything

306 * set at x=1,y=0 will be ignored. If there are not enough columns

307 * remaining on the line to render N width, spaces are sent

308 * instead.

309 *

310 * See tb_present() for implementation.

311 */

312 struct tb_cell {

313 uint32_t ch; /* a Unicode character */

314 uintattr_t fg; /* bitwise foreground attributes */

315 uintattr_t bg; /* bitwise background attributes */

316 #ifdef TB_OPT_EGC

317 uint32_t *ech; /* a grapheme cluster of Unicode code points */

318 size_t nech; /* length in bytes of ech, 0 means use ch instead of ech */

319 size_t cech; /* capacity in bytes of ech */

320 #endif

321 };

322

323 /* An incoming event from the tty.

324 *

325 * Given the event type, the following fields are relevant:

326 *

327 * when TB_EVENT_KEY: (key XOR ch, one will be zero), mod. Note there is

328 * overlap between TB_MOD_CTRL and TB_KEY_CTRL_*.

329 * TB_MOD_CTRL and TB_MOD_SHIFT are only set as

330 * modifiers to TB_KEY_ARROW_*.

331 *

332 * when TB_EVENT_RESIZE: w, h

333 *

334 * when TB_EVENT_MOUSE: key (TB_KEY_MOUSE_*), x, y

335 */

336 struct tb_event {

337 uint8_t type; /* one of TB_EVENT_* constants */

338 uint8_t mod; /* bitwise TB_MOD_* constants */

339 uint16_t key; /* one of TB_KEY_* constants */

340 uint32_t ch; /* a Unicode code point */

341 int32_t w; /* resize width */

342 int32_t h; /* resize height */

343 int32_t x; /* mouse x */

344 int32_t y; /* mouse y */

345 };

346

347 /* Initializes the termbox library. This function should be called before any

348 * other functions. tb_init() is equivalent to tb_init_file("/dev/tty"). After

349 * successful initialization, the library must be finalized using the

350 * tb_shutdown() function.

351 */

352 int tb_init(void);

353 int tb_init_file(const char *path);

354 int tb_init_fd(int ttyfd);

355 int tb_init_rwfd(int rfd, int wfd);

356 int tb_shutdown(void);

357

358 /* Returns the size of the internal back buffer (which is the same as terminal's

359 * window size in rows and columns). The internal buffer can be resized after

360 * tb_clear() or tb_present() function calls. Both dimensions have an

361 * unspecified negative value when called before tb_init() or after

362 * tb_shutdown().

363 */

364 int tb_width(void);

365 int tb_height(void);

366

367 /* Clears the internal back buffer using TB_DEFAULT color or the

368 * color/attributes set by tb_set_clear_attrs() function.

369 */

370 int tb_clear(void);

371 int tb_set_clear_attrs(uintattr_t fg, uintattr_t bg);

372

373 /* Synchronizes the internal back buffer with the terminal by writing to tty. */

374 int tb_present(void);

375

376 /* Sets the position of the cursor. Upper-left character is (0, 0). */

377 int tb_set_cursor(int cx, int cy);

378 int tb_hide_cursor(void);

379

380 /* Set cell contents in the internal back buffer at the specified position.

381 *

382 * Use tb_set_cell_ex() for rendering grapheme clusters (e.g., combining

383 * diacritical marks).

384 *

385 * Function tb_set_cell(x, y, ch, fg, bg) is equivalent to

386 * tb_set_cell_ex(x, y, &ch, 1, fg, bg).

387 *

388 * Function tb_extend_cell() is a shortcut for appending 1 code point to

389 * cell->ech.

390 */

391 int tb_set_cell(int x, int y, uint32_t ch, uintattr_t fg, uintattr_t bg);

392 int tb_set_cell_ex(int x, int y, uint32_t *ch, size_t nch, uintattr_t fg,

393 uintattr_t bg);

394 int tb_extend_cell(int x, int y, uint32_t ch);

395

396 /* Sets the input mode. Termbox has two input modes:

397 *

398 * 1. TB_INPUT_ESC

399 * When escape (\x1b) is in the buffer and there's no match for an escape

400 * sequence, a key event for TB_KEY_ESC is returned.

401 *

402 * 2. TB_INPUT_ALT

403 * When escape (\x1b) is in the buffer and there's no match for an escape

404 * sequence, the next keyboard event is returned with a TB_MOD_ALT modifier.

405 *

406 * You can also apply TB_INPUT_MOUSE via bitwise OR operation to either of the

407 * modes (e.g., TB_INPUT_ESC | TB_INPUT_MOUSE) to receive TB_EVENT_MOUSE events.

408 * If none of the main two modes were set, but the mouse mode was, TB_INPUT_ESC

409 * mode is used. If for some reason you've decided to use

410 * (TB_INPUT_ESC | TB_INPUT_ALT) combination, it will behave as if only

411 * TB_INPUT_ESC was selected.

412 *

413 * If mode is TB_INPUT_CURRENT, the function returns the current input mode.

414 *

415 * The default input mode is TB_INPUT_ESC.

416 */

417 int tb_set_input_mode(int mode);

418

419 /* Sets the termbox output mode. Termbox has multiple output modes:

420 *

421 * 1. TB_OUTPUT_NORMAL => [0..8]

422 *

423 * This mode provides 8 different colors:

424 * TB_BLACK, TB_RED, TB_GREEN, TB_YELLOW,

425 * TB_BLUE, TB_MAGENTA, TB_CYAN, TB_WHITE

426 *

427 * Plus TB_DEFAULT which skips sending a color code (i.e., uses the

428 * terminal's default color).

429 *

430 * Colors (including TB_DEFAULT) may be bitwise OR'd with attributes:

431 * TB_BOLD, TB_UNDERLINE, TB_REVERSE, TB_ITALIC, TB_BLINK

432 *

433 * The value 0 is interpreted as TB_DEFAULT.

434 *

435 * Some notes: TB_REVERSE can be applied as either fg or bg attributes for

436 * the same effect. TB_BOLD, TB_UNDERLINE, TB_ITALIC, TB_BLINK apply as fg

437 * attributes only, and are ignored as bg attributes.

438 *

439 * Example usage:

440 * tb_set_cell(x, y, '@', TB_BLACK | TB_BOLD, TB_RED);

441 *

442 * 2. TB_OUTPUT_256 => [0..255]

443 *

444 * In this mode you get 256 distinct colors:

445 * 0x00 - 0x07: the 8 colors as in TB_OUTPUT_NORMAL

446 * 0x08 - 0x0f: bright versions of the above

447 * 0x10 - 0xe7: 216 different colors

448 * 0xe8 - 0xff: 24 different shades of grey

449 *

450 * Attributes may be bitwise OR'd as in TB_OUTPUT_NORMAL.

451 *

452 * In this mode 0x00 represents TB_BLACK, so TB_DEFAULT must be used for

453 * default colors.

454 *

455 * 3. TB_OUTPUT_216 => [0..216]

456 *

457 * This mode supports the 3rd range of TB_OUTPUT_256 only, but you don't

458 * need to provide an offset.

459 *

460 * The value 0 is interpreted as TB_DEFAULT.

461 *

462 * 4. TB_OUTPUT_GRAYSCALE => [0..24]

463 *

464 * This mode supports the 4th range of TB_OUTPUT_256 only, but you don't

465 * need to provide an offset.

466 *

467 * The value 0 is interpreted as TB_DEFAULT.

468 *

469 * 5. TB_OUTPUT_TRUECOLOR => [0x000000..0xffffff]

470 *

471 * This mode provides 24-bit color on supported terminals. The format is

472 * 0xRRGGBB. Colors may be bitwise OR'd with `TB_TRUECOLOR_*` attributes.

473 *

474 * In this mode 0x000000 represents black, so TB_TRUECOLOR_DEFAULT must be

475 * used for default colors.

476 *

477 * If mode is TB_OUTPUT_CURRENT, the function returns the current output mode.

478 *

479 * The default output mode is TB_OUTPUT_NORMAL.

480 *

481 * To use the terminal default color (i.e., to not send an escape code), pass

482 * TB_DEFAULT (or TB_TRUECOLOR_DEFAULT in TB_OUTPUT_TRUECOLOR mode). For

483 * convenience, the value 0 is interpreted as TB_DEFAULT in TB_OUTPUT_NORMAL,

484 * TB_OUTPUT_216, and TB_OUTPUT_GRAYSCALE.

485 *

486 * Note, not all terminals support all output modes, especially beyond

487 * TB_OUTPUT_NORMAL. There is also no very reliable way to determine color

488 * support dynamically. If portability is desired, callers are recommended to

489 * use TB_OUTPUT_NORMAL or make output mode end-user configurable.

490 */

491 int tb_set_output_mode(int mode);

492

493 /* Wait for an event up to timeout_ms milliseconds and fill the event structure

494 * with it. If no event is available within the timeout period, TB_ERR_NO_EVENT

495 * is returned. On a resize event, the underlying select(2) call may be

496 * interrupted, yielding a return code of TB_ERR_POLL. In this case, you may

497 * check errno via tb_last_errno(). If it's EINTR, you can safely ignore that

498 * and call tb_peek_event() again.

499 */

500 int tb_peek_event(struct tb_event *event, int timeout_ms);

501

502 /* Same as tb_peek_event except no timeout. */

503 int tb_poll_event(struct tb_event *event);

504

505 /* Internal termbox FDs that can be used with poll() / select(). Must call

506 * tb_poll_event() / tb_peek_event() if activity is detected. */

507 int tb_get_fds(int *ttyfd, int *resizefd);

508

509 /* Print and printf functions. Specify param out_w to determine width of printed

510 * string.

511 */

512 int tb_print(int x, int y, uintattr_t fg, uintattr_t bg, const char *str);

513 int tb_printf(int x, int y, uintattr_t fg, uintattr_t bg, const char *fmt, ...);

514 int tb_print_ex(int x, int y, uintattr_t fg, uintattr_t bg, size_t *out_w,

515 const char *str);

516 int tb_printf_ex(int x, int y, uintattr_t fg, uintattr_t bg, size_t *out_w,

517 const char *fmt, ...);

518

519 /* Send raw bytes to terminal. */

520 int tb_send(const char *buf, size_t nbuf);

521 int tb_sendf(const char *fmt, ...);

522

523 /* Set custom functions. fn_type is one of TB_FUNC_* constants, fn is a

524 * compatible function pointer, or NULL to clear.

525 *

526 * TB_FUNC_EXTRACT_PRE:

527 * If specified, invoke this function BEFORE termbox tries to extract any

528 * escape sequences from the input buffer.

529 *

530 * TB_FUNC_EXTRACT_POST:

531 * If specified, invoke this function AFTER termbox tries (and fails) to

532 * extract any escape sequences from the input buffer.

533 */

534 int tb_set_func(int fn_type, int (*fn)(struct tb_event *, size_t *));

535

536 /* Utility functions. */

537 int tb_utf8_char_length(char c);

538 int tb_utf8_char_to_unicode(uint32_t *out, const char *c);

539 int tb_utf8_unicode_to_char(char *out, uint32_t c);

540 int tb_last_errno(void);

541 const char *tb_strerror(int err);

542 struct tb_cell *tb_cell_buffer(void);

543 int tb_has_truecolor(void);

544 int tb_has_egc(void);

545 const char *tb_version(void);

546

547 #endif /* __TERMBOX_H */

548