X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fdemo-Gtk-conf.c;h=9a3bbfc808beb441ce8869acafe33629cee793a0;hb=c28aecf9fc41e3a03494bacf7279745425e2fa18;hp=d51d1df7b3fe2e3282b8e2fbc51c32f274829130;hpb=a94197e76a5dea5cb60542840809d6c20d0abbf3;p=xscreensaver diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c index d51d1df7..9a3bbfc8 100644 --- a/driver/demo-Gtk-conf.c +++ b/driver/demo-Gtk-conf.c @@ -16,6 +16,8 @@ #if defined(HAVE_GTK) && defined(HAVE_XML) /* whole file */ +#include + #include #ifdef HAVE_UNISTD_H @@ -26,20 +28,47 @@ #include #include -#include /* XML */ +/* + * Both of these workarounds can be removed when support for ancient + * libxml versions is dropped. versions 1.8.11 and 2.3.4 provide the + * correct fixes. + */ + +/* + * Older libxml polluted the global headerspace, while libxml2 fixed + * this. To support both old and recent libxmls, we have this + * workaround. + */ +#ifdef HAVE_OLD_XML_HEADERS +# include +#else /* ! HAVE_OLD_XML_HEADERS */ +# include +#endif /* HAVE_OLD_XML_HEADERS */ + +/* + * handle non-native spelling mistakes in earlier versions and provide + * the source-compat fix for this that may not be in older versions. + */ +#ifndef xmlChildrenNode +# if LIBXML_VERSION >= 20000 +# define xmlChildrenNode children +# define xmlRootNode children +# else +# define xmlChildrenNode childs +# define xmlRootNode root +# endif /* LIBXML_VERSION */ +#endif /* xmlChildrenNode */ #include #include "demo-Gtk-conf.h" -#if (LIBXML_VERSION >= 20000) /* illiteracy finally fixed */ -# define childs children -# define root children -#endif extern const char *blurb (void); +const char *hack_configuration_path = HACK_CONFIGURATION_PATH; + static gboolean debug_p = FALSE; @@ -289,10 +318,10 @@ make_parameter (const char *filename, xmlNodePtr node) } else if (p->type == DESCRIPTION) { - if (node->childs && - node->childs->type == XML_TEXT_NODE && - !node->childs->next) - p->string = strdup (node->childs->content); + if (node->xmlChildrenNode && + node->xmlChildrenNode->type == XML_TEXT_NODE && + !node->xmlChildrenNode->next) + p->string = strdup (node->xmlChildrenNode->content); } p->id = xmlGetProp (node, "id"); @@ -323,7 +352,7 @@ make_parameter (const char *filename, xmlNodePtr node) if (p->type == SELECT) { xmlNodePtr kids; - for (kids = node->childs; kids; kids = kids->next) + for (kids = node->xmlChildrenNode; kids; kids = kids->next) { parameter *s = make_select_option (filename, kids); if (s) @@ -558,7 +587,7 @@ make_parameters_1 (const char *filename, xmlNodePtr node, if (row) (*row)++; - list2 = make_parameters_1 (filename, node->childs, box, 0); + list2 = make_parameters_1 (filename, node->xmlChildrenNode, box, 0); if (list2) list = g_list_concat (list, list2); } @@ -588,7 +617,7 @@ make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent) { if (node->type == XML_ELEMENT_NODE && !strcmp (node->name, "screensaver")) - return make_parameters_1 (filename, node->childs, parent, &row); + return make_parameters_1 (filename, node->xmlChildrenNode, parent, &row); } return 0; } @@ -673,7 +702,7 @@ make_parameter_widget (const char *filename, { if (label) { - GtkWidget *w = gtk_label_new (label); + GtkWidget *w = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5); gtk_widget_show (w); @@ -697,9 +726,9 @@ make_parameter_widget (const char *filename, } case FILENAME: { - GtkWidget *L = gtk_label_new (label ? label : ""); + GtkWidget *L = gtk_label_new (label ? _(label) : ""); GtkWidget *entry = gtk_entry_new (); - GtkWidget *button = gtk_button_new_with_label ("Browse..."); + GtkWidget *button = gtk_button_new_with_label (_("Browse...")); gtk_widget_show (entry); gtk_widget_show (button); p->widget = entry; @@ -743,7 +772,7 @@ make_parameter_widget (const char *filename, if (label) { - labelw = gtk_label_new (label); + labelw = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (labelw), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (labelw), 0.0, 0.5); gtk_widget_show (labelw); @@ -799,7 +828,7 @@ make_parameter_widget (const char *filename, if (p->low_label) { - GtkWidget *w = gtk_label_new (p->low_label); + GtkWidget *w = gtk_label_new (_(p->low_label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5); gtk_widget_show (w); @@ -824,7 +853,7 @@ make_parameter_widget (const char *filename, if (p->high_label) { - GtkWidget *w = gtk_label_new (p->high_label); + GtkWidget *w = gtk_label_new (_(p->high_label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); gtk_widget_show (w); @@ -848,7 +877,7 @@ make_parameter_widget (const char *filename, if (label) { - GtkWidget *w = gtk_label_new (label); + GtkWidget *w = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5); gtk_widget_show (w); @@ -894,7 +923,7 @@ make_parameter_widget (const char *filename, if (label && row) { - GtkWidget *w = gtk_label_new (label); + GtkWidget *w = gtk_label_new (_(label)); gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5); gtk_widget_show (w); @@ -963,7 +992,7 @@ file_sel_ok (GtkWidget *button, gpointer user_data) { GtkWidget *entry = GTK_WIDGET (user_data); GtkWidget *dialog = button; - char *path; + const char *path; while (dialog->parent) dialog = dialog->parent; gtk_widget_hide (dialog); @@ -989,9 +1018,9 @@ static void browse_button_cb (GtkButton *button, gpointer user_data) { GtkWidget *entry = GTK_WIDGET (user_data); - char *text = gtk_entry_get_text (GTK_ENTRY (entry)); + const char *text = gtk_entry_get_text (GTK_ENTRY (entry)); GtkFileSelection *selector = - GTK_FILE_SELECTION (gtk_file_selection_new ("Select file.")); + GTK_FILE_SELECTION (gtk_file_selection_new (_("Select file."))); gtk_file_selection_set_filename (selector, text); gtk_signal_connect (GTK_OBJECT (selector->ok_button), @@ -1669,12 +1698,17 @@ static conf_data * load_configurator_1 (const char *program, const char *arguments, gboolean verbose_p) { - const char *dir = HACK_CONFIGURATION_PATH; + const char *dir = hack_configuration_path; int L = strlen (dir); - char *file = (char *) malloc (L + strlen (program) + 10); + char *file; char *s; FILE *f; - conf_data *data = (conf_data *) calloc (1, sizeof(*data)); + conf_data *data; + + if (L == 0) return 0; + + file = (char *) malloc (L + strlen (program) + 10); + data = (conf_data *) calloc (1, sizeof(*data)); strcpy (file, dir); if (file[L-1] != '/') @@ -1703,7 +1737,12 @@ load_configurator_1 (const char *program, const char *arguments, fprintf (stderr, "%s: reading %s...\n", blurb(), file); res = fread (chars, 1, 4, f); - if (res <= 0) return 0; + if (res <= 0) + { + free (data); + data = 0; + goto DONE; + } ctxt = xmlCreatePushParserCtxt(NULL, NULL, chars, res, file); while ((res = fread(chars, 1, size, f)) > 0) @@ -1721,7 +1760,7 @@ load_configurator_1 (const char *program, const char *arguments, gtk_container_set_border_width (GTK_CONTAINER (table), 8); gtk_widget_show (table); - parms = make_parameters (file, doc->root, table); + parms = make_parameters (file, doc->xmlRootNode, table); xmlFreeDoc (doc); @@ -1748,6 +1787,9 @@ load_configurator_1 (const char *program, const char *arguments, } data->progname = strdup (program); + + DONE: + free (file); return data; } @@ -1848,7 +1890,9 @@ free_conf_data (conf_data *data) gtk_widget_destroy (data->widget); if (data->progname) - free (data->progname);; + free (data->progname); + if (data->description) + free (data->description); memset (data, ~0, sizeof(*data)); free (data);