ddc99296749c2feaf53af0190c15ace04391bcb5
[pcsx_rearmed.git] / plugins / dfxvideo / gpucfg-0.1df / main.c
1 #include <gtk/gtk.h>
2 #include <glade/glade.h>
3
4 #include "config.h"
5
6 #ifdef ENABLE_NLS
7 #include <libintl.h>
8 #include <locale.h>
9 #endif
10
11 #include <unistd.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <sys/stat.h>
16
17 void SaveConfig(GtkWidget *widget, gpointer user_datal);
18
19 #define READBINARY "rb"
20 #define WRITEBINARY "wb"
21 #define CONFIG_FILENAME "dfxvideo.cfg"
22
23 enum {
24         VIDMODE_320x200 = 0,
25         VIDMODE_640x480,
26         VIDMODE_800x600,
27         VIDMODE_1024x768,
28         VIDMODE_1152x864,
29         VIDMODE_1280x1024,
30         VIDMODE_1600x1200
31 }; /* Video_modes */
32
33 /*ADB static GtkWidget * wndMain=0;*/
34
35 /*      This function checks for the value being outside the accepted range,
36         and returns the appropriate boundary value */
37 int set_limit (char *p, int len, int lower, int upper)
38 {
39         int val = 0;
40
41         if (p)
42             val = atoi(p + len);
43         /* printf("Checking for val %d greater than %d and lower than %d, ", val, lower, upper);*/
44         if (val < lower)
45             val = lower;
46         if (val > upper)
47             val = upper;
48         /* printf ("val is now %d\n", val);*/
49     return val;
50 }
51
52 void on_about_clicked(GtkWidget *widget, gpointer user_data)
53 {
54         gtk_widget_destroy (widget);
55         exit (0);
56 }
57
58 void set_widget_sensitive(GtkWidget *widget, gpointer user_data)
59 {
60         gtk_widget_set_sensitive (widget, (int)user_data);
61 }
62
63 void on_fullscreen_toggled(GtkWidget *widget, gpointer user_data)
64 {
65         GtkWidget *check, *resCombo2;
66         GladeXML *xml;
67         xml = (GladeXML*) user_data;
68
69         check = glade_xml_get_widget(xml, "checkFullscreen");
70         resCombo2 = glade_xml_get_widget(xml, "resCombo2");
71
72         set_widget_sensitive(resCombo2, !gtk_toggle_button_get_active(check));
73 }
74
75 void on_use_fixes_toggled(GtkWidget *widget, gpointer user_data)
76 {
77         GtkWidget *check, *table_fixes;
78         GladeXML *xml;
79         xml = (GladeXML*) user_data;
80         check = glade_xml_get_widget (xml, "checkUseFixes");
81
82         table_fixes = glade_xml_get_widget (xml, "table_fixes");
83
84         /* Set the state of each of the fixes to the value of the use fixes toggle */
85         gtk_container_foreach (GTK_CONTAINER (table_fixes), (GtkCallback) set_widget_sensitive,
86                 (void *)gtk_toggle_button_get_active (check));
87 }
88
89 void on_fps_toggled(GtkWidget *widget, gpointer user_data)
90 {
91         GtkWidget *checkSetFPS, *checkAutoFPSLimit, *entryFPS;
92         GladeXML *xml;
93
94         xml = (GladeXML*) user_data;
95         checkSetFPS = glade_xml_get_widget(xml, "checkSetFPS");
96         checkAutoFPSLimit = glade_xml_get_widget(xml, "checkAutoFPSLimit");
97         entryFPS = glade_xml_get_widget(xml, "entryFPS");
98
99         set_widget_sensitive(entryFPS,
100                 gtk_toggle_button_get_active(checkSetFPS) && !gtk_toggle_button_get_active(checkAutoFPSLimit));
101         set_widget_sensitive(checkAutoFPSLimit, gtk_toggle_button_get_active(checkSetFPS));
102 }
103
104 void OnConfigClose(GtkWidget *widget, gpointer user_data)
105 {
106         GladeXML *xml = (GladeXML *)user_data;
107
108         gtk_widget_destroy(glade_xml_get_widget(xml, "CfgWnd"));
109         gtk_exit(0);
110 }
111
112 int
113 main (int argc, char *argv[])
114 {
115   GtkWidget *CfgWnd, *widget;
116   GladeXML *xml;
117   FILE *in;char t[256];int len,val; 
118   float valf;
119   char * pB, * p;
120   char cfg[255];
121   int i;
122   char tempstr[50];
123
124 #ifdef ENABLE_NLS
125   setlocale (LC_ALL, "");
126   bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
127   bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
128   textdomain (GETTEXT_PACKAGE);
129 #endif
130
131   if (argc!=2) {
132     printf("Usage: cfgDFXVideo {ABOUT | CFG}\n");
133     return 0;
134   }
135   if(strcmp(argv[1],"CFG")!=0 && strcmp(argv[1],"ABOUT")!=0) {
136     printf("Usage: cfgDFXVideo {ABOUT | CFG}\n");
137     return 0;
138   }
139
140   gtk_set_locale ();
141   gtk_init (&argc, &argv);
142
143
144        if (strcmp(argv[1], "ABOUT") == 0) {
145                 const char *authors[]= {"Pete Bernert and the P.E.Op.S. team", "Ryan Schultz", "Andrew Burton", NULL};
146                 widget = gtk_about_dialog_new ();
147                 gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (widget), "P.E.Op.S PCSX Video Plugin");
148                 gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (widget), "1.17");
149                 gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (widget), authors);
150                 gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (widget), "http://pcsx-df.sourceforge.net/");
151
152         g_signal_connect_data(GTK_OBJECT(widget), "response",
153                         GTK_SIGNAL_FUNC(on_about_clicked), NULL, NULL, G_CONNECT_AFTER);
154
155                 gtk_widget_show (widget);
156                 gtk_main();
157
158                 return 0;
159     }
160
161     xml = glade_xml_new(DATADIR "dfxvideo.glade2", "CfgWnd", NULL);
162     if (!xml) {
163                 g_warning("We could not load the interface!");
164                 return -1;
165     }
166
167     /*ADB wndMain = glade_xml_get_widget(xml, "CfgWnd");*/
168
169   strcpy(cfg, CONFIG_FILENAME);
170
171   in = fopen(cfg,READBINARY);
172   /* ADB TODO This is bad - asking for problems; need to read in line by line */
173   if(in)
174    {
175     pB=(char *)malloc(32767);
176     memset(pB,0,32767);
177     len = fread(pB, 1, 32767, in);
178     fclose(in);
179    }
180   else{ pB=0;printf("Couldn't find config file %s\n", cfg);}
181 /* ADB TODO Parse this like we parse the config file in PCSX - use common functions! */
182   val=1;
183   if(pB)
184    {
185     strcpy(t,"\nResX");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
186     val = set_limit (p, len, 0, 1600);
187    }
188
189   if (val == 1600) val = VIDMODE_1600x1200;
190   else if (val == 1280) val = VIDMODE_1280x1024;
191   else if (val == 1152) val = VIDMODE_1152x864;
192   else if (val == 1024) val = VIDMODE_1024x768;
193   else if (val == 800) val = VIDMODE_800x600;
194   else if (val == 640) val = VIDMODE_640x480;
195   else if (val == 320) val = VIDMODE_320x200;
196
197   gtk_combo_box_set_active(GTK_COMBO_BOX (glade_xml_get_widget(xml, "resCombo2")), val);
198
199   val=0;
200   if(pB)
201    {
202     strcpy(t,"\nNoStretch");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
203
204     val = set_limit (p, len, 0, 9);
205    }
206
207   gtk_combo_box_set_active(GTK_COMBO_BOX (glade_xml_get_widget(xml, "stretchCombo2")), val);
208
209   val=0;
210   if(pB)
211    {
212     strcpy(t,"\nDithering");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
213
214            val = set_limit (p, len, 0, 2);
215    }
216
217    gtk_combo_box_set_active(GTK_COMBO_BOX (glade_xml_get_widget(xml, "ditherCombo2")), val);
218
219  val=0;
220   if(pB)
221    {
222     strcpy(t,"\nMaintain43");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
223
224     val = set_limit (p, len, 0, 1);
225    }
226
227   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "maintain43")), val);
228   
229   val=0; //ADB Leave - these are default values
230   if(pB)
231    {
232     strcpy(t,"\nFullScreen");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
233
234         val = set_limit (p, len, 0, 1);
235    }
236
237   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "checkFullscreen")), val);
238
239   val=0;
240   if(pB)
241    {
242     strcpy(t,"\nShowFPS");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
243
244         val = set_limit (p, len, 0, 1);
245    }
246
247     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "checkShowFPS")), val);
248
249   val=1;
250   if(pB)
251    {
252     strcpy(t,"\nUseFrameLimit");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
253
254         val = set_limit (p, len, 0, 1);
255    }
256     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "checkSetFPS")), val);
257
258   val=0;
259   if(pB)
260    {
261     strcpy(t,"\nFPSDetection");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
262
263         val = set_limit (p, len, 1, 2);
264    }
265   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "checkAutoFPSLimit")), (val-1));
266
267  val=0;
268   if(pB)
269    {
270     strcpy(t,"\nUseFrameSkip");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
271         val = set_limit (p, len, 0, 1);
272    }
273
274   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "checkFrameSkip")), val);
275
276  valf=200;
277   if(pB)
278    {
279     strcpy(t,"\nFrameRate");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
280     if(p) valf=(float)atoi(p+len) / 10;
281     if(valf<1) valf=1;
282     if(valf>500) valf=500;
283    }
284   sprintf(tempstr,"%.1f",valf);
285   gtk_entry_set_text(glade_xml_get_widget(xml, "entryFPS"),tempstr);
286
287   val=0;
288   if(pB)
289    {
290     strcpy(t,"\nUseFixes");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
291
292         val = set_limit (p, len, 0, 1);
293    }
294   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (glade_xml_get_widget(xml, "checkUseFixes")), val);
295
296    
297         if(pB)
298         {
299                 strcpy(t,"\nCfgFixes");p=strstr(pB,t);if(p) {p=strstr(p,"=");len=1;}
300                 if (p)
301                         val = atoi(p + len);
302         }
303
304         for (i=0; i<11; i++)
305         {
306                 sprintf(tempstr, "checkFix%d", i+1);
307                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, tempstr)), (val>>i)&1 );
308         }
309
310
311   if(pB) free(pB);
312
313         widget = glade_xml_get_widget(xml, "CfgWnd");
314         g_signal_connect_data(GTK_OBJECT(widget), "destroy",
315                         GTK_SIGNAL_FUNC(SaveConfig), xml, NULL, 0);
316
317         widget = glade_xml_get_widget(xml, "btn_close");
318         g_signal_connect_data(GTK_OBJECT(widget), "clicked",
319                         GTK_SIGNAL_FUNC(OnConfigClose), xml, NULL, G_CONNECT_AFTER);
320
321         widget = glade_xml_get_widget(xml, "checkFullscreen");
322         g_signal_connect_data(GTK_OBJECT(widget), "clicked",
323                         GTK_SIGNAL_FUNC(on_fullscreen_toggled), xml, NULL, G_CONNECT_AFTER);
324
325         widget = glade_xml_get_widget(xml, "checkUseFixes");
326         g_signal_connect_data(GTK_OBJECT(widget), "clicked",
327                         GTK_SIGNAL_FUNC(on_use_fixes_toggled), xml, NULL, G_CONNECT_AFTER);
328
329         widget = glade_xml_get_widget(xml, "checkSetFPS");
330         g_signal_connect_data(GTK_OBJECT(widget), "clicked",
331                         GTK_SIGNAL_FUNC(on_fps_toggled), xml, NULL, G_CONNECT_AFTER);
332
333         widget = glade_xml_get_widget(xml, "checkAutoFPSLimit");
334         g_signal_connect_data(GTK_OBJECT(widget), "clicked",
335                         GTK_SIGNAL_FUNC(on_fps_toggled), xml, NULL, G_CONNECT_AFTER);
336
337         on_fullscreen_toggled(widget, (gpointer) xml);
338         on_fps_toggled(widget, (gpointer) xml);
339         on_use_fixes_toggled(widget, (gpointer) xml);
340
341   gtk_main ();
342   return 0;
343 }
344
345
346 void SetCfgVal(char * pB,char * pE,int val)
347 {
348  char * p, *ps, *pC;char t[32];
349
350  sprintf(t,"%d",val);
351
352  p=strstr(pB,pE);
353  if(p)
354   {
355    p=strstr(p,"=");
356    if(!p) return;
357    p++;
358    while(*p && *p!='\n' && (*p<'0' || *p>'9')) p++;
359    if(*p==0 || *p=='\n') return;
360    ps=p;
361    while(*p>='0' && *p<='9') p++;
362    pC=(char *)malloc(32767);
363    strcpy(pC,p);
364    strcpy(ps,t);
365    strcat(pB,pC);
366    free(pC);
367   }
368  else
369   {
370    strcat(pB,pE);
371    strcat(pB," = ");
372    strcat(pB,t);
373    strcat(pB,"\n");
374   }
375 }
376
377 void SaveConfig(GtkWidget *widget, gpointer user_data)
378 {
379   FILE *in;int len,val;char * pB;
380         GladeXML *xml;
381   char cfg[255];
382   char tempstr[50];
383   int i;
384   struct stat buf;
385
386   pB=(char *)malloc(32767);
387   memset(pB,0,32767);
388
389   strcpy(cfg, CONFIG_FILENAME);
390
391   /* ADB TODO Why do we read this in just to replace it again? */
392   in = fopen(cfg,READBINARY);
393   if(in)
394    {
395     len = fread(pB, 1, 32767, in);
396     fclose(in);
397    }
398    xml = (GladeXML*) user_data;
399
400   val = gtk_combo_box_get_active (GTK_COMBO_BOX (glade_xml_get_widget (xml, "resCombo2")));
401
402  if (val == VIDMODE_320x200) { SetCfgVal(pB,"\nResX",320); SetCfgVal(pB,"\nResY",240); }
403  else if (val == VIDMODE_640x480) { SetCfgVal(pB,"\nResX",640); SetCfgVal(pB,"\nResY",480); }
404  else if (val == VIDMODE_800x600) { SetCfgVal(pB,"\nResX",800); SetCfgVal(pB,"\nResY",600); }
405  else if (val == VIDMODE_1024x768) { SetCfgVal(pB,"\nResX",1024); SetCfgVal(pB,"\nResY",768); }
406  else if (val == VIDMODE_1152x864) { SetCfgVal(pB,"\nResX",1152); SetCfgVal(pB,"\nResY",864); }
407  else if (val == VIDMODE_1280x1024) { SetCfgVal(pB,"\nResX",1280); SetCfgVal(pB,"\nResY",1024); }
408  else if (val == VIDMODE_1600x1200) { SetCfgVal(pB,"\nResX",1600); SetCfgVal(pB,"\nResY",1200); }
409
410  val = gtk_combo_box_get_active (GTK_COMBO_BOX (glade_xml_get_widget (xml, "stretchCombo2")));
411  SetCfgVal(pB,"\nNoStretch",val);
412
413  val = gtk_combo_box_get_active (GTK_COMBO_BOX (glade_xml_get_widget (xml, "ditherCombo2")));
414  SetCfgVal(pB,"\nDithering",val);
415
416     val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "maintain43")));
417  SetCfgVal(pB,"\nMaintain43",val);
418
419      val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "checkFullscreen")));
420  SetCfgVal(pB,"\nFullScreen",val);
421
422      val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "checkShowFPS")));
423  SetCfgVal(pB,"\nShowFPS",val);
424
425      val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "checkSetFPS")));
426  SetCfgVal(pB,"\nUseFrameLimit",val);
427
428  val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "checkAutoFPSLimit")));
429  SetCfgVal(pB,"\nFPSDetection",val+1);
430
431   val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "checkFrameSkip")));
432  SetCfgVal(pB,"\nUseFrameSkip",val);
433
434  //Framerate stored *10
435  val = atof(gtk_entry_get_text(glade_xml_get_widget(xml, "entryFPS"))) * 10;
436  SetCfgVal(pB,"\nFrameRate",val);
437
438  val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "checkUseFixes")));
439  SetCfgVal(pB,"\nUseFixes",val);
440
441
442         val = 0;
443         for (i=0; i<11; i++)
444         {
445                 sprintf(tempstr, "checkFix%d", i+1);
446                 if( gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, tempstr))) )
447                         val |= 1 << i;
448         }
449
450         SetCfgVal(pB,"\nCfgFixes",val);
451
452
453
454  if((in=fopen(cfg, WRITEBINARY))!=NULL)
455   {
456    fwrite(pB,strlen(pB),1,in);
457    fclose(in);
458   }
459
460  free(pB);
461  
462         // Close the window and exit control from the plugin
463         gtk_exit (0); 
464 }