ftp://ftp.krokus.ru/pub/OpenBSD/distfiles/xscreensaver-4.06.tar.gz
[xscreensaver] / driver / demo-Gtk-conf.c
index d51d1df7b3fe2e3282b8e2fbc51c32f274829130..9a3bbfc808beb441ce8869acafe33629cee793a0 100644 (file)
@@ -16,6 +16,8 @@
 
 #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"
 
-#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);