[teklib-general] changeset in /hg/teklib/current: visuals now support fonts outsi...

Franciska Schulze fschulze at neoscientists.org
Mon Nov 26 16:22:12 CET 2007


changeset fd2fc4502d44 in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=fd2fc4502d44
description:
	visuals now support fonts outside the scope of instances

diffs (truncated from 773 to 300 lines):

diff -r d9ec5cc029cb -r fd2fc4502d44 src/visual/posix/visual_host.c
--- a/src/visual/posix/visual_host.c	Sun Sep 02 14:52:51 2007 +0200
+++ b/src/visual/posix/visual_host.c	Sun Sep 02 18:44:44 2007 +0200
@@ -17,14 +17,6 @@
 #include "visual_host.h"
 
 static TBOOL shm_available;
-
-struct attrdata
-{
-	TMOD_VIS *mod;
-	VISUAL *v;
-	TAPTR font;
-	TINT num;
-};
 
 /*****************************************************************************/
 #define FNT_LENGTH		41			/* "-*-fname-medium-r-*-*-xxx-*-*-*-*-*-iso8859-1" */
@@ -42,9 +34,10 @@ struct FontNode
 	XFontStruct *font;
 };
 
-static TAPTR
-openfont(TMOD_VIS *mod, VISUAL *v, TTAGITEM *tags)
-{
+LOCAL TAPTR
+vis_hostopenfont(TMOD_VIS *mod, TTAGITEM *tags)
+{
+	GLOBAL *g = mod->vis_HostGlobal;
 	TINT fpxsize;
 	TBOOL fitalic, fbold;
 	TAPTR font = TNULL;
@@ -77,12 +70,12 @@ openfont(TMOD_VIS *mod, VISUAL *v, TTAGI
 		fn = TExecAlloc0(exec, mod->vis_MMU, sizeof(struct FontNode));
 		if (fn)
 		{
-			fn->font = XLoadQueryFont(v->display, fquery);
+			fn->font = XLoadQueryFont(g->display, fquery);
 			if (fn->font)
 			{
 				/* append to the list of open fonts */
 				TDBPRINTF(10, ("'%s' successfully loaded\n", fname));
-				TAddTail(&v->fm.openfonts, &fn->node);
+				TAddTail(&g->fm.openfonts, &fn->node);
 				font = (TAPTR)fn;
 			}
 			else
@@ -91,8 +84,8 @@ openfont(TMOD_VIS *mod, VISUAL *v, TTAGI
 				TDBPRINTF(10, ("unable to load '%s'\n", fname));
 				TDBPRINTF(10, ("defaulting to '%s'\n", DEFFONTNAME));
 				TExecFree(exec, fn);
-				font = v->fm.deffont;
-				v->fm.defref++;
+				font = g->fm.deffont;
+				g->fm.defref++;
 			}
 		}		
 
@@ -103,42 +96,55 @@ openfont(TMOD_VIS *mod, VISUAL *v, TTAGI
 }
 
 static TVOID
-setfont(TMOD_VIS *mod, VISUAL *v, TAPTR font)
-{
+setfont(TMOD_VIS *mod, TAPTR font)
+{
+	VISUAL *v = mod->vis_HostVisual;
 	XGCValues gcv;
 	struct FontNode *fn = (struct FontNode *) font;
+
 	gcv.font = fn->font->fid;
 	XChangeGC(v->display, v->gc, GCFont, &gcv);
-	v->fm.curfont = font;
-}
-
-static TVOID
-closefont(TMOD_VIS *mod, VISUAL *v, TAPTR font)
-{
+	v->curfont = font;
+}
+
+LOCAL TVOID
+vis_hostclosefont(TMOD_VIS *mod, TAPTR font)
+{
+	GLOBAL *g = mod->vis_HostGlobal;
 	struct FontNode *fn = (struct FontNode *) font;
 	TAPTR exec = TGetExecBase(mod);
 
-	if (font == v->fm.deffont)
-	{
-		if (v->fm.defref)
+	if (font == g->fm.deffont)
+	{
+		if (g->fm.defref)
 		{
 			/* prevent freeing of default font if it's */
 			/* still referenced */
-			v->fm.defref--;
+			g->fm.defref--;
 			return;
 		}
 	}
 	else
 	{
-		/* the font we're going to free is currently 	*/
-		/* in use -> replace it with the default font 	*/
-		if (font == v->fm.curfont)
-			setfont(mod, v, v->fm.deffont);
+		struct TNode *node, *next;
+		node = g->vlist.tlh_Head;
+		for (; (next = node->tln_Succ); node = next)
+		{
+			/* the font we're going to free is currently 	*/
+			/* in use -> replace it with the default font 	*/
+			VISUAL *v = (VISUAL *) node;
+			
+			if (font == v->curfont)
+				setfont(v->mod, g->fm.deffont);
+		}
 	}
 	
 	/* free xfont */
 	if (fn->font)
-		XFreeFont(v->display, fn->font);
+	{
+		XFreeFont(g->display, fn->font);
+		fn->font = TNULL;
+	}
 		
 	/* remove from openfonts list */
 	TRemove(&fn->node);
@@ -147,8 +153,8 @@ closefont(TMOD_VIS *mod, VISUAL *v, TAPT
 	TExecFree(exec, fn);
 }
 
-static TINT
-textsize(TMOD_VIS *mod, VISUAL *v, TAPTR font, TSTRPTR text)
+LOCAL TINT
+vis_hosttextsize(TMOD_VIS *mod, TAPTR font, TSTRPTR text)
 {
 	TINT len;
 	struct FontNode *fn = (struct FontNode *) font;
@@ -156,8 +162,8 @@ textsize(TMOD_VIS *mod, VISUAL *v, TAPTR
 	return len;
 }
 
-static THOOKENTRY TTAG
-getfattrfunc(struct THook *hook, TAPTR obj, TTAG msg)
+LOCAL THOOKENTRY TTAG
+vis_hostgetfattrfunc(struct THook *hook, TAPTR obj, TTAG msg)
 {
 	struct attrdata *data = hook->thk_Data;
 	TTAGITEM *item = obj;
@@ -323,7 +329,7 @@ static TVOID
 static TVOID
 drawtext1(TMOD_VIS *mod, VISUAL *v, TINT x, TINT y, TSTRPTR text, TINT len)
 {
-	XFontStruct *f = ((struct FontNode *) v->fm.curfont)->font;
+	XFontStruct *f = ((struct FontNode *) v->curfont)->font;
  	XDrawString(v->display, v->window, v->gc,
  		x, y + f->ascent, (char *) text, len);
 }
@@ -333,7 +339,7 @@ static TVOID
 static TVOID
 drawtext2(TMOD_VIS *mod, VISUAL *v, TINT x, TINT y, TSTRPTR text, TINT len)
 {
-	XFontStruct *f = ((struct FontNode *) v->fm.curfont)->font;
+	XFontStruct *f = ((struct FontNode *) v->curfont)->font;
  	XDrawImageString(v->display, v->window, v->gc,
  		x, y + f->ascent, (char *) text, len);
 }
@@ -614,7 +620,7 @@ getattrfunc(struct THook *hook, TAPTR ob
 {
 	struct attrdata *data = hook->thk_Data;
 	TTAGITEM *item = obj;
-	VISUAL *v = data->v;
+	VISUAL *v = data->mod->vis_HostVisual;
 
 	switch (item->tti_Tag)
 	{
@@ -660,7 +666,7 @@ setattrfunc(struct THook *hook, TAPTR ob
 {
 	struct attrdata *data = hook->thk_Data;
 	TTAGITEM *item = obj;
-	VISUAL *v = data->v;
+	VISUAL *v = data->mod->vis_HostVisual;
 	switch (item->tti_Tag)
 	{
 		default:
@@ -698,7 +704,7 @@ LOCAL TVOID
 LOCAL TVOID
 vis_prepareimsg(TMOD_VIS *mod, TIMSG *imsg)
 {
-	VISUAL *v = mod->vis_HostSpecific;
+	VISUAL *v = mod->vis_HostVisual;
 	imsg->timsg_Qualifier = v->keyqual;
 	imsg->timsg_MouseX = v->mousex;
 	imsg->timsg_MouseY = v->mousey;
@@ -714,7 +720,7 @@ static TBOOL
 static TBOOL
 getnextevent(TMOD_VIS *mod, TIMSG *newimsg)
 {
-	VISUAL *v = mod->vis_HostSpecific;
+	VISUAL *v = mod->vis_HostVisual;
 	XEvent ev;
 
 	KeySym keysym;
@@ -1173,15 +1179,75 @@ getprops(TMOD_VIS *mod, VISUAL *v)
 
 /*****************************************************************************/
 
-static const TUINT8 endiancheck[4] = { 0x11,0x22,0x33,0x44 };
-
 LOCAL TBOOL
 vis_init(TMOD_VIS *mod)
 {
+	struct FontNode *fn;
+	TAPTR exec = TGetExecBase(mod);
+	GLOBAL *g = TExecAlloc0(exec, mod->vis_MMU, sizeof(GLOBAL));
+	if (g == TNULL) return TFALSE;
+
+	for (;;)
+	{
+		TInitList(&g->vlist);
+
+		g->display = XOpenDisplay(TNULL);
+		if (g->display == TNULL) break;
+
+		/* init fontmanager and default font */
+		TInitList(&g->fm.openfonts);
+
+		fn = TExecAlloc0(exec, mod->vis_MMU, sizeof(struct FontNode));
+		if (fn == TNULL) break;
+
+		fn->font = XLoadQueryFont(g->display, DEFFONTNAME);
+		if (fn->font == TNULL)
+		{
+			TExecFree(exec, fn);
+			break;
+		}
+
+		TAddTail(&g->fm.openfonts, &fn->node);
+		g->fm.deffont = (TAPTR)fn;
+		//g->fm.curfont = (TAPTR)fn;
+
+		TDBPRINTF(20,("vis_init - mod: %p - global: %p\n", mod, g));
+		mod->vis_HostGlobal = g;
+		return TTRUE;
+	}
+
+	vis_exit(mod);
+	return TFALSE;
+}
+
+LOCAL TVOID
+vis_exit(TMOD_VIS *mod)
+{
+	TAPTR exec = TGetExecBase(mod);
+	GLOBAL *g = mod->vis_HostGlobal;
+		
+	TDBPRINTF(20,("vis_exit - mod: %p - global: %p\n", mod, g));
+	
+	if (g->fm.deffont)
+		vis_hostclosefont(mod, g->fm.deffont);
+
+	if (g->display)
+		XCloseDisplay(g->display);
+
+	TExecFree(exec, g);
+	mod->vis_HostGlobal = TNULL;
+}
+
+static const TUINT8 endiancheck[4] = { 0x11,0x22,0x33,0x44 };
+
+LOCAL TBOOL
+vis_open(TMOD_VIS *mod)
+{
+	GLOBAL *g = mod->vis_HostGlobal;
 	TAPTR exec = TGetExecBase(mod);
 	VISUAL *v = TExecAlloc0(exec, mod->vis_MMU, sizeof(VISUAL));
 	if (v == TNULL) return TFALSE;
-	mod->vis_HostSpecific = v;
+	mod->vis_HostVisual = v;
 	TInitList(&v->imsgpool);
 
 	for (;;)
@@ -1191,7 +1257,9 @@ vis_init(TMOD_VIS *mod)
 		XGCValues gcv;
 		TUINT gcv_mask;
 		int pipefd[2];
-		struct FontNode *fn;
+		struct FontNode *fn = g->fm.deffont;
+		v->curfont = fn;
+		g->fm.defref++;
 		
 		v->HalBase = TExecGetHALBase(TGetExecBase(mod));
 		THALInitLock(v->HalBase, &v->lock);
@@ -1202,8 +1270,9 @@ vis_init(TMOD_VIS *mod)
 		v->sizehints = XAllocSizeHints();
 		if (v->sizehints == TNULL) break;


More information about the teklib-general mailing list