#include // from the example static void set_file (GFile *file, gpointer data) { char *name; if (!file) { //gtk_widget_set_sensitive (app_picker, FALSE); //g_object_set_data (G_OBJECT (app_picker), "file", NULL); return; } name = g_file_get_basename (file); gtk_label_set_label (GTK_LABEL (data), name); g_free (name); //gtk_widget_set_sensitive (app_picker, TRUE); //g_object_set_data_full (G_OBJECT (app_picker), "file", g_object_ref (file), g_object_unref); } static void file_opened (GObject *source, GAsyncResult *result, void *data) { GFile *file; GError *error = NULL; file = gtk_file_dialog_open_finish (GTK_FILE_DIALOG (source), result, &error); if (!file) { g_print ("%s\n", error->message); g_error_free (error); } set_file (file, data); } static gboolean abort_mission (gpointer data) { GCancellable *cancellable = data; g_cancellable_cancel (cancellable); return G_SOURCE_REMOVE; } static void open_file (GtkButton *picker, GtkLabel *label) { GtkWindow *parent = GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (picker))); GtkFileDialog *dialog; GCancellable *cancellable; dialog = gtk_file_dialog_new (); cancellable = g_cancellable_new (); g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, 20, abort_mission, g_object_ref (cancellable), g_object_unref); gtk_file_dialog_set_title (dialog, "Select Sheet Music File"); // Filters for the different types that are supported. //GListStore *filters; //(abc, darms, humdrum, pae) // Only allow mei,musicxml,xml GtkFileFilter *filter; filter = gtk_file_filter_new(); gtk_file_filter_set_name (filter, "MEI, MusicXML"); gtk_file_filter_add_mime_type (filter, "application/xml"); gtk_file_filter_add_mime_type (filter, "text/xml"); //g_list_store_append (filters, filter); gtk_file_dialog_set_default_filter (dialog, filter); //g_object_unref (filter); //gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters)); //g_object_unref (filters); gtk_file_dialog_open (dialog, parent, cancellable, file_opened, label); g_object_unref (cancellable); g_object_unref (dialog); } static void activate (GtkApplication* app, gpointer user_data) { GtkWidget *window; GtkWidget *header; GtkWidget *image; GtkWidget *button; // Window window = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (window), "SheMuVi"); gtk_window_set_default_size (GTK_WINDOW (window), 400, 600); gtk_widget_set_visible (window, TRUE); // Header header = gtk_header_bar_new(); button = gtk_button_new_from_icon_name ("document-open-symbolic"); gtk_widget_set_tooltip_text (button, "Load file"); g_signal_connect (button, "clicked", G_CALLBACK (open_file), NULL); gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button); gtk_window_set_titlebar (GTK_WINDOW (window), header); // Image image = gtk_image_new_from_file ("./when-i-survey-the-wondrous-cross-watts.svg"); gtk_window_set_child (GTK_WINDOW (window), image); } int main (int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new ("com.zachdecook.shemuvi", G_APPLICATION_DEFAULT_FLAGS); g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); status = g_application_run (G_APPLICATION (app), argc, argv); g_object_unref (app); return status; }