Clone in a terminal:
SaveCallback.vala
/*
	Copyright (C) 2014 Johan Mattsson

	This library is free software; you can redistribute it and/or modify 
	it under the terms of the GNU Lesser General Public License as 
	published by the Free Software Foundation; either version 3 of the 
	License, or (at your option) any later version.

	This library is distributed in the hope that it will be useful, but 
	WITHOUT ANY WARRANTY; without even the implied warranty of 
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
	Lesser General Public License for more details.
*/

namespace BirdFont {

public class SaveCallback : GLib.Object {
	
	public signal void file_saved ();
	public bool is_done = false;
	
	public string font_file_path = "";
	
	public SaveCallback () {	
		file_saved.connect (() => {
			is_done = true;
		});
	}
	
	public void save_as ()  {
		if (MenuTab.has_suppress_event ()) {
			warn_if_test ("Event suppressed");
			return;
		}

		FileChooser fc = new FileChooser ();
		fc.file_selected.connect ((fn) => {
			string f;
			File file;
			OverwriteBfFile dialog;
			string file_name;
			
			is_done = true;
			
			if (fn != null) {
				f = (!) fn;

#if MAC
				font_file_path = f;
				save ();
#else
				if (!f.has_suffix (".bf") && !f.has_suffix (".birdfont")) {
					f = @"$f.birdfont";
				}
				
				file_name = @"$(f)";
				file = File.new_for_path (file_name);
				font_file_path = (!) file.get_path ();
				if (!file.query_exists ()) {
					save ();
				} else {
					dialog = new OverwriteBfFile (this);
					MainWindow.show_dialog (dialog);
				}
#endif	
			}
		});
		
		fc.add_extension ("bf");
		MainWindow.file_chooser (t_("Save"), fc, FileChooser.SAVE);
	}

	public void save () {
		Font f;
		string fn;
		
		if (MenuTab.has_suppress_event ()) {
			warn_if_test ("Event suppressed");
			return;
		}
		
		f = BirdFont.get_current_font ();
		
		if (font_file_path != "") {
			f.font_file = font_file_path;
		}

#if !MAC
		Preferences.add_recent_files (f.get_path ());
#endif

		if (f.is_bfp ()) {
			MainWindow.native_window.save ();
		} else {
			fn = f.get_path ();
			
			if (f.font_file != null
				&& (fn.has_suffix (".bf") || fn.has_suffix (".birdfont"))) {
				
				f.set_font_file (fn);
				MainWindow.native_window.save ();
			} else {
				save_as ();
			}
		}
	}
}

}

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112