#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include "toolkit.h"
#include "../common/message.h"
#include "../common/threadpool.h"
#include "../common/app.h"
#include <cx/hash_map.h>
#include <cx/printf.h>
static const char *ui_app_name;
static UiMessageHandler *message_handler;
static ui_callback onstartup;
static void *onstartupdata;
static UiQueue *event_queue;
static CxMap *srv_obj_map;
static uint64_t srv_obj_id_counter =
0;
void ui_init(
const char *appname,
int argc,
char **argv) {
ui_app_name = appname;
message_handler = uic_simple_msg_handler(
STDIN_FILENO,
STDOUT_FILENO, ui_server_message_received);
srv_obj_map = cxHashMapCreateSimple(
CX_STORE_POINTERS);
}
const char* ui_appname() {
return ui_app_name;
}
void ui_add_styledata(
const char *styledata,
int len) {
}
void ui_server_message_received(cxstring msg) {
}
void ui_main(
void) {
uic_simple_msg_handler_start(message_handler);
uic_application_startup(
NULL);
event_queue = ui_queue_create();
UiServerEvent *event =
NULL;
while((event = ui_queue_get_wait(event_queue)) !=
NULL) {
if(event->callback) {
event->callback(&event->event, event->userdata);
}
}
ui_queue_free(event_queue);
}
typedef struct CallMain {
UiServerEvent event;
ui_threadfunc func;
void *data;
} CallMain;
static void mainthr(UiServerEventData *event,
void *userdata) {
CallMain *c = userdata;
if(c->func) {
c->func(c->data);
}
free(c);
}
void ui_call_mainthread(ui_threadfunc tf,
void* td) {
CallMain *c = malloc(
sizeof(CallMain));
c->func = tf;
c->data = td;
ui_queue_put(event_queue, c);
}
void ui_show(UiObject *obj) {
if(!obj->widget->sent) {
cxmutstr msg = obj->widget->serialize(obj->widget);
obj->widget->sent =
TRUE;
uic_message_send(message_handler, msg);
free(msg.ptr);
}
cxmutstr msg = cx_asprintf(
"{\"type\":\"show\", \"obj\":\"%s\"}\n", obj->widget->obj->id.ptr);
obj->widget->invisible =
FALSE;
uic_message_send(message_handler, msg);
free(msg.ptr);
}
UiSrvObj* ui_create_server_object(UiContext *ctx) {
const CxAllocator *a = ctx->allocator;
UiSrvObj *obj = cxZalloc(a,
sizeof(UiSrvObj));
char id[
32];
snprintf(id,
32,
"%" PRIx64, srv_obj_id_counter++);
obj->id = cx_strdup_a(a, id);
obj->ctx = ctx;
obj->widgets = cxHashMapCreate(a,
CX_STORE_POINTERS,
64);
return obj;
}
void ui_reg_widget(UiWidget *widget) {
UiSrvObj *obj = widget->obj;
char id[
32];
snprintf(id,
32,
"%" PRIx64, obj->widget_id_counter++);
widget->id = cx_strdup_a(widget->obj->ctx->allocator, cx_str(id));
cxMapPut(obj->widgets, id, widget);
}