[teklib-general] changeset in /hg/teklib/current: added visual open and close, ad...

Timm S. Mueller tmueller at neoscientists.org
Mon Nov 26 16:22:09 CET 2007


changeset 837f570b197d in /hg/teklib/current
details: http://teklib.org:8001/hg/teklib/current?cmd=changeset;node=837f570b197d
description:
	added visual open and close, adapted bashing demo

diffs (truncated from 485 to 300 lines):

diff -r a21c9873ce63 -r 837f570b197d src/visual/tests/bashing.c
--- a/src/visual/tests/bashing.c	Sun Aug 19 20:31:06 2007 +0200
+++ b/src/visual/tests/bashing.c	Mon Aug 20 01:35:46 2007 +0200
@@ -185,110 +185,118 @@ TTASKENTRY TVOID TEKMain(TAPTR task)
 	TExecBase = TGetExecBase(task);
 	TUtilBase = TOpenModule("util", 0, TNULL);
 	TTimeBase = TOpenModule("time", 0, TNULL);
+
 	if (TUtilBase && TTimeBase)
 	{
-		TAPTR v;
-		TTAGITEM vistags[4];
-
-		vistags[0].tti_Tag = TVisual_PixWidth;
-		vistags[0].tti_Value = (TTAG) 680;
-		vistags[1].tti_Tag = TVisual_PixHeight;
-		vistags[1].tti_Value = (TTAG) 460;
-		vistags[2].tti_Tag = TVisual_Title;
-		vistags[2].tti_Value = (TTAG) "Visual multibashing";
-		vistags[3].tti_Tag = TTAG_DONE;
-
-		v = TOpenModule("visual", 0, vistags);
-		if (v)
-		{
-			TIMSG *imsg;
-			TBOOL abort = TFALSE;
-			TAPTR iport;
-
-			TINT x, y, i = 0;
-			TVPEN pentab[8];
-			TAPTR tasks[6] = {TNULL, TNULL, TNULL, TNULL, TNULL, TNULL};
-
-			pentab[0] = TVisualAllocPen(v, 0xffffff);
-			pentab[1] = TVisualAllocPen(v, 0xff00ff);
-			pentab[2] = TVisualAllocPen(v, 0xff0000);
-			pentab[3] = TVisualAllocPen(v, 0x0000ff);
-			pentab[4] = TVisualAllocPen(v, 0x00ff00);
-			pentab[5] = TVisualAllocPen(v, 0x00ffff);
-			pentab[6] = TVisualAllocPen(v, 0x112233);
-			pentab[7] = TVisualAllocPen(v, 0x000000);
-
-			TVisualClear(v, pentab[7]);
-
-			for (y = 0; y < 2; ++y)
+		TAPTR vismod = TOpenModule("visual", 0, TNULL);
+		if (vismod)
+		{
+			TAPTR v;
+			TTAGITEM vistags[4];
+
+			vistags[0].tti_Tag = TVisual_PixWidth;
+			vistags[0].tti_Value = (TTAG) 680;
+			vistags[1].tti_Tag = TVisual_PixHeight;
+			vistags[1].tti_Value = (TTAG) 460;
+			vistags[2].tti_Tag = TVisual_Title;
+			vistags[2].tti_Value = (TTAG) "Visual multibashing";
+			vistags[3].tti_Tag = TTAG_DONE;
+
+			v = TVisualOpen(vismod, vistags);
+			if (v)
 			{
-				for (x = 0; x < 3; ++x)
+				TIMSG *imsg;
+				TBOOL abort = TFALSE;
+				TAPTR iport;
+
+				TINT x, y, i = 0;
+				TVPEN pentab[8];
+				TAPTR tasks[6] = {TNULL, TNULL, TNULL, TNULL, TNULL, TNULL};
+
+				pentab[0] = TVisualAllocPen(v, 0xffffff);
+				pentab[1] = TVisualAllocPen(v, 0xff00ff);
+				pentab[2] = TVisualAllocPen(v, 0xff0000);
+				pentab[3] = TVisualAllocPen(v, 0x0000ff);
+				pentab[4] = TVisualAllocPen(v, 0x00ff00);
+				pentab[5] = TVisualAllocPen(v, 0x00ffff);
+				pentab[6] = TVisualAllocPen(v, 0x112233);
+				pentab[7] = TVisualAllocPen(v, 0x000000);
+
+				TVisualClear(v, pentab[7]);
+
+				for (y = 0; y < 2; ++y)
 				{
-					TTAGITEM tasktags[2];
-					struct efxdata init;
-					init.x = 20 + x * 220;
-					init.y = 20 + y * 220;
-					init.pen = pentab[i];
-					init.backpen = pentab[6];
-					init.whitepen = pentab[0];
-					init.blackpen = pentab[7];
-					init.visual = v;
-					tasktags[0].tti_Tag = TTask_UserData;
-					tasktags[0].tti_Value = (TTAG) &init;
-					tasktags[1].tti_Tag = TTAG_DONE;
-					tasks[i] = TCreateTask(efxfunc,
-						efxinitfunc, tasktags);
-					i++;
+					for (x = 0; x < 3; ++x)
+					{
+						TTAGITEM tasktags[2];
+						struct efxdata init;
+						init.x = 20 + x * 220;
+						init.y = 20 + y * 220;
+						init.pen = pentab[i];
+						init.backpen = pentab[6];
+						init.whitepen = pentab[0];
+						init.blackpen = pentab[7];
+						init.visual = v;
+						tasktags[0].tti_Tag = TTask_UserData;
+						tasktags[0].tti_Value = (TTAG) &init;
+						tasktags[1].tti_Tag = TTAG_DONE;
+						tasks[i] = TCreateTask(efxfunc,
+							efxinitfunc, tasktags);
+						i++;
+					}
 				}
+
+				TVisualSetInput(v, TITYPE_NONE, TITYPE_CLOSE |
+					TITYPE_COOKEDKEY | TITYPE_NEWSIZE | TITYPE_REFRESH);
+
+				iport = TVisualGetPort(v);
+
+				do
+				{
+					TWait(TGetPortSignal(iport));
+
+					while ((imsg = (TIMSG *) TGetMsg(iport)))
+					{
+						switch (imsg->timsg_Type)
+						{
+							case TITYPE_REFRESH:
+							case TITYPE_NEWSIZE:
+								TVisualClear(v, pentab[7]);
+								break;
+
+							case TITYPE_CLOSE:
+								abort = TTRUE;
+								break;
+
+							case TITYPE_COOKEDKEY:
+								if (imsg->timsg_Code == TKEYC_ESC)
+									abort = TTRUE;
+								break;
+						}
+						TAckMsg(imsg);
+					}
+
+				} while (!abort);
+
+				for (i = 0; i < 6; ++i)
+				{
+					if (tasks[i])
+					{
+						TSignal(tasks[i], TTASK_SIG_ABORT);
+						TDestroy(tasks[i]);
+					}
+				}
+
+				for (i = 0; i < 8; ++i)
+					TVisualFreePen(v, pentab[i]);
+
+				TVisualClose(vismod, v);
 			}
 
-			TVisualSetInput(v, TITYPE_NONE, TITYPE_CLOSE | TITYPE_COOKEDKEY |
-				TITYPE_NEWSIZE | TITYPE_REFRESH);
-
-			iport = TVisualGetPort(v);
-
-			do
-			{
-				TWait(TGetPortSignal(iport));
-
-				while ((imsg = (TIMSG *) TGetMsg(iport)))
-				{
-					switch (imsg->timsg_Type)
-					{
-						case TITYPE_REFRESH:
-						case TITYPE_NEWSIZE:
-							TVisualClear(v, pentab[7]);
-							break;
-
-						case TITYPE_CLOSE:
-							abort = TTRUE;
-							break;
-
-						case TITYPE_COOKEDKEY:
-							if (imsg->timsg_Code == TKEYC_ESC)
-								abort = TTRUE;
-							break;
-					}
-					TAckMsg(imsg);
-				}
-
-			} while (!abort);
-
-			for (i = 0; i < 6; ++i)
-			{
-				if (tasks[i])
-				{
-					TSignal(tasks[i], TTASK_SIG_ABORT);
-					TDestroy(tasks[i]);
-				}
-			}
-
-			for (i = 0; i < 8; ++i)
-				TVisualFreePen(v, pentab[i]);
-
-			TCloseModule(v);
+			TCloseModule(vismod);
 		}
 	}
+
 	TCloseModule(TTimeBase);
 	TCloseModule(TUtilBase);
 }
