/* 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
#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;
}
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;
}
}
#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));
}
{
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);
}
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,
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);
}
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,
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);
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);
}
{
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),
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 */
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;
d[--L] = 0;
}
- return d;
+ return _(d);
}
}
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;
}
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);
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);