Esempio n. 1
0
static void fb_dowindow(TAPTR task)
{
	struct TExecBase *TExecBase = TGetExecBase(task);
	WINWINDOW *win = TGetTaskData(task);
	WINDISPLAY *mod = win->fbv_Display;
	MSG msg;
	TUINT sig;

	TDBPRINTF(TDB_INFO,("DoWindow...\n"));

	do
	{
		WaitMessage();

		while (PeekMessage(&msg, win->fbv_HWnd, 0,0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

// 		PostMessage(win->fbv_HWnd, WM_USER, 0, 0);
		sig = TSetSignal(0, TTASK_SIG_ABORT);

	} while (!(sig & TTASK_SIG_ABORT));

	TDBPRINTF(TDB_INFO,("Window Done\n"));

	TLock(mod->fbd_Lock);
	TRemove(&win->fbv_Node);
	TUnlock(mod->fbd_Lock);

	fb_closeall(mod, win, TTRUE);
}
Esempio n. 2
0
LOCAL TAPTR
dfb_hostopenfont(DFBDISPLAY *mod, TTAGITEM *tags)
{
	struct fnt_attr fattr;
	struct FontNode *fn;
	TAPTR font = TNULL;
	TAPTR exec = TGetExecBase(mod);

	/* fetch user specified attributes */
	fattr.fname = (TSTRPTR) TGetTag(tags, TVisual_FontName, (TTAG) FNT_DEFNAME);
	fattr.fpxsize = (TINT) TGetTag(tags, TVisual_FontPxSize, (TTAG) FNT_DEFPXSIZE);

	/* not yet
	fattr.fitalic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) TFALSE);
	fattr.fbold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) TFALSE);
	fattr.fscale = (TBOOL) TGetTag(tags, TVisual_FontScaleable, (TTAG) TFALSE);
	*/

	if (fattr.fname)
	{
		fn = TExecAlloc0(exec, mod->dfb_MemMgr, sizeof(struct FontNode));
		if (fn)
		{
			fn->handle.thn_Owner = mod;

			if (hostopenfont(mod, fn, &fattr))
			{
				/* load succeeded, save font attributes */
				fn->pxsize = fattr.fpxsize;
				fn->font->GetHeight(fn->font, &fn->height);
				fn->font->GetAscender(fn->font, &fn->ascent);
				fn->font->GetDescender(fn->font, &fn->descent);

				/* not yet
				if (fattr.fitalic)
					fn->attr = FNT_ITALIC;
				if (fattr.fbold)
					fn->attr |= FNT_BOLD;
				*/

				/* append to the list of open fonts */
				TDBPRINTF(TDB_INFO, ("O '%s' %dpx\n", fattr.fname, fattr.fpxsize));
				TAddTail(&mod->dfb_fm.openfonts, &fn->handle.thn_Node);
				font = (TAPTR)fn;
			}
			else
			{
				/* load failed, free fontnode */
				TDBPRINTF(TDB_INFO,("X unable to load '%s'\n", fattr.fname));
				TExecFree(exec, fn);
			}
		}
		else
			TDBPRINTF(TDB_FAIL,("out of memory :(\n"));
	}
	else
		TDBPRINTF(TDB_ERROR,("X invalid fontname '%s' specified\n", fattr.fname));

	return font;
}
Esempio n. 3
0
File: hal.c Progetto: callcc/tekui
EXPORT TBOOL
hal_scanmodules(struct THALBase *hal, TSTRPTR path, struct THook *hook)
{
	TSTRPTR p;
	struct HALSpecific *hws = hal->hmb_Specific;
	TBOOL success = TFALSE;

	p = getmodpath(hws->hsp_ProgDir, "mod\\*.dll");
	if (p)
	{
		TDBPRINTF(TDB_TRACE,("scanning %s\n", p));
		success = scanpathtolist(hook, p, path);
		free(p);
	}

	if (success)
	{
		p = getmodpath(hws->hsp_ModDir, "*.dll");
		if (p)
		{
			TDBPRINTF(TDB_TRACE,("scanning %s\n", p));
			success = scanpathtolist(hook, p, path);
			free(p);
		}
	}
	return success;
}
Esempio n. 4
0
static TBOOL
hostopenfont(DFBDISPLAY *mod, struct FontNode *fn, struct fnt_attr *fattr)
{
	TBOOL succ = TFALSE;
	TAPTR exec = TGetExecBase(mod);
	DFBFontDescription fdsc;
	TSTRPTR fontfile = TExecAlloc0(exec, mod->dfb_MemMgr,
		strlen(fattr->fname) + strlen(FNT_DEFDIR) + 5);

	if (fontfile)
	{
		fdsc.flags = DFDESC_HEIGHT;
		fdsc.height = fattr->fpxsize;

		sprintf(fontfile, "%s%s.ttf", FNT_DEFDIR, fattr->fname);
		TDBPRINTF(TDB_INFO,("? %s:%d\n", fontfile, fattr->fpxsize));

		if (mod->dfb_DFB->CreateFont(mod->dfb_DFB, fontfile,
			&fdsc, &fn->font) == DFB_OK)
			succ = TTRUE;

		TExecFree(exec, fontfile);
	}
	else
		TDBPRINTF(TDB_FAIL,("out of memory :(\n"));

	return succ;
}
Esempio n. 5
0
static struct rfb_FontQueryNode *fnt_getfqnode(struct rfb_Display *mod,
	TSTRPTR filename, TINT pxsize)
{
	struct rfb_FontQueryNode *fqnode = TNULL;
	TAPTR TExecBase = TGetExecBase(mod);

	/* allocate fquery node */
	fqnode = TAlloc0(mod->rfb_MemMgr, sizeof(struct rfb_FontQueryNode));
	if (fqnode)
	{
		/* fquerynode ready - fill in attributes */
		TSTRPTR myfname = TNULL;
		TINT flen = strlen(filename) - 4;	/* discard '.ttf' */

		if (flen > 0)
			myfname = TAlloc0(mod->rfb_MemMgr, flen + 1);
		else
			TDBPRINTF(20, ("found invalid font: '%s'\n", filename));

		if (myfname)
		{
			memcpy(myfname, filename, flen);
			fqnode->tags[0].tti_Tag = TVisual_FontName;
			fqnode->tags[0].tti_Value = (TTAG) myfname;
		}
		else
		{
			if (flen > 0)
				TDBPRINTF(20, ("out of memory :(\n"));
		}

		if (fqnode->tags[0].tti_Value)
		{
			TINT i = 1;

			fqnode->tags[i].tti_Tag = TVisual_FontPxSize;
			fqnode->tags[i++].tti_Value = (TTAG) pxsize;

			/* always true */
			fqnode->tags[i].tti_Tag = TVisual_FontScaleable;
			fqnode->tags[i++].tti_Value = (TTAG) TTRUE;

			fqnode->tags[i].tti_Tag = TTAG_DONE;
		}
		else
		{
			TFree(fqnode);
			fqnode = TNULL;
		}

	}	/* endif fqnode */
	else
		TDBPRINTF(20, ("out of memory :(\n"));

	return fqnode;
}
Esempio n. 6
0
/* allocate a fontquerynode and fill in properties
*/
static struct FontQueryNode *
fnt_getfqnode(DFBDISPLAY *mod, TSTRPTR filename, TINT pxsize)
{
	TAPTR exec = TGetExecBase(mod);
	struct FontQueryNode *fqnode = TNULL;

	/* allocate fquery node */
	fqnode = TExecAlloc0(exec, mod->dfb_MemMgr, sizeof(struct FontQueryNode));
	if (fqnode)
	{
		/* fquerynode ready - fill in attributes */
		TSTRPTR myfname = TNULL;
		TINT flen = strlen(filename)-4; /* discard '.ttf' */

		if (flen > 0)
			myfname = TExecAlloc0(exec, mod->dfb_MemMgr, flen + 1);
		else
			TDBPRINTF(TDB_ERROR,("found invalid font: '%s'\n", filename));

		if (myfname)
		{
			TExecCopyMem(exec, filename, myfname, flen);
			fqnode->tags[0].tti_Tag = TVisual_FontName;
			fqnode->tags[0].tti_Value = (TTAG) myfname;
		}
		else
		{
			if (flen > 0)
				TDBPRINTF(TDB_FAIL,("out of memory :(\n"));
		}

		if (fqnode->tags[0].tti_Value)
		{
			TINT i = 1;

			fqnode->tags[i].tti_Tag = TVisual_FontPxSize;
			fqnode->tags[i++].tti_Value = (TTAG) pxsize;

			/* always true */
			fqnode->tags[i].tti_Tag = TVisual_FontScaleable;
			fqnode->tags[i++].tti_Value = (TTAG) TTRUE;

			fqnode->tags[i].tti_Tag = TTAG_DONE;
		}
		else
		{
			TExecFree(exec, fqnode);
			fqnode = TNULL;
		}

	} /* endif fqnode */
	else
		TDBPRINTF(TDB_FAIL,("out of memory :(\n"));

	return fqnode;
}
Esempio n. 7
0
LOCAL TAPTR
dfb_hostqueryfonts(TMOD_DFB *mod, TTAGITEM *tags)
{
	TSTRPTR fname = TNULL;
	struct fnt_attr fattr;
	struct TNode *node, *next;
	struct FontQueryHandle *fqh = TNULL;
	TAPTR exec = TGetExecBase(mod);

	TDBPRINTF(10, ("***********************************************\n"));

	/* init fontname list */
	TInitList(&fattr.fnlist);

	/* fetch and parse fname */
	fname = (TSTRPTR) TGetTag(tags, TVisual_FontName, (TTAG) FNT_WILDCARD);
	if (fname)	fnt_getfnnodes(mod, &fattr.fnlist, fname);

	/* fetch user specified attributes */
	fattr.fpxsize = (TINT) TGetTag(tags, TVisual_FontPxSize, (TTAG) FNT_DEFPXSIZE);
	fattr.fnum = (TINT) TGetTag(tags, TVisual_FontNumResults, (TTAG) INT_MAX);
	/* not yet
	fattr.fitalic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) FNTQUERY_UNDEFINED);
	fattr.fbold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) FNTQUERY_UNDEFINED);
	*/

	/* init result list */
	fqh = TExecAlloc0(exec, mod->dfb_MemMgr, sizeof(struct FontQueryHandle));
	if (fqh)
	{
		fqh->handle.thn_Owner = mod;
		/* connect destructor */
		TInitHook(&fqh->handle.thn_Hook, fqhdestroy, fqh);
		TInitList(&fqh->reslist);
		/* init list iterator */
		fqh->nptr = &fqh->reslist.tlh_Head;

		hostqueryfonts(mod, fqh, &fattr);
		TDB(10,(fnt_dumplist(&fqh->reslist)));
		TDBPRINTF(10, ("***********************************************\n"));
	}
	else
		TDBPRINTF(20, ("out of memory :(\n"));

	/* free memory of fnt_nodes */
	for (node = fattr.fnlist.tlh_Head; (next = node->tln_Succ); node = next)
	{
		struct fnt_node *fnn = (struct fnt_node *)node;
		TExecFree(exec, fnn->fname);
		TRemove(&fnn->node);
		TExecFree(exec, fnn);
	}

	return fqh;
}
Esempio n. 8
0
/* dump properties of a fontquerynode
*/
static void
fnt_dumpnode(struct FontQueryNode *fqn)
{
	TDBPRINTF(10, ("-----------------------------------------------\n"));
	TDBPRINTF(10, ("dumping fontquerynode @ %p\n", fqn));
	TDBPRINTF(10, (" * FontName: %s\n", (TSTRPTR)fqn->tags[0].tti_Value));
	TDBPRINTF(10, (" * PxSize:   %d\n", (TINT)fqn->tags[1].tti_Value));
	//TDBPRINTF(10, (" * Italic:   %s\n", (TBOOL)fqn->tags[2].tti_Value ? "on" : "off"));
	//TDBPRINTF(10, (" * Bold:     %s\n", (TBOOL)fqn->tags[3].tti_Value ? "on" : "off"));
	TDBPRINTF(10, ("-----------------------------------------------\n"));
}
Esempio n. 9
0
LOCAL void
fb_getselection(WINDISPLAY *mod, struct TVRequest *req)
{
	struct TExecBase *TExecBase = TGetExecBase(mod);
	LPSTR utf8 = NULL;
	int utf8Bytes = 0;
	HANDLE clipData;
	LPCWSTR utf16; 

	req->tvr_Op.GetSelection.Data = TNULL;
	req->tvr_Op.GetSelection.Length = 0;

	if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
	{
		TDBPRINTF(TDB_WARN,(
				  "no 'CF_UNICODETEXT' Windows clipboard data available\n"));
		return;
	}
	if (!OpenClipboard(mod->fbd_DeviceHWnd))
	{
		TDBPRINTF(TDB_WARN, ("cannot open Windows clipboard\n"));
		return;
	}
	clipData = GetClipboardData(CF_UNICODETEXT);
	if (clipData != NULL)
	{
		utf16 = GlobalLock(clipData);
		utf8Bytes = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, 
										NULL, 0, NULL, 0);
		if (utf8Bytes != 0)
		{
			utf8 = (LPSTR) TAlloc(TNULL, utf8Bytes);
			utf8Bytes = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, 
											utf8, utf8Bytes, NULL, 0);
		}
		GlobalUnlock(clipData);
	}
	else
		TDBPRINTF(TDB_WARN, ("no Windows clipboard data\n"));
	CloseClipboard();

	if (!utf8Bytes)
	{
		TFree(utf8);
		TDBPRINTF(TDB_WARN, (
				  "failed encoding UTF-8 from Windows clipboard\n"));
		return;
	}
	--utf8Bytes;
	TDBPRINTF(TDB_TRACE,("get selection: N = %d S = '%s'\n", utf8Bytes, utf8));
	req->tvr_Op.GetSelection.Data = utf8;
	req->tvr_Op.GetSelection.Length = utf8Bytes;
}
Esempio n. 10
0
static TCALLBACK TINT
tek_lib_display_dfb_close(lua_State *L)
{
	TEKDisplay *display = luaL_checkudata(L, 1, TEK_LIB_DISPLAY_DFB_CLASSNAME);
	TDBPRINTF(TDB_TRACE,("display %08x closing\n", display));
	if (display->IsBase)
	{
		/* collected base; remove TEKlib module: */
		TExecRemModules(display->ExecBase, &display->InitModules, 0);
		TDBPRINTF(TDB_TRACE,("display module removed\n"));
	}
	return 0;
}
Esempio n. 11
0
LOCAL TINT rfb_sendevent(struct rfb_Display *mod, TUINT type, TUINT code,
	TINT x, TINT y)
{
	TIMSG *msg;

	if (!rfb_getimsg(mod, TNULL, &msg, type))
		return 0;
	msg->timsg_Code = code;
	msg->timsg_MouseX = x;
	msg->timsg_MouseY = y;
	TINT res = 1;

	switch (type)
	{
		case TITYPE_MOUSEMOVE:
			rfb_passevent_mousemove(mod, msg);
			break;
		case TITYPE_MOUSEBUTTON:
			rfb_passevent_mousebutton(mod, msg);
			break;
		case TITYPE_KEYUP:
		case TITYPE_KEYDOWN:
			rfb_passevent_keyboard(mod, msg);
			break;
		default:
			TDBPRINTF(TDB_ERROR, ("illegal message type\n"));
			res = 0;
	}
	/* put back prototype message */
	TAddTail(&mod->rfb_IMsgPool, &msg->timsg_Node);
	return res;
}
Esempio n. 12
0
LOCAL void
dfb_closevisual(DFBDISPLAY *mod, struct TVRequest *req)
{
	struct DFBPen *pen;
	TAPTR exec = TGetExecBase(mod);
	DFBWINDOW *v = req->tvr_Op.CloseWindow.Window;
	if (v == TNULL) return;

	TDBPRINTF(TDB_INFO,("Visual close\n"));

	TRemove(&v->node);

	if (mod->dfb_Focused == (TAPTR) v)
	{
		/* pass focus on to the next window */
		DFBWINDOW *vt = (DFBWINDOW *)TFIRSTNODE(&mod->dfb_vlist);
		if (vt) genimsg(mod, TNULL, vt, TITYPE_FOCUS);
		mod->dfb_Focused = (TAPTR) vt;
	}

	if (mod->dfb_Active == (TAPTR) v)
		mod->dfb_Active = TNULL;

	while ((pen = (struct DFBPen *) TRemHead(&v->penlist)))
	{
		/* free pens */
		TRemove(&pen->node);
		TExecFree(mod->dfb_ExecBase, pen);
	}

	v->winsurface->Release(v->winsurface);
	v->window->Release(v->window);
	mod->dfb_fm.defref--;
	TExecFree(exec, v);
}
Esempio n. 13
0
LOCAL void
fb_openfont(WINDISPLAY *mod, struct TVRequest *req)
{
	req->tvr_Op.OpenFont.Font =
		fb_hostopenfont(mod, req->tvr_Op.OpenFont.Tags);
	TDBPRINTF(TDB_INFO,("font opened: %p\n", req->tvr_Op.OpenFont.Font));
}
Esempio n. 14
0
LOCAL void
exec_returnmsg(TEXECBASE *exec, TAPTR mem, TUINT status)
{
	struct TMessage *msg = TGETMSGPTR(mem);
	struct TMsgPort *replyport = msg->tmsg_RPort;
	if (replyport)
	{
		TAPTR hal = exec->texb_HALBase;

		THALLock(hal, &replyport->tmp_Lock);
		TAddTail(&replyport->tmp_MsgList, (struct TNode *) msg);
		msg->tmsg_Flags = status;
		if (replyport->tmp_Hook)
			TCALLHOOKPKT(replyport->tmp_Hook, replyport, (TTAG) msg);
		THALUnlock(hal, &replyport->tmp_Lock);

		THALSignal(hal, &replyport->tmp_SigTask->tsk_Thread,
			replyport->tmp_Signal);
	}
	else
	{
		exec_Free(exec, mem);	/* free one-way msg transparently */
		TDBPRINTF(TDB_TRACE,("message returned to memory manager\n"));
	}
}
Esempio n. 15
0
static THOOKENTRY TTAG
exec_dispatch(struct THook *hook, TAPTR obj, TTAG msg)
{
	struct TExecBase *TExecBase = hook->thk_Data;
	switch (msg)
	{
		case TMSG_DESTROY:
			THALDestroyLock(TExecBase->texb_HALBase, &TExecBase->texb_Lock);
			TDESTROY(&TExecBase->texb_BaseMemManager);
			TDESTROY(&TExecBase->texb_MsgMemManager);
			break;
		#if defined(ENABLE_EXEC_IFACE)
		case TMSG_QUERYIFACE:
		{
			struct TInterfaceQuery *ifq = obj;
			if (TStrEqual(ifq->tifq_Name, "exec") &&
				ifq->tifq_Version >= 1)
				return (TTAG) &TExecBase->texb_Exec1IFace;
			return TNULL;
		}
		case TMSG_DROPIFACE:
			TDBPRINTF(TDB_WARN,("drop interface: %p\n", obj));
			break;
		#endif
	}
	return 0;
}
Esempio n. 16
0
File: init.c Progetto: callcc/tekui
static void
init_destroyatom(TAPTR exec, TAPTR atom, TSTRPTR name)
{
	if (TExecLockAtom(exec, atom,
		TATOMF_TRY | TATOMF_DESTROY) != atom)
		TDBPRINTF(20, ("atom '%s' is still in use\n", name));
}
Esempio n. 17
0
static void x11_processevent(struct X11Display *mod)
{
	TAPTR TExecBase = TGetExecBase(mod);
	struct TNode *next, *node;
	XEvent ev;
	struct X11Window *v;
	Window w;

	while ((XPending(mod->x11_Display)) > 0)
	{
		XNextEvent(mod->x11_Display, &ev);
		if (ev.type == mod->x11_ShmEvent)
		{
			if (mod->x11_RequestInProgress)
			{
				TReplyMsg(mod->x11_RequestInProgress);
				mod->x11_RequestInProgress = TNULL;
				TDBPRINTF(TDB_TRACE, ("Released request (ShmEvent)\n"));
			}
			else
				TDBPRINTF(TDB_ERROR, ("shm event while no request pending\n"));
			continue;
		}

		/* lookup window: */
		w = ev.xany.window;
		v = TNULL;
		node = mod->x11_vlist.tlh_Head.tln_Succ;
		for (; (next = node->tln_Succ); node = next)
		{
			v = (struct X11Window *) node;
			if (v->window == w)
				break;
			v = TNULL;
		}

		if (v == TNULL)
		{
			TDBPRINTF(TDB_INFO,
				("Message Type %04x from unknown window: %p\n", ev.type, w));
			continue;
		}

		/* while true, spool out messages for this particular event: */
		while (x11_processvisualevent(mod, v, TNULL, &ev)) ;
	}
}
Esempio n. 18
0
File: hal.c Progetto: callcc/tekui
EXPORT void
hal_unloadmodule(struct THALBase *hal, TAPTR halmod)
{
	struct HALModule *hwm = halmod;
	FreeLibrary(hwm->hmd_Lib);
	TDBPRINTF(2,("module unloaded\n"));
	free(halmod);
}
Esempio n. 19
0
/* parses a single fontname or a comma separated list of fontnames
** and returns a list of fontnames, spaces are NOT filtered, so
** "helvetica, fixed" will result in "helvetica" and " fixed"
*/
static void
fnt_getfnnodes(DFBDISPLAY *mod, struct TList *fnlist, TSTRPTR fname)
{
	TINT i, p = 0;
	TBOOL lastrun = TFALSE;
	TINT fnlen = strlen(fname);
	TAPTR exec = TGetExecBase(mod);

	for (i = 0; i < fnlen; i++)
	{
		if (i == fnlen-1) lastrun = TTRUE;

		if (fname[i] == ',' || lastrun)
		{
			TINT len = (i > p) ? (lastrun ? (i-p+1) : (i-p)) : fnlen+1;
			TSTRPTR ts = TExecAlloc0(exec, mod->dfb_MemMgr, len+1);

			if (ts)
			{
				struct fnt_node *fnn;

				TExecCopyMem(exec, fname+p, ts, len);

				fnn = TExecAlloc0(exec, mod->dfb_MemMgr, sizeof(struct fnt_node));
				if (fnn)
				{
					/* add fnnode to fnlist */
					fnn->fname = ts;
					TAddTail(fnlist, &fnn->node);
				}
				else
				{
					TDBPRINTF(TDB_FAIL,("out of memory :(\n"));
					break;
				}
			}
			else
			{
				TDBPRINTF(TDB_FAIL,("out of memory :(\n"));
				break;
			}

			p = i+1;
		}
	}
}
Esempio n. 20
0
static void fnt_getfnnodes(struct rfb_Display *mod, struct TList *fnlist,
	TSTRPTR fname)
{
	TINT i, p = 0;
	TBOOL lastrun = TFALSE;
	TINT fnlen = strlen(fname);
	TAPTR TExecBase = mod->rfb_ExecBase;

	for (i = 0; i < fnlen; i++)
	{
		if (i == fnlen - 1)
			lastrun = TTRUE;

		if (fname[i] == ',' || lastrun)
		{
			TINT len = (i > p) ? (lastrun ? (i - p + 1) : (i - p)) : fnlen + 1;
			TSTRPTR ts = TAlloc0(mod->rfb_MemMgr, len + 1);

			if (ts)
			{
				struct fnt_node *fnn;

				memcpy(ts, fname + p, len);
				fnn = TAlloc0(mod->rfb_MemMgr, sizeof(struct fnt_node));
				if (fnn)
				{
					/* add fnnode to fnlist */
					fnn->fname = ts;
					TAddTail(fnlist, &fnn->node);
				}
				else
				{
					TDBPRINTF(20, ("out of memory :(\n"));
					break;
				}
			}
			else
			{
				TDBPRINTF(20, ("out of memory :(\n"));
				break;
			}

			p = i + 1;
		}
	}
}
Esempio n. 21
0
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;
}
Esempio n. 22
0
TLIBAPI TBOOL region_orrectlist(struct RectPool *pool, struct RectList *list, 
	TINT s[4], TBOOL opportunistic)
{
	if (list->rl_NumNodes > 0)
	{
		TINT x0 = s[0];
		TINT y0 = s[1];
		TINT x1 = s[2];
		TINT y1 = s[3];
		TUINT64 area = 0;
		
		struct TNode *next, *node = list->rl_List.tlh_Head;
		for (; (next = node->tln_Succ); node = next)
		{
			struct RectNode *rn = (struct RectNode *) node;
			TINT *r = rn->rn_Rect;
			if (s[0] >= r[0] && s[1] >= r[1] &&
				s[2] <= r[2] && s[3] <= r[3])
				return TTRUE;
			if (!opportunistic)
				continue;
			area += (r[2] - r[0] + 1) * (r[3] - r[1] + 1);
			x0 = TMIN(x0, r[0]);
			y0 = TMIN(y0, r[1]);
			x1 = TMAX(x1, r[2]);
			y1 = TMAX(y1, r[3]);
		}
		if (opportunistic)
		{
			TUINT64 area2 = (x1 - x0 + 1) * (y1 - y0 + 1);
			if (area2 < OPPORTUNISTIC_MERGE_THRESHOLD ||
				(area * 256 / area2) > OPPORTUNISTIC_MERGE_RATIO)
			{
				/* merge list into a single rectangle */
				TDBPRINTF(TDB_TRACE,("merge %d rects\n",
					list->rl_NumNodes + 1));
				region_freerects(pool, list);
				assert(list->rl_NumNodes == 0);
				return region_insertrect(pool, list, x0, y0, x1, y1);
			}
		}
	}

	struct RectList temp;
	region_initrectlist(&temp);
	if (region_cutrectlist(pool, list, &temp, s))
	{
		if (region_insertrect(pool, &temp, s[0], s[1], s[2], s[3]))
		{
			region_freerects(pool, list);
			region_relinkrects(list, &temp);
			return TTRUE;
		}
	}
	region_freerects(pool, &temp);
	return TFALSE;
}
Esempio n. 23
0
static void
fb_modclose(WINDISPLAY *mod)
{
	struct TExecBase *TExecBase = TGetExecBase(mod);
	TDBPRINTF(TDB_TRACE,("Device close\n"));
	TLock(mod->fbd_Lock);
	if (--mod->fbd_RefCount == 0)
		fb_exit(mod);
	TUnlock(mod->fbd_Lock);
}
Esempio n. 24
0
LOCAL TAPTR fb_hostopenfont(WINDISPLAY *mod, TTAGITEM *tags)
{
	TSTRPTR name = (TSTRPTR) TGetTag(tags, TVisual_FontName, TNULL);
	TUINT sz = (TUINT) TGetTag(tags, TVisual_FontPxSize, 0);
	HFONT font;
	TBOOL italic = (TBOOL) TGetTag(tags, TVisual_FontItalic, (TTAG) TFALSE);
	TBOOL bold = (TBOOL) TGetTag(tags, TVisual_FontBold, (TTAG) TFALSE);

	/* check availability: */
	TAPTR fqh = fb_hostqueryfonts(mod, tags);
	if (fqh)
	{
		TBOOL have_font = fb_hostgetnextfont(mod, fqh) != TNULL;
		TDestroy(fqh);
		if (!have_font)
		{
			TDBPRINTF(TDB_INFO,("Failed to open font '%s':%d\n", name, sz));
			return TNULL;
		}
	}
	else
		return TNULL;
	
	font = CreateFont(
		sz,
		0,
		0,
		0,
		bold ? FW_BOLD : FW_NORMAL,
		italic,
		0,				/* underline */
		0,				/* strikeout */
		ANSI_CHARSET,	/* charset */
		OUT_DEFAULT_PRECIS,	/* precision */
		CLIP_DEFAULT_PRECIS,
		DEFAULT_QUALITY,
		FF_DONTCARE | DEFAULT_PITCH,
		name);

	TDBPRINTF(TDB_INFO,("CreateFont %s:%d => %p\n", name, sz, font));

	return font;
}
Esempio n. 25
0
LOCAL void
fb_setinput(WINDISPLAY *mod, struct TVRequest *req)
{
	WINWINDOW *v = req->tvr_Op.SetInput.Window;
	req->tvr_Op.SetInput.OldMask = v->fbv_InputMask;
	v->fbv_InputMask = req->tvr_Op.SetInput.Mask;
	TDBPRINTF(TDB_TRACE,("Setinputmask: %08x\n", v->fbv_InputMask));
	/* spool out possible remaining messages: */
	fb_sendimessages(mod, TFALSE);
}
Esempio n. 26
0
File: hal.c Progetto: ld-test/tekui
static void TTASKENTRY hal_devfunc(struct TTask *task)
{
	TAPTR exec = TGetExecBase(task);
	struct THALBase *hal = TExecGetHALBase(exec);
	struct HALSpecific *hps = hal->hmb_Specific;
	struct HALThread *thread = TlsGetValue(hps->hsp_TLSIndex);
	TAPTR port = TExecGetUserPort(exec, task);
	struct TTimeRequest *msg;
	TUINT sig = 0;
	TTIME waittime, curtime;
	struct TNode *nnode, *node;

 	waittime.ttm_Sec = 2000000000;
 	waittime.ttm_USec = 0;

	for (;;)
	{
		sig = hal_timedwaitevent(hal, thread, &waittime,
			TTASK_SIG_ABORT | TTASK_SIG_USER);

		if (sig & TTASK_SIG_ABORT)
			break;

		EnterCriticalSection(&hps->hsp_DevLock);
		hal_getsystime(hal, &curtime);

		while ((msg = TExecGetMsg(exec, port)))
		{
			TAddTime(&msg->ttr_Data.ttr_Time, &curtime);
			TAddTail(&hps->hsp_ReqList, (struct TNode *) msg);
		}

		waittime.ttm_Sec = 2000000000;
		waittime.ttm_USec = 0;
		node = hps->hsp_ReqList.tlh_Head;
		for (; (nnode = node->tln_Succ); node = nnode)
		{
			struct TTimeRequest *tr = (struct TTimeRequest *) node;
			TTIME *tm = &tr->ttr_Data.ttr_Time;
			if (TCmpTime(&curtime, tm) >= 0)
			{
				TRemove(node);
				tr->ttr_Req.io_Error = 0;
				TExecReplyMsg(exec, node);
				continue;
			}
			if (TCmpTime(tm, &waittime) < 0)
				waittime = *tm;
		}

		LeaveCriticalSection(&hps->hsp_DevLock);
	}

	TDBPRINTF(2,("goodbye from HAL device\n"));
}
Esempio n. 27
0
File: hal.c Progetto: callcc/tekui
LOCAL TCALLBACK void
hal_close(struct THALBase *hal, struct TTask *task)
{
	struct HALSpecific *hws = hal->hmb_Specific;

	EnterCriticalSection(&hws->hsp_DevLock);

	if (hws->hsp_DevTask)
	{
		if (--hws->hsp_RefCount == 0)
		{
			TDBPRINTF(2,("hal.device refcount dropped to 0\n"));
			TExecSignal(hws->hsp_ExecBase, hws->hsp_DevTask, TTASK_SIG_ABORT);
			TDBPRINTF(2,("destroy hal.device task...\n"));
			TDestroy(hws->hsp_DevTask);
			hws->hsp_DevTask = TNULL;
		}
	}

	LeaveCriticalSection(&hws->hsp_DevLock);
}
Esempio n. 28
0
LOCAL void
dfb_hostsetfont(DFBDISPLAY *mod, DFBWINDOW *v, TAPTR font)
{
	if (font)
	{
		struct FontNode *fn = (struct FontNode *) font;
		v->winsurface->SetFont(v->winsurface, fn->font);
		v->curfont = font;
	}
	else
		TDBPRINTF(TDB_ERROR,("invalid font specified\n"));
}
Esempio n. 29
0
static int tek_lib_exec_base_gc(lua_State *L)
{
	TAPTR *pexec = luaL_checkudata(L, 1, "tek.lib.exec.base.meta");
	if (*pexec)
	{
		TAPTR basetask = TExecFindTask(*pexec, TTASKNAME_ENTRY);
		TDestroy(basetask);
		TDBPRINTF(5,("Exec closed\n"));
		*pexec = TNULL;
	}
	return 0;
}
Esempio n. 30
0
LOCAL TTAGITEM *fb_hostgetnextfont(WINDISPLAY *mod, struct FontQueryHandle *fqh)
{
    struct TNode *next = *fqh->nptr;
    TDBPRINTF(TDB_INFO,("getnextfont\n"));
    if (next->tln_Succ == TNULL)
    {
        fqh->nptr = &fqh->reslist.tlh_Head;
        return TNULL;
    }
    fqh->nptr = (struct TNode **)next;
    return ((struct FontQueryNode *)next)->tags;
}