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