#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gaugeclass.h" #include "tinymeter.h" extern struct Library *RetinaBase; extern ULONG idle; #define test_test 0 #define test_getwin 1 #define do_clock 1 #define do_mem 2 #define do_vol 3 struct TestMessage { struct Message ts_Message; ULONG MethodID; struct tm_sys_set *set; struct tm_gau_set *list; ULONG posx, posy, sizx; }; init_time_request(struct timerequest *my_time_request_clock, ULONG my_time_mask_clock) { ULONG interval; my_time_request_clock -> tr_node.io_Command = TR_GETSYSTIME; DoIO(my_time_request_clock); interval=my_time_request_clock -> tr_time.tv_secs; my_time_request_clock -> tr_node.io_Command = TR_ADDREQUEST; my_time_request_clock -> tr_time.tv_secs = interval+1; my_time_request_clock -> tr_time.tv_micro = 0; SetSignal(0,my_time_mask_clock); SendIO(my_time_request_clock); } ULONG snapSub(struct tm_sys_set *set, struct tm_data *data) { struct Gadget *g; int i; g=data->win->FirstGadget; data->win=(struct Window *)snapBackground(set,data); RemoveGList(data->win,data->win->FirstGadget,-1); AddGList(data->win,g,0,-1,NULL); drawBackground(set,data); for(i=0;inum_of_gaug;i++) { if(data->gdg[i]!=0) { SetAttrs(data->gdg[i],GA_Width, data->gauge_x_size, NULL); RefreshGList(data->gdg[i],data->win,NULL,1); } } return(1L << data->win->UserPort->mp_SigBit); } setBase(struct tm_data *data) { struct tm_gau_set *many; int i; ULONG cur; for(i=0,many=data->list;inum_of_gaug;i++,many=many->next) { if(data->gdg[i]!=0) { GetAttr(GAU_Current,data->gdg[i],&cur); SetAttrs(data->gdg[i],GAU_Current,cur,GAU_Base,cur,TAG_DONE); RefreshGList(data->gdg[i],data->win,NULL,1); } } } struct tm_sys_set *handler(struct tm_sys_set *set, struct tm_data *data, struct MsgPort *broker_mp, CxObj *broker, ULONG cxsigflag, Class *gclass) { BOOL running = TRUE; ULONG interval, mem_val=0, vol_val=0, sigs, window_mask, my_time_mask_clock, my_test_port_mask, my_noti_port_mask=0L, my_handler; struct MsgPort *my_time_port_clock, *my_test_port, *my_noti_port; struct timerequest *my_time_request_clock; struct NotifyRequest *notifyrequest; LONG not_sig; struct IntuiMessage *m; struct Gadget *g; int i; ULONG cur; ULONG bas; struct TestMessage *test_msg; struct tm_gau_set *many,*next; UBYTE *my_file; BOOL first_run=TRUE; UWORD do_what; if(data->scrnot) { my_noti_port = (struct MsgPort *)CreateMsgPort(); my_handler = ((!data->on_public)|(!strcmp(&set->pub_name[0],"Workbench"))) ? (ULONG)AddWorkbenchClient(my_noti_port,0) : (ULONG)AddCloseScreenClient(data->scr,my_noti_port,0); my_noti_port_mask = 1L << my_noti_port->mp_SigBit; } window_mask = 1L << data->win->UserPort->mp_SigBit; if(my_test_port=(struct MsgPort *)CreatePort("TinyMeter",0)) { my_test_port_mask = 1L << (my_test_port->mp_SigBit); if(my_time_port_clock=(struct MsgPort *)CreateMsgPort()) { my_time_mask_clock = 1L << (my_time_port_clock->mp_SigBit); if(my_time_request_clock = (struct timerequest *)CreateIORequest(my_time_port_clock,sizeof(struct timerequest))) { if(!OpenDevice("timer.device",UNIT_WAITUNTIL,my_time_request_clock,NULL)) { if(notifyrequest = (struct NotifyRequest *)AllocVec(sizeof(struct NotifyRequest), MEMF_CLEAR)) { if ((not_sig = AllocSignal(-1L)) != -1) { notifyrequest->nr_Name = "ENV:sys/WBPattern.prefs"; notifyrequest->nr_Flags = NRF_SEND_SIGNAL; notifyrequest->nr_stuff.nr_Signal.nr_Task = (struct Task *) FindTask(NULL); notifyrequest->nr_stuff.nr_Signal.nr_SignalNum = not_sig; if ((StartNotify(notifyrequest)) == DOSTRUE) { init_time_request(my_time_request_clock,my_time_mask_clock); while(running) { sigs = Wait( my_noti_port_mask | my_test_port_mask | window_mask | my_time_mask_clock | (1L << not_sig) | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D | cxsigflag ); if (sigs & my_time_mask_clock) { if(data->win) { do_what=do_clock; mem_val++; if(mem_val>=set->mem_refresh) { mem_val=0; do_what=do_mem; } vol_val++; if(vol_val>=set->vol_refresh) { vol_val=0; do_what=do_vol; } for(i=0,many=data->list;inum_of_gaug;i++,many=many->next) { if(data->gdg[i]!=0) switch (do_what) { case do_vol: if(many->type==typ_volume) { getVolsize(data,&many->expansion[0]); SetAttrs(data->gdg[i],GAU_VolType,data->voltype,GAU_Max,data->volmax,GAU_Current,data->volcur,TAG_DONE); BeginRefresh(data->win); EndRefresh(data->win,TRUE); RefreshGList(data->gdg[i], data->win,NULL,1); } case do_mem: switch (many->type) { case typ_all: cur=AvailMem(0L); break; case typ_chip: cur=AvailMem(MEMF_CHIP); break; case typ_fast: cur=AvailMem(MEMF_FAST); break; case typ_idle: GetAttr(GAU_Current,data->gdg[i],&bas); switch (data->executive) { case idle_none: cur=0L; break; case idle_executive: GetCpuUsage(data->si,&data->cpu); cur=(data->cpu.used_cputime_lastsec_hz-data->cpu.used_cputime_lastsec)<<8; break; case idle_own: cur=idle; break; } if(basgdg[i],GAU_Base,cur,TAG_DONE); break; case typ_largest_total: cur=AvailMem(MEMF_LARGEST); break; case typ_largest_chip: cur=AvailMem(MEMF_LARGEST|MEMF_CHIP); break; case typ_largest_fast: cur=AvailMem(MEMF_LARGEST|MEMF_FAST); break; case typ_largest_retina: if(RetinaBase) cur=Retina_AvailMem(MEMF_LARGEST); else cur=GAU_err_notavail; break; case typ_retina: if(RetinaBase) cur=Retina_AvailMem(0L); else cur=GAU_err_notavail; break; default: goto none_4; break; } if(do_what!=do_vol) { SetAttrs(data->gdg[i],GAU_Current,cur,TAG_DONE); BeginRefresh(data->win); EndRefresh(data->win,TRUE); RefreshGList(data->gdg[i],data->win,NULL,1); } none_4: case do_clock: if(many->type==typ_clock_) { SetAttrs(data->gdg[i],GAU_Current,cur,TAG_DONE); BeginRefresh(data->win); EndRefresh(data->win,TRUE); RefreshGList(data->gdg[i],data->win,NULL,1); } break; } } if(first_run){setBase(data);first_run=FALSE;} } if(set->win_backfront==win_front) { if(data->win->WLayer!=data->scr->LayerInfo.top_layer) WindowToFront(data->win); } init_time_request(my_time_request_clock,my_time_mask_clock); } if (sigs & window_mask ) { while(m=(struct IntuiMessage *)GetMsg( data->win->UserPort )) { switch ( m->Class ) { case IDCMP_CHANGEWINDOW: if(set->bg_type==bg_snap) { ReplyMsg( m ); while((m=(struct IntuiMessage *)GetMsg( data->win->UserPort )))ReplyMsg( m ); window_mask=snapSub(set,data); goto no_Reply; } break; case IDCMP_CLOSEWINDOW: running=FALSE; break; case IDCMP_NEWSIZE: { new_window_size(set,data); set->x_siz=data->win->Width; data->gauge_x_size=(set->x_siz-(set->win_border_x<<1)-((set->colums-1)*set->win_space_x))/set->colums; switch (set->bg_type) { case bg_file: fileBackground(set,data); break; case bg_snap: ReplyMsg( m ); while((m=(struct IntuiMessage *)GetMsg( data->win->UserPort )))ReplyMsg( m ); g=data->win->FirstGadget; data->win=(struct Window *)snapBackground(set,data); RemoveGList(data->win,data->win->FirstGadget,-1); AddGList(data->win,g,0,-1,NULL); window_mask = 1L << data->win->UserPort->mp_SigBit; break; default: break; } drawBackground(set,data); for(i=0,many=data->list;inum_of_gaug;i++,many=many->next) { if(data->gdg[i]!=0) { SetAttrs(data->gdg[i], GA_Left, set->win_border_x+((i)%set->colums)*data->gauge_x_size+((i)%set->colums)*set->win_space_x, GA_Width, data->gauge_x_size, TAG_DONE); RefreshGList(data->gdg[i], data->win,NULL,1); } } } if(set->bg_type==bg_snap) goto no_Reply; break; case IDCMP_VANILLAKEY: switch(m->Code) { case 'S': case 's': { set->x_pos=data->win->LeftEdge; set->y_pos=data->win->TopEdge; set->x_siz=data->win->Width; if(my_file=(UBYTE *)Open("ENV:TinyMeter",MODE_NEWFILE)) { Write(my_file,set,(ULONG) sizeof(struct tm_sys_set)); many=data->list; for(i=0;inum_of_gaug;i++) { Write(my_file,many,(ULONG) sizeof(struct tm_gau_set)); many=many->next; } Close(my_file); } if(my_file=(UBYTE *)Open("ENVARC:TinyMeter",MODE_NEWFILE)) { Write(my_file,set,(ULONG) sizeof(struct tm_sys_set)); many=data->list; for(i=0;inum_of_gaug;i++) { Write(my_file,many,(ULONG) sizeof(struct tm_gau_set)); many=many->next; } Close(my_file); } } break; case 'F': case 'f': { ULONG my_mem; Forbid(); my_mem= AllocVec(2000000000L,MEMF_PUBLIC); if(my_mem)FreeVec(my_mem); Permit(); } break; case 'Q': case 'q': running=FALSE; break; case 'b': case 'B': if(set->bg_type==bg_snap) { ReplyMsg( m ); while((m=(struct IntuiMessage *)GetMsg( data->win->UserPort )))ReplyMsg( m ); window_mask=snapSub(set,data); goto no_Reply; } break; } break; case IDCMP_MOUSEBUTTONS: if((m->Code&129)==1) { setBase(data); } break; default : break; } ReplyMsg( m ); no_Reply: } } if (sigs & (1L << not_sig)) { Delay(100L); switch (set->bg_type) { case bg_snap: window_mask=snapSub(set,data); break; default: break; } } if (sigs & cxsigflag) { CxMsg *msg; ULONG sigrcvd, msgid, msgtype; while(msg = (CxMsg *)GetMsg(broker_mp)) { msgid = CxMsgID(msg); msgtype = CxMsgType(msg); if(msgtype==CXM_COMMAND) switch(msgid) { case CXCMD_DISABLE: { BOOL pause=TRUE; ActivateCxObj(broker, 0L); while(pause) { Wait(cxsigflag); while(msg = (CxMsg *)GetMsg(broker_mp)) { msgid = CxMsgID(msg); msgtype = CxMsgType(msg); ReplyMsg((struct Message *)msg); if(msgtype==CXM_COMMAND) if(msgid==CXCMD_ENABLE) pause=FALSE; } } ActivateCxObj(broker, 1L); } break; case CXCMD_ENABLE: ActivateCxObj(broker, 1L); break; case CXCMD_KILL: running=FALSE; break; } ReplyMsg((struct Message *)msg); } } if ((sigs & my_test_port_mask)) { while(test_msg=(struct TestMessage *)GetMsg(my_test_port)) { switch (test_msg->MethodID) { case test_test: closeWindow(set,data); removeGadgets(set,data); first_run=TRUE; if(test_msg->set && test_msg->list) { FreeVec(set); many=data->list; do { next=many->next; FreeVec(many); } while(many=next); set = test_msg->set; data->list = test_msg->list; data->num_of_gaug = getNum(data->list); } if(openWindow(set,data)) { drawBackground(set,data); allocGadgets(set,data,gclass); window_mask = 1L << data->win->UserPort->mp_SigBit; } else running=FALSE; setBase(data); break; case test_getwin: test_msg->posx=data->win->LeftEdge; test_msg->posy=data->win->TopEdge; test_msg->sizx=data->win->Width; break; } ReplyMsg(test_msg); } } if(data->scrnot) { if (sigs & my_noti_port_mask) { struct ScreenNotifyMessage *snm; while(snm = (struct ScreenNotifyMessage *) GetMsg(my_noti_port)) { switch(snm->snm_Type) { case SCREENNOTIFY_TYPE_CLOSESCREEN: ReplyMsg((struct Message *) snm); running=FALSE; break; case SCREENNOTIFY_TYPE_WORKBENCH: switch ((ULONG)snm->snm_Value) { case FALSE: closeWindow(set,data); removeGadgets(set,data); ReplyMsg((struct Message *) snm); Wait(my_noti_port_mask); while(snm = (struct ScreenNotifyMessage *) GetMsg(my_noti_port)) { if(snm->snm_Type==SCREENNOTIFY_TYPE_WORKBENCH) { if((ULONG)snm->snm_Value==TRUE) { ReplyMsg((struct Message *) snm); Delay(50L); if(openWindow(set,data)) { drawBackground(set,data); allocGadgets(set,data,gclass); window_mask = 1L << data->win->UserPort->mp_SigBit; } else running=FALSE; setBase(data); } else running=FALSE; } else running=FALSE; } first_run=TRUE; break; default: ReplyMsg((struct Message *) snm); break; } break; default: ReplyMsg((struct Message *) snm); break; } } } Delay(10L); } if (sigs & (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D)) running=FALSE; } } else show("StartNotify failed!"); FreeSignal(not_sig); } else show("Could not allocate signal!"); FreeVec(notifyrequest); } else show("Not enough memory!"); if(!CheckIO(my_time_request_clock)) AbortIO(my_time_request_clock); WaitIO(my_time_request_clock); CloseDevice(my_time_request_clock); } else show("timer.device usage failed!"); DeleteIORequest(my_time_request_clock); } else show("CreateIORequest failed!"); DeleteMsgPort(my_time_port_clock); } else show("CreateMsgPort failed!"); DeletePort(my_test_port); } else show("CreatePort failed.!"); if(data->scrnot) { if((!data->on_public)|(!strcmp(&set->pub_name[0],"Workbench"))) while(!RemWorkbenchClient(my_handler)) Delay(10); else while(!RemCloseScreenClient(my_handler)) Delay(10); DeleteMsgPort(my_noti_port); } return(set); }