Commit | Line | Data |
---|---|---|
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 | ||
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 | } |