LOCAL TBOOL rfb_getimsg(RFBDISPLAY *mod, RFBWINDOW *v, TIMSG **msgptr, TUINT type) { TAPTR TExecBase = TGetExecBase(mod); TIMSG *msg; TLock(mod->rfb_InstanceLock); msg = (TIMSG *) TRemHead(&mod->rfb_IMsgPool); TUnlock(mod->rfb_InstanceLock); if (msg == TNULL) msg = TAllocMsg(sizeof(TIMSG)); *msgptr = msg; if (msg) { memset(msg, 0, sizeof(TIMSG)); msg->timsg_Instance = v; msg->timsg_UserData = v->userdata; msg->timsg_Type = type; msg->timsg_Qualifier = mod->rfb_KeyQual; msg->timsg_MouseX = mod->rfb_MouseX; msg->timsg_MouseY = mod->rfb_MouseY; TGetSystemTime(&msg->timsg_TimeStamp); return TTRUE; } return TFALSE; }
static int tek_lib_exec_sendmsg(lua_State *L) { struct LuaExecTask *lexec = tek_lib_exec_check(L); struct TExecBase *TExecBase = lexec->exec; const char *taskname = luaL_checkstring(L, 1); size_t msglen; const char *src = luaL_checklstring(L, 2, &msglen); TAPTR ref, task; char *msg = TAllocMsg(msglen + TEK_LIB_TASKNAME_LEN); if (msg == TNULL) luaL_error(L, "out of memory"); task = tek_lib_exec_locktask(TExecBase, taskname, &ref); if (task) { memcpy(msg, src, msglen); strcpy(msg + msglen, lexec->taskname); TPutMsg(TGetUserPort(task), TNULL, msg); tek_lib_exec_unlocktask(TExecBase, ref); lua_pushboolean(L, TTRUE); } else { TFree(msg); lua_pushnil(L); } return 1; }
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 TMODAPI struct TVRequest * fb_allocreq(WINDISPLAY *mod) { struct TExecBase *TExecBase = TGetExecBase(mod); struct TVRequest *req = TAllocMsg(sizeof(struct TVRequest)); if (req) req->tvr_Req.io_Device = (struct TModule *) mod; return req; }
static int tek_lib_exec_child_sendmsg(lua_State *L) { struct LuaExecChild *ctx = luaL_checkudata(L, 1, TEK_LIB_TASK_CLASSNAME); if (ctx->task) { struct TExecBase *TExecBase = ctx->exec; size_t len; const char *buf = luaL_checklstring(L, 2, &len); char *msg = TAllocMsg(len + TEK_LIB_TASKNAME_LEN); if (msg == TNULL) luaL_error(L, "out of memory"); memcpy(msg, buf, len); strcpy(msg + len, ctx->parent->taskname); TPutMsg(TGetUserPort(ctx->task), TNULL, msg); } else luaL_error(L, "closed handle"); return 0; }
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; }