gpu_unai: basic frameskip
[pcsx_rearmed.git] / plugins / dfxvideo / gpucfg-0.1df / main.c
CommitLineData
ef79bbde
P
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
17void SaveConfig(GtkWidget *widget, gpointer user_datal);
18
19#define READBINARY "rb"
20#define WRITEBINARY "wb"
21#define CONFIG_FILENAME "dfxvideo.cfg"
22
23enum {
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 */
37int 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
52void on_about_clicked(GtkWidget *widget, gpointer user_data)
53{
54 gtk_widget_destroy (widget);
55 exit (0);
56}
57
58void set_widget_sensitive(GtkWidget *widget, gpointer user_data)
59{
60 gtk_widget_set_sensitive (widget, (int)user_data);
61}
62
63void 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
75void 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
89void 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
104void 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
112int
113main (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
346void 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
377void 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}