#include "osdialog.h" #include #include #include int osdialog_message(osdialog_message_level level, osdialog_message_buttons buttons, const char *message) { assert(gtk_init_check(NULL, NULL)); GtkMessageType messageType; switch (level) { default: case OSDIALOG_INFO: messageType = GTK_MESSAGE_INFO; break; case OSDIALOG_WARNING: messageType = GTK_MESSAGE_WARNING; break; case OSDIALOG_ERROR: messageType = GTK_MESSAGE_ERROR; break; } GtkButtonsType buttonsType; switch (buttons) { default: case OSDIALOG_OK: buttonsType = GTK_BUTTONS_OK; break; case OSDIALOG_OK_CANCEL: buttonsType = GTK_BUTTONS_OK_CANCEL; break; case OSDIALOG_YES_NO: buttonsType = GTK_BUTTONS_YES_NO; break; } GtkWidget *dialog = gtk_message_dialog_new (NULL, 0, messageType, buttonsType, "%s", message); gint result = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); while (gtk_events_pending()) gtk_main_iteration(); switch (result) { case GTK_RESPONSE_OK: case GTK_RESPONSE_YES: return 1; default: return 0; } } char *osdialog_file(osdialog_file_action action, const char *path, const char *filename, osdialog_filters *filters) { printf("xxx osdialog_file: 1\n"); assert(gtk_init_check(NULL, NULL)); printf("xxx osdialog_file: 2\n"); GtkFileChooserAction gtkAction; const char *title; const char *acceptText; if (action == OSDIALOG_OPEN) { title = "Open File"; acceptText = "Open"; gtkAction = GTK_FILE_CHOOSER_ACTION_OPEN; } else if (action == OSDIALOG_OPEN_DIR) { title = "Open Folder"; acceptText = "Open Folder"; gtkAction = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; } else { title = "Save File"; acceptText = "Save"; gtkAction = GTK_FILE_CHOOSER_ACTION_SAVE; } printf("xxx osdialog_file: 3\n"); GtkWidget *dialog = gtk_file_chooser_dialog_new( title, NULL, gtkAction, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, acceptText, GTK_RESPONSE_ACCEPT, NULL); printf("xxx osdialog_file: 4\n"); for (; filters; filters = filters->next) { GtkFileFilter *fileFilter = gtk_file_filter_new(); gtk_file_filter_set_name(fileFilter, filters->name); for (osdialog_filter_patterns *patterns = filters->patterns; patterns; patterns = patterns->next) { char patternBuf[1024]; snprintf(patternBuf, sizeof(patternBuf), "*.%s", patterns->pattern); gtk_file_filter_add_pattern(fileFilter, patternBuf); } gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), fileFilter); } printf("xxx osdialog_file: 5\n"); if (action == OSDIALOG_SAVE) gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); if (path) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path); printf("xxx osdialog_file: 6\n"); if (action == OSDIALOG_SAVE && filename) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); printf("xxx osdialog_file: 7\n"); gtk_widget_show(dialog); // [bsp] 26Oct2018 printf("xxx osdialog_file: 8\n"); char *result = NULL; if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { result = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); } printf("xxx osdialog_file: 9\n"); gtk_widget_destroy(dialog); printf("xxx osdialog_file: 10\n"); while (gtk_events_pending()) gtk_main_iteration(); printf("xxx osdialog_file: 11\n"); return result; } int osdialog_color_picker(osdialog_color *color, int opacity) { if (!color) return 0; assert(gtk_init_check(NULL, NULL)); GtkWidget *dialog = gtk_color_selection_dialog_new("Color"); GtkColorSelection *colorsel = GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(dialog))); gtk_color_selection_set_has_opacity_control(colorsel, opacity); int result = 0; if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { GdkColor c; gtk_color_selection_get_current_color(colorsel, &c); color->r = c.red >> 8; color->g = c.green >> 8; color->b = c.blue >> 8; color->a = gtk_color_selection_get_current_alpha(colorsel) >> 8; result = 1; } gtk_widget_destroy(dialog); while (gtk_events_pending()) gtk_main_iteration(); return result; }