diff -r a21c9873ce63 -r 837f570b197d src/visual/visual_api.c
--- a/src/visual/visual_api.c	Sun Aug 19 20:31:06 2007 +0200
+++ b/src/visual/visual_api.c	Mon Aug 20 01:35:46 2007 +0200
@@ -298,3 +298,27 @@ vis_fpoly(TMOD_VIS *mod, TINT16 *array, 
 	TExecDoIO(TGetExecBase(mod), (struct TIORequest *) req);
 	vis_ungetreq(mod, req);
 }
+
+/*****************************************************************************/
+
+EXPORT TAPTR
+vis_open(TMOD_VIS *mod, TTAGITEM *usertags)
+{
+	TTAGITEM vtags[2];
+	vtags[0].tti_Tag = TVisual_Open;
+	vtags[0].tti_Value = TTRUE;
+	vtags[1].tti_Tag = TTAG_MORE;
+	vtags[1].tti_Value = (TTAG) usertags;
+
+	/* Create a new instance: */
+	return TExecOpenModule(TGetExecBase(mod), "visual", 0, vtags);
+}
+
+/*****************************************************************************/
+
+EXPORT TVOID
+vis_close(TMOD_VIS *mod, TAPTR inst)
+{
+	TExecCloseModule(TGetExecBase(mod), inst);
+}
+
diff -r a21c9873ce63 -r 837f570b197d src/visual/visual_mod.c
--- a/src/visual/visual_mod.c	Sun Aug 19 20:31:06 2007 +0200
+++ b/src/visual/visual_mod.c	Mon Aug 20 01:35:46 2007 +0200
@@ -104,6 +104,8 @@ vis_vectors[VISUAL_NUMVECTORS] =
 	(TMFPTR) vis_attach,
 	(TMFPTR) vis_fpoly,
 	(TMFPTR) vis_setattrs,
