| 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 | } |