http://www.mirrorservice.org/sites/master.us.finkmirrors.net/distfiles/md5/fa43fdd68d...
[xscreensaver] / driver / demo-Gtk-conf.c
index d51d1df7b3fe2e3282b8e2fbc51c32f274829130..23f5944dea4ec7e8de44f208a3d5824683996c61 100644 (file)
@@ -1,5 +1,5 @@
 /* demo-Gtk-conf.c --- implements the dynamic configuration dialogs.
- * xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -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;
 }
@@ -640,17 +669,17 @@ make_adjustment (const char *filename, parameter *p)
     }
 #endif /* 0 */
 
-  if (p->integer_p)
-    {
-      si = (int) (si + 0.5);
-      pi = (int) (pi + 0.5);
-      if (si < 1) si = 1;
-      if (pi < 1) pi = 1;
+  si = (int) (si + 0.5);
+  pi = (int) (pi + 0.5);
+  if (si < 1) si = 1;
+  if (pi < 1) pi = 1;
 
-      if (range <= 500) si = 1;
-    }
-  return GTK_ADJUSTMENT (gtk_adjustment_new (value, p->low, p->high,
-                                             si, pi, pi));
+  if (range <= 500) si = 1;
+
+  return GTK_ADJUSTMENT (gtk_adjustment_new (value,
+                                             p->low,
+                                             p->high + 1,
+                                             si, pi, 1));
 }
 
 
@@ -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);
@@ -811,7 +840,7 @@ make_parameter_widget (const char *filename,
           }
 
         gtk_scale_set_value_pos (GTK_SCALE (scale), GTK_POS_BOTTOM);
-        gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
+        gtk_scale_set_draw_value (GTK_SCALE (scale), debug_p);
         gtk_scale_set_digits (GTK_SCALE (scale), (p->integer_p ? 0 : 2));
         if (row)
           gtk_table_attach (GTK_TABLE (parent), scale, 1, 2,
@@ -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);
@@ -877,7 +906,7 @@ make_parameter_widget (const char *filename,
       }
     case BOOLEAN:
       {
-        p->widget = gtk_check_button_new_with_label (label);
+        p->widget = gtk_check_button_new_with_label (_(label));
         if (row)
           gtk_table_attach (GTK_TABLE (parent), p->widget, 0, 3,
                             *row, *row + 1,
@@ -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);
@@ -906,7 +935,7 @@ make_parameter_widget (const char *filename,
         for (opts = p->options; opts; opts = opts->next)
           {
             parameter *s = (parameter *) opts->data;
-            GtkWidget *i = gtk_menu_item_new_with_label (s->label);
+            GtkWidget *i = gtk_menu_item_new_with_label (_(s->label));
             gtk_widget_show (i);
             gtk_menu_append (GTK_MENU (menu), i);
           }
@@ -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),
@@ -1157,7 +1186,7 @@ parameter_to_switch (parameter *p)
         char buf[255];
         char *s1;
         float value = (p->invert_p
-                       ? invert_range (adj->lower, adj->upper, adj->value)
+                       ? invert_range (adj->lower, adj->upper, adj->value) - 1
                        : adj->value);
 
         if (value == p->value)  /* same as default */
@@ -1515,7 +1544,7 @@ parameter_set_switch (parameter *p, gpointer value)
         if (1 == sscanf ((char *) value, "%f %c", &f, &c))
           {
             if (p->invert_p)
-              f = invert_range (adj->lower, adj->upper, f);
+              f = invert_range (adj->lower, adj->upper, f) - 1;
             gtk_adjustment_set_value (adj, f);
           }
         break;
@@ -1657,7 +1686,7 @@ get_description (GList *parms)
           d[--L] = 0;
       }
 
-      return d;
+      return _(d);
     }
 }
 
@@ -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;
 }
 
@@ -1793,6 +1835,7 @@ load_configurator (const char *full_command_line, gboolean verbose_p)
   char *prog;
   char *args;
   conf_data *cd;
+  debug_p = verbose_p;
   split_command_line (full_command_line, &prog, &args);
   cd = load_configurator_1 (prog, args, verbose_p);
   free (prog);
@@ -1848,7 +1891,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);