static TBOOL rfb_inittask(struct TTask *task) { TAPTR TExecBase = TGetExecBase(task); RFBDISPLAY *mod = TGetTaskData(task); for (;;) { TTAGITEM *opentags = mod->rfb_OpenTags; TSTRPTR subname; /* Initialize rectangle pool */ region_initpool(&mod->rfb_RectPool, TExecBase); /* list of free input messages: */ TInitList(&mod->rfb_IMsgPool); /* list of all open visuals: */ TInitList(&mod->rfb_VisualList); /* init fontmanager and default font */ TInitList(&mod->rfb_FontManager.openfonts); /* Instance lock (currently needed for async VNC) */ mod->rfb_InstanceLock = TCreateLock(TNULL); if (mod->rfb_InstanceLock == TNULL) break; /* Open sub device, if one is requested: */ subname = (TSTRPTR) TGetTag(opentags, TVisual_DriverName, (TTAG) SUBDEVICE_NAME); if (subname) { TTAGITEM subtags[2]; subtags[0].tti_Tag = TVisual_IMsgPort; subtags[0].tti_Value = TGetTag(opentags, TVisual_IMsgPort, TNULL); subtags[1].tti_Tag = TTAG_DONE; mod->rfb_RndRPort = TCreatePort(TNULL); if (mod->rfb_RndRPort == TNULL) break; mod->rfb_RndDevice = TOpenModule(subname, 0, subtags); if (mod->rfb_RndDevice == TNULL) break; mod->rfb_RndRequest = TAllocMsg(sizeof(struct TVRequest)); if (mod->rfb_RndRequest == TNULL) break; mod->rfb_RndIMsgPort = TCreatePort(TNULL); if (mod->rfb_RndIMsgPort == TNULL) break; } TDBPRINTF(TDB_TRACE,("Instance init successful\n")); return TTRUE; } rfb_exittask(mod); return TFALSE; }
static void rfb_runtask(struct TTask *task) { TAPTR TExecBase = TGetExecBase(task); RFBDISPLAY *mod = TGetTaskData(task); struct TVRequest *req; TUINT sig; TTIME intt = { RAWFB_INTERVAL_MICROS }; /* next absolute time to send interval message: */ TTIME nextt; TTIME waitt, nowt; TAPTR cmdport = TGetUserPort(task); TUINT cmdportsignal = TGetPortSignal(cmdport); TUINT imsgportsignal = TGetPortSignal(mod->rfb_RndIMsgPort); TDBPRINTF(TDB_INFO,("RawFB device context running\n")); TGetSystemTime(&nowt); nextt = nowt; TAddTime(&nextt, &intt); do { /* process input messages: */ rfb_processevent(mod); /* do draw commands: */ while ((req = TGetMsg(cmdport))) { rfb_docmd(mod, req); TReplyMsg(req); } /* check if time interval has expired: */ TGetSystemTime(&nowt); if (TCmpTime(&nowt, &nextt) > 0) { /* expired; send intervals: */ TLock(mod->rfb_InstanceLock); struct TNode *next, *node = mod->rfb_VisualList.tlh_Head; for (; (next = node->tln_Succ); node = next) { RFBWINDOW *v = (RFBWINDOW *) node; TIMSG *imsg; if ((v->rfbw_InputMask & TITYPE_INTERVAL) && rfb_getimsg(mod, v, &imsg, TITYPE_INTERVAL)) TPutMsg(v->rfbw_IMsgPort, TNULL, imsg); } TUnlock(mod->rfb_InstanceLock); TAddTime(&nextt, &intt); } /* calculate new wait time: */ waitt = nextt; TGetSystemTime(&nowt); TSubTime(&waitt, &nowt); if (waitt.tdt_Int64 <= 0 || waitt.tdt_Int64 > RAWFB_INTERVAL_MICROS) { /* something's wrong with the clock, recalculate */ TDBPRINTF(TDB_INFO,("clock problem: %lld\n", waitt.tdt_Int64)); nextt = nowt; TAddTime(&nextt, &intt); waitt = nextt; TSubTime(&waitt, &nowt); } sig = TWaitTime(&waitt, cmdportsignal | imsgportsignal | TTASK_SIG_ABORT); } while (!(sig & TTASK_SIG_ABORT)); TDBPRINTF(TDB_INFO,("RawFB device context closedown\n")); rfb_exittask(mod); }
static void rfb_runtask(struct TTask *task) { TAPTR TExecBase = TGetExecBase(task); struct rfb_Display *mod = TGetTaskData(task); struct TVRequest *req; TUINT sig = 0; TTIME intt = { 20000 }; /* next absolute time to send interval message: */ TTIME nextt; TTIME waitt, nowt, *pwaitt; TAPTR cmdport = TGetUserPort(task); TUINT cmdportsignal = TGetPortSignal(cmdport); TUINT imsgportsignal = TGetPortSignal(mod->rfb_RndIMsgPort); TUINT waitsigs = cmdportsignal | imsgportsignal | TTASK_SIG_ABORT; TDBPRINTF(TDB_INFO, ("RawFB device context running\n")); TGetSystemTime(&nowt); nextt = nowt; TAddTime(&nextt, &intt); do { if (sig & cmdportsignal) { TBOOL checkrect = mod->rfb_Flags & RFBFL_PTR_VISIBLE; TINT arec[4]; while ((req = TGetMsg(cmdport))) { if (checkrect) { TINT res = rfb_cmdrectaffected(mod, req, arec, TTRUE); if (res < 0 || (res > 0 && REGION_OVERLAPRECT(mod->rfb_PtrBackBuffer.rect, arec))) { rfb_restoreptrbg(mod); checkrect = TFALSE; } } rfb_docmd(mod, req); TReplyMsg(req); } } if (mod->rfb_Flags & RFBFL_SHOWPTR) rfb_drawpointer(mod); /* check if time interval has expired: */ TGetSystemTime(&nowt); /* do interval timers */ if (mod->rfb_NumInterval > 0) { if (TCmpTime(&nowt, &nextt) >= 0) { /* expired; send intervals: */ TLock(mod->rfb_InstanceLock); struct TNode *next, *node = mod->rfb_VisualList.tlh_Head.tln_Succ; for (; (next = node->tln_Succ); node = next) { struct rfb_Window *v = (struct rfb_Window *) node; TIMSG *imsg; if ((v->rfbw_InputMask & TITYPE_INTERVAL) && rfb_getimsg(mod, v, &imsg, TITYPE_INTERVAL)) TPutMsg(v->rfbw_IMsgPort, TNULL, imsg); } TUnlock(mod->rfb_InstanceLock); TAddTime(&nextt, &intt); } /* calculate new wait time: */ waitt = nextt; TSubTime(&waitt, &nowt); if (waitt.tdt_Int64 <= 0 || waitt.tdt_Int64 > 20000) { nextt = nowt; TAddTime(&nextt, &intt); waitt = nextt; TSubTime(&waitt, &nowt); } pwaitt = &waitt; } else pwaitt = TNULL; #if defined(ENABLE_LINUXFB) rfb_linux_wait(mod, pwaitt); sig = TSetSignal(0, waitsigs); #else sig = TWaitTime(pwaitt, waitsigs); #endif if (sig & imsgportsignal) rfb_processevent(mod); } while (!(sig & TTASK_SIG_ABORT)); TDBPRINTF(TDB_INFO, ("RawFB device context closedown\n")); rfb_exittask(mod); }
static TBOOL rfb_inittask(struct TTask *task) { TAPTR TExecBase = TGetExecBase(task); struct rfb_Display *mod = TGetTaskData(task); for (;;) { TTAGITEM *opentags = mod->rfb_OpenTags; TSTRPTR subname; /* Initialize rectangle pool */ region_initpool(&mod->rfb_RectPool, TExecBase); /* list of free input messages: */ TInitList(&mod->rfb_IMsgPool); /* list of all open visuals: */ TInitList(&mod->rfb_VisualList); /* init fontmanager and default font */ TInitList(&mod->rfb_FontManager.openfonts); region_init(&mod->rfb_RectPool, &mod->rfb_DirtyRegion, TNULL); mod->rfb_PixBuf.tpb_Format = TVPIXFMT_UNDEFINED; mod->rfb_DevWidth = RFB_DEF_WIDTH; mod->rfb_DevHeight = RFB_DEF_HEIGHT; mod->rfb_Flags = RFBFL_BUFFER_CAN_RESIZE; #if defined(ENABLE_LINUXFB) if (!rfb_linux_init(mod)) break; #endif /* Instance lock (currently needed for async VNC) */ mod->rfb_InstanceLock = TCreateLock(TNULL); if (mod->rfb_InstanceLock == TNULL) break; /* Open sub device, if one is requested: */ subname = (TSTRPTR) TGetTag(opentags, TVisual_DriverName, (TTAG) SUBDEVICE_NAME); if (subname) { TTAGITEM subtags[2]; subtags[0].tti_Tag = TVisual_IMsgPort; subtags[0].tti_Value = TGetTag(opentags, TVisual_IMsgPort, TNULL); subtags[1].tti_Tag = TTAG_DONE; mod->rfb_RndRPort = TCreatePort(TNULL); if (mod->rfb_RndRPort == TNULL) break; mod->rfb_RndDevice = TOpenModule(subname, 0, subtags); if (mod->rfb_RndDevice == TNULL) break; mod->rfb_RndRequest = TAllocMsg(sizeof(struct TVRequest)); if (mod->rfb_RndRequest == TNULL) break; mod->rfb_RndIMsgPort = TCreatePort(TNULL); if (mod->rfb_RndIMsgPort == TNULL) break; } TDBPRINTF(TDB_TRACE, ("Instance init successful\n")); return TTRUE; } rfb_exittask(mod); return TFALSE; }