| git.druid.rocks | index | militantprogrammer | astral_canvas | src/ | api/ | apiInternal.c |
src/api/apiInternal.c
#include "api/canvas.h"
#include "apiInternal.h"
#include "node.h"
#include <stdlib.h>
#include <string.h>
void jobCreateWidget(void *data)
{
CreateWidgetPayload *payload = data;
Node *node;
Node *parent;
if (!payload)
return;
node = nodeCreate((Widget){
.id = payload->id,
.widgetType = payload->widgetType,
});
if (!node)
return;
node->position = payload->position;
node->size = payload->size;
node->fontSize = payload->fontSize;
node->callback = payload->callback;
if (payload->text[0]) {
size_t n = strlen(payload->text) + 1;
node->text = malloc(n);
if (node->text)
memcpy(node->text, payload->text, n);
}
parent = nodeFind(payload->parentId);
if (!parent)
parent = nodeRoot();
nodeAttach(parent, node);
}
void jobCreateForm(void *data)
{
FormPayload *payload = data;
Node *form;
int i;
if (!payload)
return;
form = nodeCreate((Widget){
.id = payload->id,
.widgetType = A_WIDGET_BOX,
});
if (!form)
return;
form->userData = payload->data;
nodeAttach(nodeRoot(), form);
for (i = 0; i < payload->childCount; i++) {
Node *child = nodeFind(payload->childIds[i]);
if (child && child != form)
nodeAttach(form, child);
}
}
void jobDestroyWidget(void *data)
{
IdPayload *payload = data;
Node *node;
if (!payload)
return;
node = nodeFind(payload->id);
if (node && node != nodeRoot())
nodeDestroy(node);
}
void jobSetStyle(void *data)
{
SetStylePayload *payload = data;
Node *node;
if (!payload)
return;
node = nodeFind(payload->id);
if (!node)
node = nodeRoot();
nodeApplyStyle(node, &payload->style);
}
void jobApplyShader(void *data)
{
ApplyShaderPayload *payload = data;
Node *node;
if (!payload)
return;
node = nodeFind(payload->id);
if (!node)
node = nodeRoot();
nodeApplyShader(node, payload->shader[0] ? payload->shader : NULL);
}
void jobSetOption(void *data)
{
(void)data;
}