X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=driver%2Fdemo-Gtk-conf.c;h=396803755dee25987a778d125ecf71a98f858e57;hp=b8bb1ee680190fade231ec597f88ef5f5809f00c;hb=96a411663168b0ba5432b407a83be55f3df0c802;hpb=8eb2873d7054e705c4e83f22d18c40946a9e2529 diff --git a/driver/demo-Gtk-conf.c b/driver/demo-Gtk-conf.c index b8bb1ee6..39680375 100644 --- a/driver/demo-Gtk-conf.c +++ b/driver/demo-Gtk-conf.c @@ -1,5 +1,5 @@ /* demo-Gtk-conf.c --- implements the dynamic configuration dialogs. - * xscreensaver, Copyright (c) 2001 Jamie Zawinski + * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski * * 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 + #include #ifdef HAVE_UNISTD_H @@ -26,15 +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" + extern const char *blurb (void); +const char *hack_configuration_path = HACK_CONFIGURATION_PATH; + static gboolean debug_p = FALSE; @@ -57,30 +91,30 @@ typedef struct { parameter_type type; - char *id; /* widget name */ - char *label; /* heading label, or null */ + xmlChar *id; /* widget name */ + xmlChar *label; /* heading label, or null */ /* command, fake, description, fakepreview, string, file */ - char *string; /* file name, description, whatever. */ + xmlChar *string; /* file name, description, whatever. */ /* slider, spinbutton */ - char *low_label; /* label for the left side */ - char *high_label; /* label for the right side */ + xmlChar *low_label; /* label for the left side */ + xmlChar *high_label; /* label for the right side */ float low; /* minimum value */ float high; /* maximum value */ float value; /* default value */ gboolean integer_p; /* whether the range is integral, or real */ - char *arg; /* command-line option to set (substitute "%") */ + xmlChar *arg; /* command-line option to set (substitute "%") */ gboolean invert_p; /* whether to flip the value and pretend the range goes from hi-low instead of low-hi. */ /* boolean, select-option */ - char *arg_set; /* command-line option to set for "yes", or null */ - char *arg_unset; /* command-line option to set for "no", or null */ - char *test; /* #### no idea - enablement? */ + xmlChar *arg_set; /* command-line option to set for "yes", or null */ + xmlChar *arg_unset; /* command-line option to set for "no", or null */ + xmlChar *test; /* #### no idea - enablement? */ /* select */ @@ -212,9 +246,9 @@ describe_parameter (FILE *out, parameter *p) `floatp' is set to TRUE. Otherwise, it is unchanged. */ static float -xml_get_float (xmlNodePtr node, const char *name, gboolean *floatpP) +xml_get_float (xmlNodePtr node, const xmlChar *name, gboolean *floatpP) { - const char *s = xmlGetProp (node, name); + const char *s = (char *) xmlGetProp (node, name); float f; char c; if (!s || 1 != sscanf (s, "%f %c", &f, &c)) @@ -228,7 +262,7 @@ xml_get_float (xmlNodePtr node, const char *name, gboolean *floatpP) static void sanity_check_parameter (const char *filename, - const char *node_name, + const xmlChar *node_name, parameter *p); /* Allocates and returns a new `parameter' object based on the @@ -239,7 +273,7 @@ static parameter * make_parameter (const char *filename, xmlNodePtr node) { parameter *p; - const char *name = node->name; + const char *name = (char *) node->name; const char *convert; gboolean floatp = FALSE; @@ -270,7 +304,7 @@ make_parameter (const char *filename, xmlNodePtr node) if (p->type == SPINBUTTON) { - const char *type = xmlGetProp (node, "type"); + const char *type = (char *) xmlGetProp (node, (xmlChar *) "type"); if (!type || !strcmp (type, "spinbutton")) p->type = SPINBUTTON; else if (!strcmp (type, "slider")) p->type = SLIDER; else @@ -284,26 +318,27 @@ 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 = (xmlChar *) + strdup ((char *) node->xmlChildrenNode->content); } - p->id = xmlGetProp (node, "id"); - p->label = xmlGetProp (node, "_label"); - p->low_label = xmlGetProp (node, "_low-label"); - p->high_label = xmlGetProp (node, "_high-label"); - p->low = xml_get_float (node, "low", &floatp); - p->high = xml_get_float (node, "high", &floatp); - p->value = xml_get_float (node, "default", &floatp); + p->id = xmlGetProp (node, (xmlChar *) "id"); + p->label = xmlGetProp (node, (xmlChar *) "_label"); + p->low_label = xmlGetProp (node, (xmlChar *) "_low-label"); + p->high_label = xmlGetProp (node, (xmlChar *) "_high-label"); + p->low = xml_get_float (node, (xmlChar *) "low", &floatp); + p->high = xml_get_float (node, (xmlChar *) "high", &floatp); + p->value = xml_get_float (node, (xmlChar *) "default", &floatp); p->integer_p = !floatp; - convert = xmlGetProp (node, "convert"); + convert = (char *) xmlGetProp (node, (xmlChar *) "convert"); p->invert_p = (convert && !strcmp (convert, "invert")); - p->arg = xmlGetProp (node, "arg"); - p->arg_set = xmlGetProp (node, "arg-set"); - p->arg_unset = xmlGetProp (node, "arg-unset"); - p->test = xmlGetProp (node, "test"); + p->arg = xmlGetProp (node, (xmlChar *) "arg"); + p->arg_set = xmlGetProp (node, (xmlChar *) "arg-set"); + p->arg_unset = xmlGetProp (node, (xmlChar *) "arg-unset"); + p->test = xmlGetProp (node, (xmlChar *) "test"); /* Check for missing decimal point */ if (debug_p && @@ -318,7 +353,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) @@ -326,7 +361,7 @@ make_parameter (const char *filename, xmlNodePtr node) } } - sanity_check_parameter (filename, name, p); + sanity_check_parameter (filename, (const xmlChar *) name, p); return p; } @@ -349,7 +384,7 @@ make_select_option (const char *filename, xmlNodePtr node) blurb(), filename, node->name, (int)node->type); return 0; } - else if (strcmp (node->name, "option")) + else if (strcmp ((char *) node->name, "option")) { if (debug_p) fprintf (stderr, @@ -363,12 +398,12 @@ make_select_option (const char *filename, xmlNodePtr node) char *enable, *e; s->type = SELECT_OPTION; - s->id = xmlGetProp (node, "id"); - s->label = xmlGetProp (node, "_label"); - s->arg_set = xmlGetProp (node, "arg-set"); - s->arg_unset = xmlGetProp (node, "arg-unset"); - s->test = xmlGetProp (node, "test"); - enable = xmlGetProp (node, "enable"); + s->id = xmlGetProp (node, (xmlChar *) "id"); + s->label = xmlGetProp (node, (xmlChar *) "_label"); + s->arg_set = xmlGetProp (node, (xmlChar *) "arg-set"); + s->arg_unset = xmlGetProp (node, (xmlChar *) "arg-unset"); + s->test = xmlGetProp (node, (xmlChar *) "test"); + enable = (char*)xmlGetProp (node, (xmlChar *) "enable"); if (enable) { @@ -392,7 +427,7 @@ make_select_option (const char *filename, xmlNodePtr node) when they should have typed "arg=", etc. */ static void -sanity_check_parameter (const char *filename, const char *node_name, +sanity_check_parameter (const char *filename, const xmlChar *node_name, parameter *p) { struct { @@ -496,10 +531,10 @@ sanity_check_parameter (const char *filename, const char *node_name, # define WARN(STR) \ fprintf (stderr, "%s: %s: " STR " in <%s%s id=\"%s\">\n", \ blurb(), filename, node_name, \ - (!strcmp(node_name, "number") \ + (!strcmp((char *) node_name, "number") \ ? (p->type == SPINBUTTON ? " type=spinbutton" : " type=slider")\ : ""), \ - (p->id ? p->id : "")) + (p->id ? (char *) p->id : "")) # define CHECK(SLOT,NAME) \ if (p->SLOT && !allowed.SLOT) \ WARN ("\"" NAME "\" is not a valid option"); \ @@ -534,7 +569,7 @@ make_parameters_1 (const char *filename, xmlNodePtr node, for (; node; node = node->next) { - const char *name = node->name; + const char *name = (char *) node->name; if (!strcmp (name, "hgroup") || !strcmp (name, "vgroup")) { @@ -553,7 +588,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); } @@ -582,8 +617,8 @@ make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent) for (; node; node = node->next) { if (node->type == XML_ELEMENT_NODE && - !strcmp (node->name, "screensaver")) - return make_parameters_1 (filename, node->childs, parent, &row); + !strcmp ((char *) node->name, "screensaver")) + return make_parameters_1 (filename, node->xmlChildrenNode, parent, &row); } return 0; } @@ -635,17 +670,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)); } @@ -659,7 +694,7 @@ static void make_parameter_widget (const char *filename, parameter *p, GtkWidget *parent, int *row) { - const char *label = p->label; + const char *label = (char *) p->label; if (p->widget) return; switch (p->type) @@ -668,7 +703,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); @@ -681,7 +716,7 @@ make_parameter_widget (const char *filename, p->widget = gtk_entry_new (); if (p->string) - gtk_entry_set_text (GTK_ENTRY (p->widget), p->string); + gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) p->string); if (row) gtk_table_attach (GTK_TABLE (parent), p->widget, 1, 3, *row, *row + 1, @@ -692,9 +727,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; @@ -708,7 +743,7 @@ make_parameter_widget (const char *filename, gtk_widget_show (L); if (p->string) - gtk_entry_set_text (GTK_ENTRY (entry), p->string); + gtk_entry_set_text (GTK_ENTRY (entry), (char *) p->string); if (row) { @@ -738,7 +773,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); @@ -794,7 +829,7 @@ make_parameter_widget (const char *filename, if (p->low_label) { - GtkWidget *w = gtk_label_new (p->low_label); + GtkWidget *w = gtk_label_new (_((char *) 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); @@ -806,7 +841,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, @@ -819,7 +854,7 @@ make_parameter_widget (const char *filename, if (p->high_label) { - GtkWidget *w = gtk_label_new (p->high_label); + GtkWidget *w = gtk_label_new (_((char *) 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); @@ -843,7 +878,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); @@ -872,7 +907,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, @@ -889,7 +924,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); @@ -901,7 +936,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 (_((char *) s->label)); gtk_widget_show (i); gtk_menu_append (GTK_MENU (menu), i); } @@ -928,7 +963,7 @@ make_parameter_widget (const char *filename, if (p->widget) { - gtk_widget_set_name (p->widget, p->id); + gtk_widget_set_name (p->widget, (char *) p->id); gtk_widget_show (p->widget); if (row) (*row)++; @@ -958,7 +993,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); @@ -984,9 +1019,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), @@ -1090,7 +1125,7 @@ de_stringify (char *s) static char * format_switch (parameter *p, const char *value) { - char *fmt = p->arg; + char *fmt = (char *) p->arg; char *v2; char *result, *s; if (!fmt || !value) return 0; @@ -1122,7 +1157,7 @@ parameter_to_switch (parameter *p) { case COMMAND: if (p->arg) - return strdup (p->arg); + return strdup ((char *) p->arg); else return 0; break; @@ -1133,7 +1168,7 @@ parameter_to_switch (parameter *p) const char *s = gtk_entry_get_text (GTK_ENTRY (p->widget)); char *v; if (!strcmp ((s ? s : ""), - (p->string ? p->string : ""))) + (p->string ? (char *) p->string : ""))) v = 0; /* same as default */ else v = format_switch (p, s); @@ -1152,7 +1187,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 */ @@ -1179,8 +1214,8 @@ parameter_to_switch (parameter *p) { GtkToggleButton *b = GTK_TOGGLE_BUTTON (p->widget); const char *s = (gtk_toggle_button_get_active (b) - ? p->arg_set - : p->arg_unset); + ? (char *) p->arg_set + : (char *) p->arg_unset); if (s) return strdup (s); else @@ -1199,7 +1234,7 @@ parameter_to_switch (parameter *p) const char *s; if (!o) abort(); if (o->type != SELECT_OPTION) abort(); - s = o->arg_set; + s = (char *) o->arg_set; if (s) return strdup (s); else @@ -1398,8 +1433,8 @@ parse_command_line_into_parameters_1 (const char *filename, { GList *p; parameter *match = 0; - int which = -1; - int index = 0; + gint which = -1; + gint index = 0; for (p = parms; p; p = p->next) { @@ -1419,7 +1454,7 @@ parse_command_line_into_parameters_1 (const char *filename, } else if (pp->arg) { - if (compare_opts (option, value, pp->arg)) + if (compare_opts (option, value, (char *) pp->arg)) { which = -1; match = pp; @@ -1427,7 +1462,7 @@ parse_command_line_into_parameters_1 (const char *filename, } else if (pp->arg_set) { - if (compare_opts (option, value, pp->arg_set)) + if (compare_opts (option, value, (char *) pp->arg_set)) { which = 1; match = pp; @@ -1435,7 +1470,7 @@ parse_command_line_into_parameters_1 (const char *filename, } else if (pp->arg_unset) { - if (compare_opts (option, value, pp->arg_unset)) + if (compare_opts (option, value, (char *) pp->arg_unset)) { which = 0; match = pp; @@ -1467,11 +1502,11 @@ parse_command_line_into_parameters_1 (const char *filename, break; case BOOLEAN: if (which != 0 && which != 1) abort(); - parameter_set_switch (match, (gpointer) which); + parameter_set_switch (match, GINT_TO_POINTER(which)); break; case SELECT_OPTION: if (which != 1) abort(); - parameter_set_switch (parent, (gpointer) index); + parameter_set_switch (parent, GINT_TO_POINTER(index)); break; default: break; @@ -1510,7 +1545,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; @@ -1518,13 +1553,13 @@ parameter_set_switch (parameter *p, gpointer value) case BOOLEAN: { GtkToggleButton *b = GTK_TOGGLE_BUTTON (p->widget); - gtk_toggle_button_set_active (b, (int) value); + gtk_toggle_button_set_active (b, GPOINTER_TO_INT(value)); break; } case SELECT: { gtk_option_menu_set_history (GTK_OPTION_MENU (p->widget), - (int) value); + GPOINTER_TO_INT(value)); break; } default: @@ -1546,7 +1581,7 @@ restore_defaults (const char *progname, GList *parms) case FILENAME: { gtk_entry_set_text (GTK_ENTRY (p->widget), - (p->string ? p->string : "")); + (p->string ? (char *) p->string : "")); break; } case SLIDER: @@ -1624,7 +1659,7 @@ get_description (GList *parms) return 0; else { - char *d = strdup (doc->string); + char *d = strdup ((char *) doc->string); char *s; for (s = d; *s; s++) if (s[0] == '\n') @@ -1652,7 +1687,7 @@ get_description (GList *parms) d[--L] = 0; } - return d; + return _(d); } } @@ -1664,12 +1699,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] != '/') @@ -1698,7 +1738,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) @@ -1716,7 +1761,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); @@ -1737,12 +1782,15 @@ load_configurator_1 (const char *program, const char *arguments, p = calloc (1, sizeof(*p)); p->type = COMMAND; - p->arg = strdup (arguments); + p->arg = (xmlChar *) strdup (arguments); data->parameters = g_list_append (0, (gpointer) p); } data->progname = strdup (program); + + DONE: + free (file); return data; } @@ -1788,6 +1836,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); @@ -1843,7 +1892,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);