1fd7d9bd3Smrg/*
2fd7d9bd3Smrg** xgc
3fd7d9bd3Smrg**
4fd7d9bd3Smrg** record.c
5fd7d9bd3Smrg*/
6fd7d9bd3Smrg
7fd7d9bd3Smrg#include <X11/Intrinsic.h>
8fd7d9bd3Smrg#include <X11/StringDefs.h>
9fd7d9bd3Smrg#include <X11/Xaw/Label.h>
10fd7d9bd3Smrg#include <X11/Xaw/Command.h>
11fd7d9bd3Smrg#include <X11/Xaw/Form.h>
12fd7d9bd3Smrg#include <X11/Shell.h>
13fd7d9bd3Smrg#include <X11/Xaw/AsciiText.h>
14fd7d9bd3Smrg#include <stdio.h>
15fd7d9bd3Smrg
16fd7d9bd3Smrg#include "xgc.h"
17fd7d9bd3Smrg
18fd7d9bd3Smrgstatic void start_recording(void);
19fd7d9bd3Smrgstatic void stop_recording(void);
20fd7d9bd3Smrgstatic void print_out_gc_values(void);
21fd7d9bd3Smrgstatic void chose_playback_filename(void);
22fd7d9bd3Smrgstatic void cancel_playback(void);
23fd7d9bd3Smrgstatic void done_choosing_filename(void) ;
24fd7d9bd3Smrgstatic void cancel_record(void);
25fd7d9bd3Smrg
26fd7d9bd3SmrgFILE *recordfile;		/* the file we're recording to */
27fd7d9bd3SmrgFILE *playbackfile;		/* the file we're playing back from */
28fd7d9bd3Smrg
29fd7d9bd3Smrg/* toggle_recordbutton(w,closure,call_data)
30fd7d9bd3Smrg** ----------------------------------------
31fd7d9bd3Smrg** This function is called when the user presses the "Record"
32fd7d9bd3Smrg** command button.  If we're not recording, we start; if we are,
33fd7d9bd3Smrg** we stop.  Also change the label to reflect the change in the
34fd7d9bd3Smrg** function of the button.
35fd7d9bd3Smrg*/
36fd7d9bd3Smrg
37fd7d9bd3Smrg/*ARGSUSED*/
38fd7d9bd3Smrgvoid
39fd7d9bd3Smrgtoggle_recordbutton(Widget w, caddr_t closure, caddr_t call_data)
40fd7d9bd3Smrg{
41fd7d9bd3Smrg  /* ArgList for changing the label */
42fd7d9bd3Smrg  static Arg recordargs[] = {
43fd7d9bd3Smrg    {XtNlabel,        (XtArgVal) NULL}
44fd7d9bd3Smrg  };
45e53c48bfSmrg
46fd7d9bd3Smrg  char tmp[20];			/* new label */
47e53c48bfSmrg
48fd7d9bd3Smrg  if (!recording) {
49fd7d9bd3Smrg    start_recording();
50fd7d9bd3Smrg  }
51fd7d9bd3Smrg  else {
52fd7d9bd3Smrg    recording = FALSE;
53fd7d9bd3Smrg    stop_recording();
54fd7d9bd3Smrg    snprintf(tmp, sizeof tmp, "Record");
55fd7d9bd3Smrg    recordargs[0].value = (XtArgVal) tmp;
56fd7d9bd3Smrg  }
57fd7d9bd3Smrg
58fd7d9bd3Smrg  XtSetValues(recordbutton,recordargs,XtNumber(recordargs));
59fd7d9bd3Smrg}
60fd7d9bd3Smrg
61fd7d9bd3Smrg/* start_recording()
62fd7d9bd3Smrg** -----------------
63fd7d9bd3Smrg** Get the name of the file the user wants to record into, and
64fd7d9bd3Smrg** start recording into it if he doesn't cancel.
65fd7d9bd3Smrg*/
66fd7d9bd3Smrg
67fd7d9bd3Smrgstatic void
68e53c48bfSmrgstart_recording(void)
69fd7d9bd3Smrg{
70fd7d9bd3Smrg  get_filename(done_choosing_filename,cancel_record);
71fd7d9bd3Smrg}
72fd7d9bd3Smrg
73fd7d9bd3Smrg/* stop_recording()
74fd7d9bd3Smrg** ----------------
75fd7d9bd3Smrg** Close the output file.
76fd7d9bd3Smrg*/
77fd7d9bd3Smrg
78fd7d9bd3Smrgstatic void
79e53c48bfSmrgstop_recording(void)
80fd7d9bd3Smrg{
81fd7d9bd3Smrg  fclose(recordfile);
82fd7d9bd3Smrg}
83fd7d9bd3Smrg
84fd7d9bd3Smrg/* cancel_record()
85fd7d9bd3Smrg** ---------------
86fd7d9bd3Smrg** What to do if the if the user canceled recording, i.e. nothing.
87fd7d9bd3Smrg*/
88fd7d9bd3Smrg
89fd7d9bd3Smrgstatic void
90e53c48bfSmrgcancel_record(void)
91fd7d9bd3Smrg{
92fd7d9bd3Smrg}
93fd7d9bd3Smrg
94fd7d9bd3Smrg/* done_choosing_filename()
95fd7d9bd3Smrg** ------------------------
96fd7d9bd3Smrg** What to do after the user's chosen a file.  Change the label on the
97fd7d9bd3Smrg** command button, open the file, and dump the current contents of the
98fd7d9bd3Smrg** GC into it.
99fd7d9bd3Smrg*/
100fd7d9bd3Smrg
101fd7d9bd3Smrgstatic void
102e53c48bfSmrgdone_choosing_filename(void)
103fd7d9bd3Smrg{
104fd7d9bd3Smrg  static Arg recordargs[] = {
105fd7d9bd3Smrg    {XtNlabel,        (XtArgVal) NULL},
106fd7d9bd3Smrg    {XtNresize,       (XtArgVal) True}
107fd7d9bd3Smrg  };
108fd7d9bd3Smrg  Arg args[1];
109fd7d9bd3Smrg  char tmp[20], *filename;
110fd7d9bd3Smrg
111fd7d9bd3Smrg  XtSetArg(args[0], XtNstring, &filename);
112fd7d9bd3Smrg  XtGetValues(filename_text_widget, args, (Cardinal) 1);
113fd7d9bd3Smrg
114fd7d9bd3Smrg  if ((recordfile = fopen(filename,"w")) != NULL) {
115fd7d9bd3Smrg    recording = TRUE;
116fd7d9bd3Smrg    snprintf(tmp, sizeof tmp, "End Record");
117fd7d9bd3Smrg    recordargs[0].value = (XtArgVal) tmp;
118fd7d9bd3Smrg    XtSetValues(recordbutton,recordargs,XtNumber(recordargs));
119fd7d9bd3Smrg
120fd7d9bd3Smrg    print_out_gc_values();
121fd7d9bd3Smrg  }
122fd7d9bd3Smrg}
123fd7d9bd3Smrg
124fd7d9bd3Smrg/* print_if_recording(str)
125fd7d9bd3Smrg** -----------------------
126fd7d9bd3Smrg** If we're recording to a file, put str in it.
127fd7d9bd3Smrg*/
128fd7d9bd3Smrg
129fd7d9bd3Smrgvoid
130fd7d9bd3Smrgprint_if_recording(const char *str)
131fd7d9bd3Smrg{
132fd7d9bd3Smrg  if (recording)
133fd7d9bd3Smrg    fprintf(recordfile,"%s",str);
134fd7d9bd3Smrg}
135fd7d9bd3Smrg
136fd7d9bd3Smrg/* close_file_if_recording()
137fd7d9bd3Smrg** -------------------------
138fd7d9bd3Smrg** If we're recording, stop.
139fd7d9bd3Smrg*/
140fd7d9bd3Smrg
141e53c48bfSmrgvoid
142fd7d9bd3Smrgclose_file_if_recording(void)
143fd7d9bd3Smrg{
144fd7d9bd3Smrg  if (recording)
145fd7d9bd3Smrg    fclose(recordfile);
146fd7d9bd3Smrg}
147fd7d9bd3Smrg
148fd7d9bd3Smrg/* print_out_gc_values()
149fd7d9bd3Smrg** ---------------------
150fd7d9bd3Smrg** Dump the contents of the GC to the file, so that when the file gets
151fd7d9bd3Smrg** played back, it will be correctly initialized.
152fd7d9bd3Smrg*/
153fd7d9bd3Smrg
154fd7d9bd3Smrgstatic void
155fd7d9bd3Smrgprint_out_gc_values(void)
156fd7d9bd3Smrg{
157fd7d9bd3Smrg  int i;
158fd7d9bd3Smrg  for (i=0;i<NUM_TESTS;++i) {
159fd7d9bd3Smrg    if ((TestStuff.data)[i].code == X.test) {
160fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
161fd7d9bd3Smrg	      TestStuff.choice.text,(TestStuff.data)[i].text);
162fd7d9bd3Smrg      break;
163fd7d9bd3Smrg    }
164fd7d9bd3Smrg  }
165fd7d9bd3Smrg  for (i=0;i<NUM_FUNCTIONS;++i) {
166fd7d9bd3Smrg    if ((FunctionStuff.data)[i].code == X.gcv.function) {
167fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
168fd7d9bd3Smrg	      FunctionStuff.choice.text,(FunctionStuff.data)[i].text);
169fd7d9bd3Smrg      break;
170fd7d9bd3Smrg    }
171fd7d9bd3Smrg  }
172fd7d9bd3Smrg  for (i=0;i<NUM_LINESTYLES;++i) {
173fd7d9bd3Smrg    if ((LinestyleStuff.data)[i].code == X.gcv.line_style) {
174fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
175fd7d9bd3Smrg	      LinestyleStuff.choice.text,(LinestyleStuff.data)[i].text);
176fd7d9bd3Smrg      break;
177fd7d9bd3Smrg    }
178fd7d9bd3Smrg  }
179fd7d9bd3Smrg  for (i=0;i<NUM_CAPSTYLES;++i) {
180fd7d9bd3Smrg    if ((CapstyleStuff.data)[i].code == X.gcv.cap_style) {
181fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
182fd7d9bd3Smrg	      CapstyleStuff.choice.text,(CapstyleStuff.data)[i].text);
183fd7d9bd3Smrg      break;
184fd7d9bd3Smrg    }
185fd7d9bd3Smrg  }
186fd7d9bd3Smrg  for (i=0;i<NUM_JOINSTYLES;++i) {
187fd7d9bd3Smrg    if ((JoinstyleStuff.data)[i].code == X.gcv.join_style) {
188fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
189fd7d9bd3Smrg	      JoinstyleStuff.choice.text,(JoinstyleStuff.data)[i].text);
190fd7d9bd3Smrg      break;
191fd7d9bd3Smrg    }
192fd7d9bd3Smrg  }
193fd7d9bd3Smrg  for (i=0;i<NUM_FILLSTYLES;++i) {
194fd7d9bd3Smrg    if ((FillstyleStuff.data)[i].code == X.gcv.fill_style) {
195fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
196fd7d9bd3Smrg	      FillstyleStuff.choice.text,(FillstyleStuff.data)[i].text);
197fd7d9bd3Smrg      break;
198fd7d9bd3Smrg    }
199fd7d9bd3Smrg  }
200fd7d9bd3Smrg  for (i=0;i<NUM_FILLRULES;++i) {
201fd7d9bd3Smrg    if ((FillruleStuff.data)[i].code == X.gcv.fill_rule) {
202fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
203fd7d9bd3Smrg	      FillruleStuff.choice.text,(FillruleStuff.data)[i].text);
204fd7d9bd3Smrg      break;
205fd7d9bd3Smrg    }
206fd7d9bd3Smrg  }
207fd7d9bd3Smrg  for (i=0;i<NUM_ARCMODES;++i) {
208fd7d9bd3Smrg    if ((ArcmodeStuff.data)[i].code == X.gcv.arc_mode) {
209fd7d9bd3Smrg      fprintf(recordfile,"%s %s\n",
210fd7d9bd3Smrg	      ArcmodeStuff.choice.text,(ArcmodeStuff.data)[i].text);
211fd7d9bd3Smrg      break;
212fd7d9bd3Smrg    }
213fd7d9bd3Smrg  }
214fd7d9bd3Smrg  fprintf(recordfile,"linewidth %d\n",X.gcv.line_width);
215fd7d9bd3Smrg  fprintf(recordfile,"foreground %ld\n",X.gcv.foreground);
216fd7d9bd3Smrg  fprintf(recordfile,"background %ld\n",X.gcv.background);
217fd7d9bd3Smrg  fprintf(recordfile,"planemask %ld\n",X.gcv.plane_mask);
218fd7d9bd3Smrg  fprintf(recordfile,"dashlist %d\n",X.gcv.dashes);
219fd7d9bd3Smrg  fprintf(recordfile,"font %s\n",X.fontname);
220e53c48bfSmrg}
221fd7d9bd3Smrg
222fd7d9bd3Smrg/********************************************/
223fd7d9bd3Smrg
224fd7d9bd3Smrg/* start_playback()
225fd7d9bd3Smrg** ----------------
226fd7d9bd3Smrg** This gets called if the user wants to playback from a file.
227fd7d9bd3Smrg** Get the file name and do the appropriate thing.
228fd7d9bd3Smrg*/
229fd7d9bd3Smrg
230fd7d9bd3Smrgvoid
231fd7d9bd3Smrgstart_playback(void)
232fd7d9bd3Smrg{
233fd7d9bd3Smrg  get_filename(chose_playback_filename,cancel_playback);
234fd7d9bd3Smrg}
235fd7d9bd3Smrg
236fd7d9bd3Smrg/* cancel_playback()
237fd7d9bd3Smrg** -----------------
238fd7d9bd3Smrg** What to do if the user canceled the playback request.
239fd7d9bd3Smrg*/
240fd7d9bd3Smrg
241fd7d9bd3Smrgstatic void
242fd7d9bd3Smrgcancel_playback(void)
243fd7d9bd3Smrg{
244fd7d9bd3Smrg}
245fd7d9bd3Smrg
246fd7d9bd3Smrg/* chose_playback_filename()
247fd7d9bd3Smrg** -------------------------
248fd7d9bd3Smrg** What to do once the user's selected a filename to playback.
249fd7d9bd3Smrg** Play it back.
250fd7d9bd3Smrg*/
251fd7d9bd3Smrg
252fd7d9bd3Smrgstatic void
253fd7d9bd3Smrgchose_playback_filename(void)
254fd7d9bd3Smrg{
255fd7d9bd3Smrg  Arg args[1];
256fd7d9bd3Smrg  char *filename;
257fd7d9bd3Smrg
258fd7d9bd3Smrg  XtSetArg(args[0], XtNstring, &filename);
259fd7d9bd3Smrg  XtGetValues(filename_text_widget, args, (Cardinal) 1);
260fd7d9bd3Smrg
261fd7d9bd3Smrg  if ((playbackfile = fopen(filename,"r")) != NULL) {
262fd7d9bd3Smrg    yyin = playbackfile;
263fd7d9bd3Smrg    yyparse();
264fd7d9bd3Smrg  }
265fd7d9bd3Smrg}
266fd7d9bd3Smrg
267fd7d9bd3Smrg/* read_from_keyboard()
268fd7d9bd3Smrg** --------------------
269fd7d9bd3Smrg** Do a playback from the keyboard.
270fd7d9bd3Smrg*/
271fd7d9bd3Smrg
272fd7d9bd3Smrgvoid
273fd7d9bd3Smrgread_from_keyboard(void)
274fd7d9bd3Smrg{
275fd7d9bd3Smrg  yyin = stdin;
276fd7d9bd3Smrg  yyparse();
277fd7d9bd3Smrg}
278