| git.druid.rocks | index | militantprogrammer | astral_canvas | src/ | api/ | canvas.c |
src/api/canvas.c
#include "api/canvas.h"
#include "api/apiInternal.h"
#include "lib/error.h"
#include "lib/lib.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static Widget failedWidget(void)
{
return (Widget){ .id = 0, .widgetType = A_WIDGET_PAGE };
}
static Widget queueWidget(WidgetType type, Position2D position, Size size,
int fontSize, char *text, void *callback)
{
CreateWidgetPayload *payload;
Widget widget;
payload = calloc(1, sizeof(*payload));
if (!payload) return failedWidget();
widget.id = libAllocId();
widget.widgetType = type;
if (widget.id == 0) {
free(payload);
return failedWidget();
}
payload->id = widget.id;
payload->parentId = 0;
payload->widgetType = type;
payload->position = position;
payload->size = size;
payload->fontSize = fontSize;
payload->callback = callback;
if (text)
snprintf(payload->text, sizeof(payload->text), "%s", text);
if (libPushToWorker(jobCreateWidget, payload, 1) != 0) {
libFreeId(widget.id);
return failedWidget();
}
return widget;
}
Widget A_Init(int width, int height, const char *title, const CanvasOptions *opt)
{
if (libStart(width, height, title, opt) != 0)
return failedWidget();
return (Widget){ .id = 0, .widgetType = A_WIDGET_PAGE };
}
const char *A_LastError(void)
{
const char *err = canvasErrorGet();
return err ? err : "";
}
int A_CloseWindow(void)
{
libStop();
return 0;
}
int A_Wait(void)
{
libWait();
return 0;
}
int A_IsOpen(void)
{
return libIsOpen();
}
Widget A_SetStyle(Style theme)
{
SetStylePayload *payload = calloc(1, sizeof(*payload));
if (!payload)
return failedWidget();
payload->id = 0;
payload->style = theme;
if (libPushToWorker(jobSetStyle, payload, 1) != 0)
return failedWidget();
return (Widget){ .id = 0, .widgetType = A_WIDGET_PAGE };
}
void A_ApplyShader(Widget *widget, char *shader)
{
ApplyShaderPayload *payload;
if (!widget)
return;
payload = calloc(1, sizeof(*payload));
if (!payload)
return;
payload->id = widget->id;
if (shader)
snprintf(payload->shader, sizeof(payload->shader), "%s", shader);
libPushToWorker(jobApplyShader, payload, 1);
}
Widget A_CreatePage(Position2D position, Size size)
{
return queueWidget(A_WIDGET_PAGE, position, size, 0, NULL, NULL);
}
Widget A_CreateBox(Position2D position, Size size)
{
return queueWidget(A_WIDGET_BOX, position, size, 0, NULL, NULL);
}
Widget A_CreateButton(Position2D position, Size size, char *text, void *callback)
{
return queueWidget(A_WIDGET_BUTTON, position, size, 0, text, callback);
}
Widget A_CreateLabel(Position2D position, int fontSize, char *value)
{
Size size = {0, 0};
return queueWidget(A_WIDGET_LABEL, position, size, fontSize, value, NULL);
}
Widget A_CreateText(Position2D position, int fontSize, char *value)
{
Size size = {0, 0};
return queueWidget(A_WIDGET_TEXT, position, size, fontSize, value, NULL);
}
Widget A_CreateTextField(Position2D position, Size size, char *value)
{
return queueWidget(A_WIDGET_TEXTFIELD, position, size, 0, value, NULL);
}
Widget A_CreateImage(Position2D position, Size size, char *path)
{
return queueWidget(A_WIDGET_IMAGE, position, size, 0, path, NULL);
}
Widget A_CreateCheckbox(Position2D position, Size size)
{
return queueWidget(A_WIDGET_CHECKBOX, position, size, 0, NULL, NULL);
}
Widget A_CreateSlider(Position2D position, Size size)
{
return queueWidget(A_WIDGET_SLIDER, position, size, 0, NULL, NULL);
}
int A_SetParent(Widget child, Widget parent)
{
(void)child;
(void)parent;
return 0;
}
int A_SetChildren(Widget parent, Widget *children, int count)
{
(void)parent;
(void)children;
(void)count;
return 0;
}
void A_DestroyWidget(Widget widget)
{
IdPayload *payload;
if (widget.id == 0)
return;
payload = calloc(1, sizeof(*payload));
if (!payload)
return;
payload->id = widget.id;
libPushToWorker(jobDestroyWidget, payload, 1);
}
void A_RegisterInput(A_Keymap input, void *callbackOrValue, void *argsOrFlag)
{
(void)input;
(void)callbackOrValue;
(void)argsOrFlag;
}