ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
session_ui.cpp
Go to the documentation of this file.
1#include <emscripten/bind.h>
2#include <algorithm>
3extern "C" {
7#include "../common/capture.h"
8#include "../mirror.h"
9}
10
11#include <cstdint>
12#include <optional>
13#include <string>
14#include <vector>
15
16// Controller callbacks operate on the session currently handling browser input.
17static thread_local ui_session_t *active_session = nullptr;
18extern "C" terminal_size_t ui_controller_size(void) {
19 return ui_session_size(active_session);
20}
21extern "C" void ui_controller_redraw(void) {
22 ui_session_redraw(active_session);
23}
24
25// The C session owns the frame returned by tick. Copy it before the next call.
27public:
29 explicit SessionUiBinding(bool capture_logs) : session_(ui_session_create()) {
30 if (session_ && capture_logs)
32 }
34 if (session_)
35 ui_session_destroy(session_);
36 }
37
40
41 bool valid() const {
42 return session_ != nullptr;
43 }
44 void resize(int cols, int rows) {
45 ui_session_resize(session_, cols, rows);
46 }
47 void loading(bool loading, const std::string &message) {
48 ui_session_loading(session_, loading, message.c_str());
49 }
50 void log(const std::string &message) {
51 ui_session_log(session_, message.c_str());
52 }
53 int media(const std::string &text) {
54 return ui_session_media(session_, text.data(), text.size());
55 }
56 int key(int key) {
57 ui_session_t *previous = active_session;
58 active_session = session_;
59 int result = ui_session_input(session_, static_cast<keyboard_key_t>(key));
60 active_session = previous;
61 return result;
62 }
63 std::optional<std::string> tick(double milliseconds) {
64 ui_session_t *previous = active_session;
65 active_session = session_;
66 const char *frame = ui_session_tick(session_, static_cast<uint64_t>(milliseconds * 1000000));
67 active_session = previous;
68 return frame ? std::optional<std::string>(frame) : std::nullopt;
69 }
70 void clear() {
71 ui_session_clear(session_);
72 }
73 void redraw() {
74 ui_session_redraw(session_);
75 }
76
77private:
78 ui_session *session_;
79};
80
81EMSCRIPTEN_BINDINGS(ascii_chat_session_ui) {
82 emscripten::function(
83 "browser_ui_audio", +[](int value) { return static_cast<int>(options_set_bool("audio_enabled", value != 0)); });
84 emscripten::function("browser_ui_fps", +[]() { return static_cast<int>(GET_OPTION(fps_counter)); });
85 emscripten::function("browser_ui_volume", +[]() { return static_cast<double>(GET_OPTION(speakers_volume)); });
86 emscripten::class_<SessionUiBinding>("SessionUiBinding")
87 .constructor<>()
88 .constructor<bool>()
89 .function("valid", &SessionUiBinding::valid)
90 .function("resize", &SessionUiBinding::resize)
91 .function("loading", &SessionUiBinding::loading)
92 .function("log", &SessionUiBinding::log)
93 .function("media", &SessionUiBinding::media)
94 .function("key", &SessionUiBinding::key)
95 .function("tick", &SessionUiBinding::tick)
96 .function("clear", &SessionUiBinding::clear)
97 .function("redraw", &SessionUiBinding::redraw);
98}
int key(int key)
std::optional< std::string > tick(double milliseconds)
int media(const std::string &text)
void log(const std::string &message)
SessionUiBinding(const SessionUiBinding &)=delete
bool valid() const
void loading(bool loading, const std::string &message)
SessionUiBinding(bool capture_logs)
SessionUiBinding & operator=(const SessionUiBinding &)=delete
void resize(int cols, int rows)
unsigned long long uint64_t
Definition common.h:63
#define GET_OPTION(field)
Safely get a specific option field (lock-free read).
Definition options.h:1336
asciichat_error_t options_set_bool(const char *name, bool value)
Definition rcu.c:902
keyboard_key_t
Options for interactive line editing.
Definition keyboard.h:53
struct ui_session ui_session_t
void ui_session_redraw(ui_session_t *s)
void ui_session_resize(ui_session_t *s, int cols, int rows)
void ui_session_loading(ui_session_t *s, bool loading, const char *message)
void ui_session_destroy(ui_session_t *s)
asciichat_error_t ui_session_media(ui_session_t *s, const char *data, size_t length)
ui_session_action_t ui_session_input(ui_session_t *s, keyboard_key_t key)
terminal_size_t ui_session_size(const ui_session_t *s)
void ui_session_clear(ui_session_t *s)
void ui_session_capture_logs(ui_session_t *s)
const char * ui_session_tick(ui_session_t *s, uint64_t now_ns)
void ui_session_log(ui_session_t *s, const char *message)
ui_session_t * ui_session_create(void)
⚙️ Unified options parsing system for ascii-chat with builder pattern and lock-free access
return true
Definition queries.h:13
EMSCRIPTEN_BINDINGS(ascii_chat_session_ui)
void ui_controller_redraw(void)
terminal_size_t ui_controller_size(void)
This is the handoff point for ui session. Callers fill size, frame, media, logs before passing it on;...