@@ -356,7 +356,7 @@ static void ApplyPatchMultiAutoSub(gpointer data, gpointer user_data)
356356 gchar * outrompath=g_strndup (patchpath, strlen (patchpath)+strlen (romext)+1 );
357357 strcpy (GetExtension (outrompath), romext);
358358
359- struct errorinfo errinf=ApplyPatchMem (patch, rompath, true , outrompath, NULL , true );
359+ struct errorinfo errinf=ApplyPatchMem (patch, rompath, !cfg. getint ( " skipchecksum " ) , outrompath, NULL , true );
360360 if (errinf.level ==el_broken) error (ea_invalid);
361361 if (errinf.level ==el_notthis) error (ea_no_auto);
362362 if (errinf.level ==el_warning) error (ea_warning);
@@ -433,7 +433,7 @@ static void ApplyPatchMulti(gpointer data, gpointer user_data)
433433 char * outromext=GetExtension (outromname);
434434 strcpy (outromext, state->romext );
435435
436- struct errorinfo errinf=ApplyPatchMem2 (patch, state->rommem , state->removeHeaders , true , outromname, NULL );
436+ struct errorinfo errinf=ApplyPatchMem2 (patch, state->rommem , state->removeHeaders , !cfg. getint ( " skipchecksum " ) , outromname, NULL );
437437 if (errinf.level ==el_broken) error (e_invalid);
438438 if (errinf.level ==el_notthis) error (e_invalid_this);
439439 if (errinf.level ==el_warning) error (e_warning);
@@ -486,7 +486,7 @@ static void a_ApplyPatch(GtkButton* widget, gpointer user_data)
486486 char * outromname=SelectRom (outromname_d, " Select Output File" , true );
487487 if (outromname)
488488 {
489- struct errorinfo errinf=ApplyPatchMem (patchfile, inromname, true , outromname, NULL , cfg.getint (" autorom" ));
489+ struct errorinfo errinf=ApplyPatchMem (patchfile, inromname, !cfg. getint ( " skipchecksum " ) , outromname, NULL , cfg.getint (" autorom" ));
490490 ShowMessage (errinf);
491491 }
492492 g_free (inromname);
@@ -596,43 +596,8 @@ static void a_CreatePatch(GtkButton* widget, gpointer user_data)
596596 gtk_file_filter_add_pattern (filter, typeinfo[i].filter );
597597 gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
598598 }
599- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filters[lasttype-1 ]);
600-
601- struct wrap {
602- GtkFileChooser* chooser;
603- GtkFileFilter** filters;
604- int current_filter_id;
605-
606- void notify (GObject* self, GParamSpec* pspec)
607- {
608- GtkFileFilter* filter = gtk_file_chooser_get_filter (chooser);
609- int new_filter_id = 0 ;
610- while (filter != filters[new_filter_id])
611- new_filter_id++;
612-
613- const char * prev_ext = typeinfo[current_filter_id].filter +1 ;
614- const char * new_ext = typeinfo[new_filter_id].filter +1 ;
615-
616- char * current_name = gtk_file_chooser_get_current_name (chooser);
617- char * current_name_ext = strrchr (current_name, ' .' );
618- if (!strcmp (current_name_ext, prev_ext))
619- {
620- // good thing they're all the same length
621- strcpy (current_name_ext, new_ext);
622- gtk_file_chooser_set_current_name (chooser, current_name);
623- }
624-
625- g_free (current_name);
626- current_filter_id = new_filter_id;
627- }
628- static void notify_s (GObject* self, GParamSpec* pspec, void * userdata)
629- {
630- ((wrap*)userdata)->notify (self, pspec);
631- }
632- };
633- wrap filter_updater = { GTK_FILE_CHOOSER (dialog), filters, lasttype-1 };
634- g_signal_connect (dialog, " notify::filter" , G_CALLBACK (&wrap::notify_s), &filter_updater);
635599
600+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filters[lasttype-1 ]);
636601 if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_ACCEPT)
637602 {
638603 patchname=gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
@@ -643,8 +608,11 @@ static void a_CreatePatch(GtkButton* widget, gpointer user_data)
643608 {
644609 if (filter==filters[i])
645610 {
611+ if (patchname && lasttype!=i && !strcmp (GetExtension (patchname), typeinfo[lasttype-1 ].filter +1 ))
612+ {
613+ strcpy (GetExtension (patchname), typeinfo[i].filter +1 );
614+ }
646615 cfg.setint (" lasttype" , i+1 );
647- lasttype = i+1 ;
648616 }
649617 }
650618
@@ -709,7 +677,7 @@ static void a_ApplyRun(GtkButton* widget, gpointer user_data)
709677 else outromname=g_file_get_uri (outrom_file);
710678 g_object_unref (outrom_file);
711679
712- struct errorinfo errinf=ApplyPatchMem (patchfile, romname, true , outromname, NULL , cfg.getint (" autorom" ));
680+ struct errorinfo errinf=ApplyPatchMem (patchfile, romname, !cfg. getint ( " skipchecksum " ) , outromname, NULL , cfg.getint (" autorom" ));
713681 if (errinf.level !=el_ok) ShowMessage (errinf);
714682 if (errinf.level >=el_notthis) goto cleanup;
715683
@@ -795,15 +763,24 @@ static void a_ShowSettings(GtkButton* widget, gpointer user_data)
795763 gtk_grid_attach (grid, autoRom, 0 ,3 , 1 ,1 );
796764 flatpakDisable (autoRom);
797765
766+ GtkWidget* skipChecksum;
767+ skipChecksum=gtk_check_button_new_with_mnemonic (" Ignore checksum when patching" );
768+ if (cfg.getint (" skipchecksum" )) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (skipChecksum), true );
769+ g_object_ref (skipChecksum);
770+ gtk_grid_attach (grid, skipChecksum, 0 ,4 , 1 ,1 );
771+ flatpakDisable (skipChecksum);
772+
798773 gtk_container_add (GTK_CONTAINER (settingswindow), GTK_WIDGET (grid));
799774
800775 gtk_widget_show_all (settingswindow);
801776 gtk_main ();
802777
803778 cfg.setint (" assocemu" , (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (emuAssoc))));
804779 cfg.setint (" autorom" , (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (autoRom))));
780+ cfg.setint (" skipchecksum" , (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (skipChecksum))));
805781 g_object_unref (emuAssoc);
806782 g_object_unref (autoRom);
783+ g_object_unref (skipChecksum);
807784}
808785
809786static gboolean filterExecOnly (const GtkFileFilterInfo* filter_info, gpointer data)
0 commit comments