Files
sibo-playground/code/SIBOSDK/hwifood/growbar.c
T
2026-07-06 18:01:36 +01:00

165 lines
3.5 KiB
C

/*
GROWBAR.C
Written by DavidW
Started on 19/8/94
*/
#include <p_std.h>
#include <p_object.h>
#include <hwif.h>
#include <hwim.h>
#include <gbar.g>
#include <donewn.g>
#include "gbar.rsg"
GLREF_D VOID *w_am;
GLREF_D PR_WSERV *w_ws;
GLREF_D VOID *DatDialogPtr;
LOCAL_C VOID doDial(INT classno,INT resid,VOID *rbuf)
{
hOODialog(p_getlibh(CAT_GBAR_GBAR),classno,resid,rbuf);
}
LOCAL_C VOID InitGbarData(RB_GBAR *pgb)
{
pgb->totloops=10;
pgb->update=1;
pgb->esc=TRUE;
}
LOCAL_C VOID DisallowDialling(VOID)
{
w_ws->wserv.flags|=PR_WSERV_FREEFORM_DIALLING;
}
LOCAL_C VOID MainLoop(VOID)
{
VOID *ao;
RB_GBAR gb_data;
InitGbarData(&gb_data);
DisallowDialling();
ao=f_newsend(CAT_GBAR_GBAR,C_BAR_AO,O_AO_INIT,&gb_data);
FOREVER
{
doDial(C_DATA_DL,DL_DATA,&gb_data);
if (gb_data.exit_code==W_KEY_ESCAPE)
continue;
p_send2(ao,O_AO_QUEUE);
doDial(C_GBAR_DL,DL_GBAR,&gb_data);
p_send2(ao,O_AO_CANCEL);
hInfoPrint(gb_data.exit_code==W_KEY_ESCAPE?
STR_CANCELLED: STR_FINISHED);
}
}
LOCAL_C VOID SpecificInit(VOID)
{
hInitAppRcb();
hCrackCommandLine();
}
GLDEF_C VOID main(VOID)
{
uCommonInit();
SpecificInit();
MainLoop();
}
#pragma METHOD_CALL
#define DL_DATA_TOT 1
#define DL_DATA_UPD 2
#define DL_DATA_ESC 3
METHOD VOID data_dl_dl_dyn_init(PR_DLGBOX *self)
{
RB_GBAR *prbuf;
prbuf=self->dlgbox.rbuf;
hDlgSetNcedit(DL_DATA_TOT,prbuf->totloops);
hDlgSetNcedit(DL_DATA_UPD,prbuf->update);
hDlgSetChlist(DL_DATA_ESC,prbuf->esc);
}
METHOD INT data_dl_dl_key(PR_DLGBOX *self)
{
RB_GBAR *prbuf;
prbuf=self->dlgbox.rbuf;
prbuf->totloops=hDlgSenseNcedit(DL_DATA_TOT);
prbuf->update=hDlgSenseNcedit(DL_DATA_UPD);
prbuf->esc=hDlgSenseChlist(DL_DATA_ESC);
return(WN_KEY_CHANGED);
}
METHOD VOID gbar_dl_dl_dyn_init(PR_DLGBOX *self)
{
RB_GBAR *prbuf;
SE_DONEWN set;
prbuf=self->dlgbox.rbuf;
if (prbuf->esc)
p_send3(self,O_DL_ITEM_APPEND,ITEM_ABANDON);
set.flags=SE_DONEWN_RANGE;
set.range=prbuf->totloops;
hDlgSet(1,&set);
prbuf->toupdate=prbuf->update;
prbuf->loopsleft=prbuf->totloops;
}
METHOD VOID gbar_dl_gbar_update(PR_DLGBOX *self)
{
RB_GBAR *prbuf;
SE_DONEWN set;
prbuf=self->dlgbox.rbuf;
set.flags=SE_DONEWN_VALUE;
set.val=prbuf->totloops-prbuf->loopsleft;
hDlgSet(1,&set);
}
METHOD INT gbar_dl_dl_key(PR_DLGBOX *self)
{
RB_GBAR *prbuf;
prbuf=self->dlgbox.rbuf;
return(prbuf->esc? WN_KEY_CHANGED: WN_KEY_NO_CHANGE);
}
METHOD VOID gbar_dl_wn_sense_help(VOID *self)
{
p_leave(RUN_ACTIVE_USED);
}
METHOD VOID bar_ao_ao_init(PR_BAR_AO *self,RB_GBAR *prb)
{
p_send3(w_am,O_AM_ADD_TASK,self);
self->bar_ao.prb=prb;
}
METHOD INT bar_ao_ao_run(PR_BAR_AO *self)
{
RB_GBAR *prb;
p_sleep(5); /* the next stage of computation or drawing etc */
p_send2(self,O_AO_QUEUE);
prb=self->bar_ao.prb;
if (!--(prb->loopsleft))
{
p_send2(DatDialogPtr,O_DESTROY);
prb->exit_code=0;
}
else if (!--(prb->toupdate))
{
p_send2(DatDialogPtr,O_GBAR_UPDATE);
prb->toupdate=prb->update;
}
return(RUN_ACTIVE_USED);
}