#if defined(HAVE_GTK) && defined(HAVE_XML) /* whole file */
+#include <xscreensaver-intl.h>
+
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <string.h>
#include <ctype.h>
-#include <parser.h> /* 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 <parser.h>
+#else /* ! HAVE_OLD_XML_HEADERS */
+# include <libxml/parser.h>
+#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 <gtk/gtk.h>
#include "demo-Gtk-conf.h"
+
extern const char *blurb (void);
+const char *hack_configuration_path = HACK_CONFIGURATION_PATH;
+
static gboolean debug_p = FALSE;
}
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");
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)
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);
}
{
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;
}
{
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);
}
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;
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);
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);
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);
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);
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);
{
GtkWidget *entry = GTK_WIDGET (user_data);
GtkWidget *dialog = button;
- char *path;
+ const char *path;
while (dialog->parent)
dialog = dialog->parent;
gtk_widget_hide (dialog);
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),
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] != '/')
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)
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);
}
data->progname = strdup (program);
+
+ DONE:
+ free (file);
return 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);