diff examples/unix/tcl/tcldisplay.c @ 3:71e20a32bd84

Initial revision
author darius
date Fri, 23 Jan 1998 16:05:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/unix/tcl/tcldisplay.c	Fri Jan 23 16:05:05 1998 +0000
@@ -0,0 +1,231 @@
+/*
+
+Name:
+TCLDISPLAY.C
+
+Description:
+TCL display section of mikmod 
+
+Peter Amstutz <amstpi@freenet.tlh.fl.us>
+
+HISTORY
+=======
+
+v1.00 (19/01/97) - split off from display.c to utilize TCL/TK frontend
+v1.01 (27/03/97) - added version verification, so the version of the
+					tcl/tk script has to match up with the version
+					that tclmikmod expects.  Also upper-ascii translation,
+					so mods that have ibm upper-ascii characters are translated
+					into something that vaguly resembles what it was supposed
+					to look like, rather than the gobbledygook that you end
+					up with otherwise...  translation table is stored in
+					"asc8-to-7.txt" (that is, 8 bit to 7 bit ascii)
+v1.02 (22/04/97) - modified to work with MikMod 3.0
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include "mikmod.h"
+
+extern int quiet;
+extern float speed_constant;   /* multiplier for tempo,initialised to 1 */
+int readme;
+int writeme;
+pid_t pid;
+extern UNIMOD *mf;
+extern int dorandom;
+
+void init_display(void)
+{
+	int pipe1[2];
+	int pipe2[2];
+	FILE *tclfile;
+	char c;
+	char verline[40];
+
+	if(quiet) return;
+
+	pipe(pipe1);
+	pipe(pipe2);
+
+	pid=fork();
+
+	if(pid==0)
+	{
+		dup2(pipe1[0],STDIN_FILENO);
+		close(pipe1[0]);
+		dup2(pipe2[1],STDOUT_FILENO);
+		close(pipe2[1]);
+		execlp("wish","wish",NULL);
+		perror("Error in fork() call to start wish!!!");
+		exit(1);
+	}
+	readme=pipe2[0];
+	writeme=pipe1[1];
+	if((tclfile=fopen("start.tcl","r"))==NULL)
+	{
+		perror("Error reading start.tcl file!");
+		exit(1);
+	}
+	fgets(verline,40,tclfile);
+	if(strcmp(verline,"#V1.13\n")!=0) 
+	{
+		perror("start.tcl version mismatch!");
+		exit(1);
+	} 
+	while(!feof(tclfile))
+	{
+		c=fgetc(tclfile);
+		write(writeme,&c,1);
+	}
+	c='\n';
+	write(writeme,&c,1);
+	usleep(500000);
+}
+
+void display_driver_error(char *myerr)
+{
+	if(quiet) return;
+	printf("Driver error: %s.\n",myerr);
+}	
+
+void display_driver(void)
+{
+	char string[512];
+	if(quiet) return;
+	sprintf(string,
+".top1.fra2.fra62.fra98.che5 %s\n"
+".top1.fra2.fra62.fra98.che6 %s\n"
+".top1.fra2.fra62.fra98.che7 %s\n"
+".top1.fra2.fra62.fra77.che1 %s\n"
+".top1.fra2.fra62.fra16.lab18 configure -text {%u}\n",
+		(md_mode&DMODE_16BITS) ? "deselect":"select",
+		(md_mode&DMODE_INTERP) ? "deselect":"select",
+		(md_mode&DMODE_STEREO) ? "deselect":"select",
+		(dorandom) ? "select":"deselect",
+		md_mixfreq);
+	write(writeme,string,strlen(string));
+}
+
+void display_file(void)
+{
+	char filename[255];
+	char arc[255];
+	char string[512];
+	if(quiet) return;
+	PL_GetCurrent(&playlist,filename,arc);
+	sprintf(string,"File: %s\n",filename); 
+	write(writeme,string,strlen(string));
+}
+
+void display_name()
+{
+	char string[512];
+	if(quiet) return;
+
+	sprintf(string,
+".top1.fra2.lab10 configure -text {\"%s\"}\n"
+".top1.fra2.fra22.lab25 configure -text {Type: %s}\n"
+".top1.fra2.fra22.lab30 configure -text {Periods: %s}\n",
+		mf->songname==NULL?"":mf->songname,
+		mf->modtype,
+		(mf->flags&UF_XMPERIODS) ? "XM type" : "mod type");
+	write(writeme,string,strlen(string));
+
+}
+
+void display_status()
+{
+	char string[512];
+	if(quiet) return;
+
+	sprintf(string,
+".top1.fra2.fra22.lab27 configure -text {Pattern: %i/ %i}\n"
+".top1.fra2.fra22.lab28 configure -text {Position: %i}\n"
+".top1.fra2.fra22.lab29 configure -text {Tempo: %i}\n",
+		mf->sngpos, mf->numpos,
+		mf->patpos, mf->sngspd);
+	write(writeme,string,strlen(string));
+}
+
+void exit_display()
+{
+	if(quiet) return;
+	write(writeme,"destroy .\n",10);
+	kill(pid,SIGKILL);
+}
+
+void display_instruments()
+{
+	int t, i, n;
+	char string[255];
+	unsigned char string2[255];
+	unsigned char upasc2lowasc[128];
+	FILE *table;
+
+	table=fopen("asc8-to-7.txt","r");
+	if(table!=NULL)
+	{
+		for(i=0;i<128;i++)
+		{
+			fgets(string,255,table);
+			upasc2lowasc[i]=string[4];
+		}
+	}
+
+	write(writeme,".inst.lb delete 0 end\n",31);
+
+	for(t=0;t<mf->numins;t++)
+	{
+		if(mf->instruments[t].insname!=NULL)
+		{
+		/* get rid of {}[]$ chars... You won't belive what a pain in 
+			the ass it was to find the bug that makes this code
+			essential */
+			for(i=0,n=0;i<strlen(mf->instruments[t].insname);i++,n++)
+			{
+			/* quote all possible characters that the tcl 
+			interpreter might try to interpret 
+			(yes, there are a lot) */
+				if(mf->instruments[t].insname[i]=='{' ||
+					mf->instruments[t].insname[i]=='}' ||
+					mf->instruments[t].insname[i]=='[' ||
+					mf->instruments[t].insname[i]==']' ||
+					mf->instruments[t].insname[i]=='$' ||
+					mf->instruments[t].insname[i]=='\"' ||
+					mf->instruments[t].insname[i]=='\\' ||
+					mf->instruments[t].insname[i]=='(' ||
+					mf->instruments[t].insname[i]==')' ||
+					mf->instruments[t].insname[i]=='@' ||
+					mf->instruments[t].insname[i]=='%' ||
+					mf->instruments[t].insname[i]=='#')
+				{
+					string2[n]='\\';
+					n++;
+				}
+				string2[n]=mf->instruments[t].insname[i];
+				if(string2[n]>127) 
+				{
+					string2[n]=upasc2lowasc[string2[n]-128];
+				}
+			}
+			string2[n]=0;
+			sprintf(string,".inst.lb insert end \"%s\"\n",string2);
+		}
+		else sprintf(string,".inst.lb insert end \"\"\n");
+		write(writeme,string,strlen(string));
+	}
+	fclose(table);
+}
+
+void display_all(void)
+{
+	if(quiet) return;
+	display_driver();
+	display_file();
+	display_name();
+	display_status();
+}