+	(TMFPTR) vis_open,
+	(TMFPTR) vis_close,
 };
 
 /*****************************************************************************/
@@ -140,9 +142,16 @@ vis_modopen(TMOD_VIS *mod, TTAGITEM *tag
 {
 	TMOD_VIS *inst, *attach;
 	TAPTR exec = TGetExecBase(mod);
+	TBOOL open = TGetTag(tags, TVisual_Open, TFALSE);
 
 	attach = (TMOD_VIS *) TGetTag(tags, TVisual_Attach, TNULL);
 	if (attach) mod = attach; /* instance to attach to */
+
+	if (!open && !attach)
+	{
+		/* not opening a new instance, just return the module base: */
+		return mod;
+	}
 
 	inst = TNewInstance(mod, mod->vis_Module.tmd_PosSize,
 		mod->vis_Module.tmd_NegSize);
@@ -205,41 +214,47 @@ static TVOID
 static TVOID
 vis_modclose(TMOD_VIS *mod)
 {
-	TAPTR exec = TGetExecBase(mod);
-	VISREQ *req;
-
-	if (mod->vis_IsClient)
-	{
-		/* detach ourselves */
-		vis_remclient(mod);
-		vis_wake(mod);
-	}
-
-	/* wait for and free queued packages in the waitlist */
-	while ((req = (VISREQ *) TRemHead(&mod->vis_WaitList)))
-	{
-		vis_wake(mod);
-		TExecWaitIO(exec, (struct TIORequest *) req);
-		TExecFree(exec, req);
-	}
-
-	if (!mod->vis_IsClient)


More information about the teklib-general mailing list