/* ** xgc ** ** record.c */ #include #include #include #include #include #include #include #include #include "xgc.h" static void start_recording(void); static void stop_recording(void); static void print_out_gc_values(void); static void chose_playback_filename(void); static void cancel_playback(void); static void done_choosing_filename(void) ; static void cancel_record(void); FILE *recordfile; /* the file we're recording to */ FILE *playbackfile; /* the file we're playing back from */ /* toggle_recordbutton(w,closure,call_data) ** ---------------------------------------- ** This function is called when the user presses the "Record" ** command button. If we're not recording, we start; if we are, ** we stop. Also change the label to reflect the change in the ** function of the button. */ /*ARGSUSED*/ void toggle_recordbutton(Widget w, caddr_t closure, caddr_t call_data) { /* ArgList for changing the label */ static Arg recordargs[] = { {XtNlabel, (XtArgVal) NULL} }; char tmp[20]; /* new label */ if (!recording) { start_recording(); } else { recording = FALSE; stop_recording(); snprintf(tmp, sizeof tmp, "Record"); recordargs[0].value = (XtArgVal) tmp; } XtSetValues(recordbutton,recordargs,XtNumber(recordargs)); } /* start_recording() ** ----------------- ** Get the name of the file the user wants to record into, and ** start recording into it if he doesn't cancel. */ static void start_recording(void) { get_filename(done_choosing_filename,cancel_record); } /* stop_recording() ** ---------------- ** Close the output file. */ static void stop_recording(void) { fclose(recordfile); } /* cancel_record() ** --------------- ** What to do if the if the user canceled recording, i.e. nothing. */ static void cancel_record(void) { } /* done_choosing_filename() ** ------------------------ ** What to do after the user's chosen a file. Change the label on the ** command button, open the file, and dump the current contents of the ** GC into it. */ static void done_choosing_filename(void) { static Arg recordargs[] = { {XtNlabel, (XtArgVal) NULL}, {XtNresize, (XtArgVal) True} }; Arg args[1]; char tmp[20], *filename; XtSetArg(args[0], XtNstring, &filename); XtGetValues(filename_text_widget, args, (Cardinal) 1); if ((recordfile = fopen(filename,"w")) != NULL) { recording = TRUE; snprintf(tmp, sizeof tmp, "End Record"); recordargs[0].value = (XtArgVal) tmp; XtSetValues(recordbutton,recordargs,XtNumber(recordargs)); print_out_gc_values(); } } /* print_if_recording(str) ** ----------------------- ** If we're recording to a file, put str in it. */ void print_if_recording(const char *str) { if (recording) fprintf(recordfile,"%s",str); } /* close_file_if_recording() ** ------------------------- ** If we're recording, stop. */ void close_file_if_recording(void) { if (recording) fclose(recordfile); } /* print_out_gc_values() ** --------------------- ** Dump the contents of the GC to the file, so that when the file gets ** played back, it will be correctly initialized. */ static void print_out_gc_values(void) { int i; for (i=0;i