1
0
Fork 0
LithOS3/lithos_c/src/control.c

99 lines
2.1 KiB
C
Raw Normal View History

2016-10-17 08:57:44 -07:00
//-----------------------------------------------------------------------------
//
// Copyright © 2016 Project Golan
//
// See "LICENSE" for more information.
//
//-----------------------------------------------------------------------------
//
// Control functions.
//
// # of rewrites because of DavidPH: 2
2016-10-17 08:57:44 -07:00
//
//-----------------------------------------------------------------------------
#include "Lth.h"
#include <stdlib.h>
2016-10-18 14:20:32 -07:00
// Extern Functions ----------------------------------------------------------|
2016-10-17 08:57:44 -07:00
//
// Lth_ControlRun
//
void Lth_ControlRun(void *ctrl_)
2016-10-17 08:57:44 -07:00
{
Lth_Control *ctrl = ctrl_;
2016-10-17 08:57:44 -07:00
Lth_assert(ctrl != NULL);
Lth_assert(ctrl->ctx != NULL);
Lth_ControlCall(ctrl, update, ctrl);
Lth_ControlCall(ctrl, draw, ctrl);
Lth_ControlCall(ctrl, postdraw, ctrl);
2016-10-17 08:57:44 -07:00
}
//
// Lth_ControlConnect
//
void Lth_ControlConnect(void *ctrl_, Lth_Signal signal, Lth_Callback_t cb)
2016-10-17 08:57:44 -07:00
{
Lth_assert(ctrl_ != NULL);
2016-10-17 08:57:44 -07:00
Lth_assert(signal < Lth_SIGMAX && signal >= 0);
Lth_assert(cb != NULL);
Lth_Control *ctrl = ctrl_;
2016-10-17 08:57:44 -07:00
switch(signal)
{
#define Lth_X(sig, name, ret, ...) \
case Lth_##sig: \
ctrl->cb.name.data = realloc(ctrl->cb.name.data, \
sizeof(Lth_##sig##_t) * (ctrl->cb.name.size + 1)); \
ctrl->cb.name.data[ctrl->cb.name.size++] = (Lth_##sig##_t)cb; \
2016-10-17 08:57:44 -07:00
break;
#include "Lth_callback.h"
}
}
//
// Lth_ControlDestroy
//
void Lth_ControlDestroy(void *ctrl_)
2016-10-17 08:57:44 -07:00
{
if(ctrl_ == NULL) return;
2016-10-17 08:57:44 -07:00
Lth_Control *ctrl = ctrl_;
2016-10-17 08:57:44 -07:00
Lth_ListFor(Lth_Control *owner, ctrl->descendants)
2016-10-17 08:57:44 -07:00
{
Lth_ControlDestroy(owner);
list = next;
}
Lth_CallReverse(ctrl->cb.destroy, ctrl);
Lth_ListRemove(&ctrl->link);
#define Lth_X(sig, name, ret, ...) \
free(ctrl->cb.name.data);
#include "Lth_callback.h"
2016-10-17 08:57:44 -07:00
free(ctrl);
2016-10-17 08:57:44 -07:00
}
//
// Lth_ControlAttach
//
void Lth_ControlAttach(void *ctrlsrc_, void *ctrldst_)
{
Lth_assert(ctrlsrc_ != NULL);
Lth_assert(ctrldst_ != NULL);
Lth_Control *ctrlsrc = ctrlsrc_, *ctrldst = ctrldst_;
Lth_ListInsert(&ctrlsrc->link, ctrlsrc, &ctrldst->descendants);
ctrlsrc->ctx = ctrldst->ctx;
}
2016-10-17 08:57:44 -07:00
// EOF