#ifndef FLYWHEEL_H
#define FLYWHEEL_H
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
#define FLYWHEEL_VERSION "0.1.0"
#define FLYWHEEL_VERSION_MAJOR 0
#define FLYWHEEL_VERSION_MINOR 1
#define FLYWHEEL_VERSION_PATCH 0
typedef struct FlywheelEngine FlywheelEngine;
typedef struct FlywheelStream FlywheelStream;
typedef enum FlywheelResult {
FLYWHEEL_RESULT_OK = 0,
FLYWHEEL_RESULT_NULL_POINTER = 1,
FLYWHEEL_RESULT_INVALID_UTF8 = 2,
FLYWHEEL_RESULT_IO_ERROR = 3,
FLYWHEEL_RESULT_OUT_OF_BOUNDS = 4,
FLYWHEEL_RESULT_NOT_RUNNING = 5,
} FlywheelResult;
typedef enum FlywheelEventType {
FLYWHEEL_EVENT_NONE = 0,
FLYWHEEL_EVENT_KEY = 1,
FLYWHEEL_EVENT_RESIZE = 2,
FLYWHEEL_EVENT_ERROR = 3,
FLYWHEEL_EVENT_SHUTDOWN = 4,
} FlywheelEventType;
#define FLYWHEEL_KEY_NONE 0
#define FLYWHEEL_KEY_ENTER 1
#define FLYWHEEL_KEY_ESCAPE 2
#define FLYWHEEL_KEY_BACKSPACE 3
#define FLYWHEEL_KEY_TAB 4
#define FLYWHEEL_KEY_LEFT 5
#define FLYWHEEL_KEY_RIGHT 6
#define FLYWHEEL_KEY_UP 7
#define FLYWHEEL_KEY_DOWN 8
#define FLYWHEEL_KEY_HOME 9
#define FLYWHEEL_KEY_END 10
#define FLYWHEEL_KEY_PAGE_UP 11
#define FLYWHEEL_KEY_PAGE_DOWN 12
#define FLYWHEEL_KEY_DELETE 13
#define FLYWHEEL_MOD_SHIFT 1
#define FLYWHEEL_MOD_CTRL 2
#define FLYWHEEL_MOD_ALT 4
#define FLYWHEEL_MOD_SUPER 8
typedef struct FlywheelKeyEvent {
uint32_t char_code;
int key_code;
unsigned int modifiers;
} FlywheelKeyEvent;
typedef struct FlywheelResizeEvent {
uint16_t width;
uint16_t height;
} FlywheelResizeEvent;
typedef struct FlywheelEvent {
FlywheelEventType event_type;
FlywheelKeyEvent key;
FlywheelResizeEvent resize;
} FlywheelEvent;
FlywheelEngine* flywheel_engine_new(void);
void flywheel_engine_destroy(FlywheelEngine* engine);
uint16_t flywheel_engine_width(const FlywheelEngine* engine);
uint16_t flywheel_engine_height(const FlywheelEngine* engine);
bool flywheel_engine_is_running(const FlywheelEngine* engine);
void flywheel_engine_stop(FlywheelEngine* engine);
FlywheelEventType flywheel_engine_poll_event(const FlywheelEngine* engine, FlywheelEvent* event_out);
void flywheel_engine_handle_resize(FlywheelEngine* engine, uint16_t width, uint16_t height);
void flywheel_engine_request_redraw(const FlywheelEngine* engine);
void flywheel_engine_request_update(const FlywheelEngine* engine);
void flywheel_engine_begin_frame(FlywheelEngine* engine);
void flywheel_engine_end_frame(FlywheelEngine* engine);
void flywheel_engine_set_cell(FlywheelEngine* engine, uint16_t x, uint16_t y,
char c, uint32_t fg, uint32_t bg);
uint16_t flywheel_engine_draw_text(FlywheelEngine* engine, uint16_t x, uint16_t y,
const char* text, uint32_t fg, uint32_t bg);
void flywheel_engine_clear(FlywheelEngine* engine);
void flywheel_engine_fill_rect(FlywheelEngine* engine, uint16_t x, uint16_t y,
uint16_t width, uint16_t height,
char c, uint32_t fg, uint32_t bg);
FlywheelStream* flywheel_stream_new(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
void flywheel_stream_destroy(FlywheelStream* stream);
int flywheel_stream_append(FlywheelStream* stream, const char* text);
void flywheel_stream_render(FlywheelStream* stream, FlywheelEngine* engine);
void flywheel_stream_clear(FlywheelStream* stream);
void flywheel_stream_set_fg(FlywheelStream* stream, uint32_t color);
void flywheel_stream_set_bg(FlywheelStream* stream, uint32_t color);
void flywheel_stream_scroll_up(FlywheelStream* stream, size_t lines);
void flywheel_stream_scroll_down(FlywheelStream* stream, size_t lines);
uint32_t flywheel_rgb(uint8_t r, uint8_t g, uint8_t b);
const char* flywheel_version(void);
#ifdef __cplusplus
}
#endif
#endif