ascii-chat 0.8.38
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
mirror/main.c
Go to the documentation of this file.
1
31#include "main.h"
32#include <ascii-chat/session/client_like.h>
33#include <ascii-chat/session/capture.h>
34#include <ascii-chat/session/display.h>
35#include <ascii-chat/session/render.h>
36#include <ascii-chat/session/keyboard_handler.h>
37#include <ascii-chat/log/logging.h>
38
39/* ============================================================================
40 * Mode-Specific Keyboard Handler
41 * ============================================================================ */
42
50static void mirror_keyboard_handler(session_capture_ctx_t *capture, int key, void *user_data) {
51 session_display_ctx_t *display = (session_display_ctx_t *)user_data;
52 session_handle_keyboard_input(capture, display, (keyboard_key_t)key);
53}
54
55/* ============================================================================
56 * Mode-Specific Main Loop
57 * ============================================================================ */
58
70static asciichat_error_t mirror_run(session_capture_ctx_t *capture, session_display_ctx_t *display, void *user_data) {
71 (void)user_data; // Unused
72
73 // Get the render loop's should_exit callback from session_client_like
74 bool (*render_should_exit)(void *) = session_client_like_get_render_should_exit();
75 if (!render_should_exit) {
76 return SET_ERRNO(ERROR_INVALID_STATE, "Render should_exit callback not initialized");
77 }
78
79 // Run the unified render loop with keyboard support
80 return session_render_loop(capture, display,
81 render_should_exit, // Exit check (checks global + custom)
82 NULL, // No custom capture callback
83 NULL, // No custom sleep callback
84 mirror_keyboard_handler, // Keyboard handler
85 display); // user_data for keyboard handler
86}
87
88/* ============================================================================
89 * Mirror Mode Entry Point
90 * ============================================================================ */
91
102int mirror_main(void) {
103 // Configure mode-specific session settings
104 session_client_like_config_t config = {
105 .run_fn = mirror_run,
106 .run_user_data = NULL,
107 .keyboard_handler = mirror_keyboard_handler,
108 .print_newline_on_tty_exit = true, // Mirror prints newline to separate frame from prompt
109 };
110
111 // Run shared initialization/teardown with mode-specific loop
112 asciichat_error_t result = session_client_like_run(&config);
113
114 if (result != ASCIICHAT_OK) {
115 log_error("Mirror mode failed with error code: %d", result);
116 }
117
118 return (int)result;
119}
asciichat_error_t session_client_like_run(const session_client_like_config_t *config)
Definition client_like.c:96
bool(*)(void *) session_client_like_get_render_should_exit(void)
Definition client_like.c:50
void session_handle_keyboard_input(session_capture_ctx_t *capture, session_display_ctx_t *display, keyboard_key_t key)
asciichat_error_t session_render_loop(session_capture_ctx_t *capture, session_display_ctx_t *display, session_should_exit_fn should_exit, session_capture_fn capture_cb, session_sleep_for_frame_fn sleep_cb, session_keyboard_handler_fn keyboard_handler, void *user_data)
int mirror_main(void)
Run mirror mode main loop.
ascii-chat Server Mode Entry Point Header
#define bool
Definition stdbool.h:22
Internal session display context structure.