config_dialog_t *create_workflow_config_dialog(const char *workflow_name, GtkWindow *parent) { workflow_t *workflow = get_workflow(workflow_name); GList *events = wf_get_event_list(workflow); GtkWindow *parent_window = parent ? parent : g_parent_window; GtkWidget *dialog = gtk_dialog_new_with_buttons( /*title:*/ wf_get_screen_name(workflow) ? wf_get_screen_name(workflow) : workflow_name, parent_window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_APPLY, NULL); gtk_window_set_resizable(GTK_WINDOW(dialog), true); gtk_window_set_default_size(GTK_WINDOW(dialog), 450, 450); if (parent_window != NULL) { gtk_window_set_icon_name(GTK_WINDOW(dialog), gtk_window_get_icon_name(parent_window)); } GtkWidget *scrolled = gtk_scrolled_window_new(NULL, NULL); GtkWidget *content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #if ((GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION < 7) || (GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION == 7 && GTK_MICRO_VERSION < 8)) /* http://developer.gnome.org/gtk3/unstable/GtkScrolledWindow.html#gtk-scrolled-window-add-with-viewport */ /* gtk_scrolled_window_add_with_viewport has been deprecated since version 3.8 and should not be used in newly-written code. */ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled), content); #else /* gtk_container_add() will now automatically add a GtkViewport if the child doesn't implement GtkScrollable. */ gtk_container_add(GTK_CONTAINER(scrolled), content); #endif GtkWidget *dialog_box = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); gtk_box_pack_start(GTK_BOX(dialog_box), scrolled, false, true, 0); g_events_options = NULL; g_list_foreach(events, (GFunc)create_event_config_dialog_content_cb, content); gtk_widget_show_all(GTK_WIDGET(scrolled)); config_dialog_t *cdialog = new_config_dialog(dialog, g_events_options, (config_save_fun_t)save_data_from_worfklow_dialog); return cdialog; }
config_dialog_t *create_workflow_config_dialog(const char *workflow_name, GtkWindow *parent) { workflow_t *workflow = get_workflow(workflow_name); GList *events = wf_get_event_list(workflow); GtkWindow *parent_window = parent ? parent : g_parent_window; GtkWidget *dialog = gtk_dialog_new_with_buttons( /*title:*/ wf_get_screen_name(workflow) ? wf_get_screen_name(workflow) : workflow_name, parent_window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_APPLY, NULL); gtk_window_set_resizable(GTK_WINDOW(dialog), true); gtk_window_set_default_size(GTK_WINDOW(dialog), 450, -1); if (parent_window != NULL) { gtk_window_set_icon_name(GTK_WINDOW(dialog), gtk_window_get_icon_name(parent_window)); } GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); g_events_options = NULL; g_list_foreach(events, (GFunc)create_event_config_dialog_content_cb, content); config_dialog_t *cdialog = new_config_dialog(dialog, g_events_options, (config_save_fun_t)save_data_from_worfklow_dialog); return cdialog; }
// Called for character data // text is not nul-terminated static void text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { struct my_parse_data *parse_data = user_data; workflow_t *workflow = parse_data->workflow; const gchar *inner_element = g_markup_parse_context_get_element(context); if(parse_data->in_event_list && strcmp(inner_element, EVENT_ELEMENT) == 0) { event_config_t *ec = new_event_config(text); char *subevent_filename = xasprintf(EVENTS_DIR"/%s.xml", text); load_event_description_from_file(ec, subevent_filename); if (ec_get_screen_name(ec)) wf_add_event(workflow, ec); else free_event_config(ec); free(subevent_filename); } if(strcmp(inner_element, NAME_ELEMENT) == 0) { log_debug("workflow name:'%s'", text); if (parse_data->attribute_lang != NULL) /* if it isn't for other locale */ { /* set the value only if we found a value for the current locale * OR the description is still not set and we found the default value */ if (parse_data->attribute_lang[0] != '\0' || !wf_get_screen_name(workflow) /* && parse_data->attribute_lang is "" - always true */ ) { if (!parse_data->exact_name) { parse_data->exact_name = (strcmp(parse_data->cur_locale, parse_data->attribute_lang) == 0); wf_set_screen_name(workflow, text); } } } } else if(strcmp(inner_element, DESCRIPTION_ELEMENT) == 0) { log_debug("workflow description:'%s'", text); if (parse_data->attribute_lang != NULL) /* if it isn't for other locale */ { /* set the value only if we found a value for the current locale * OR the description is still not set and we found the default value */ if (parse_data->attribute_lang[0] != '\0' || !wf_get_description(workflow) /* && parse_data->attribute_lang is "" - always true */ ) { if (!parse_data->exact_description) { parse_data->exact_description = (strcmp(parse_data->cur_locale, parse_data->attribute_lang) == 0); wf_set_description(workflow, text); } } } } else if(strcmp(inner_element, PRIORITY_ELEMENT) == 0) { log_debug("workflow priority:'%s'", text); char *end = NULL; long long val = strtoll(text, &end, 10); if (text == end || end[0] != '\0' || (errno == ERANGE && (val == LLONG_MAX || val == LLONG_MIN)) || (val > INT_MAX || val < INT_MIN) || (errno != 0 && val == 0)) { error_msg("Workflow's priority is not a number in range <%d,%d>", INT_MIN, INT_MAX); return; } wf_set_priority(workflow, (int)val); } }