Commit 62be2fff authored by Sven Neumann's avatar Sven Neumann Committed by Sven Neumann

small cleanup.

2002-12-01  Sven Neumann  <sven@gimp.org>

	* app/config/gimpconfig-blurbs.h: small cleanup.

	* app/config/gimpconfig-serialize.[ch]: export more functionality.

	* app/config/gimpconfig-dump.c: added some code to dump a
	commented version of the system-wide gimprc with default values.

2002-12-01  Sven Neumann  <neo@wintermute>

	* libgimp/Makefile.am (IGNORE_HFILES): ignore gimpmiscui.h.
parent acb7bac0
2002-12-01 Sven Neumann <sven@gimp.org>
* app/config/gimpconfig-blurbs.h: small cleanup.
* app/config/gimpconfig-serialize.[ch]: export more functionality.
* app/config/gimpconfig-dump.c: added some code to dump a
commented version of the system-wide gimprc with default values.
2002-12-01 Sven Neumann <sven@gimp.org> 2002-12-01 Sven Neumann <sven@gimp.org>
* app/core/core-types.h: prefix PIXELS and POINTS with GIMP * app/core/core-types.h: prefix PIXELS and POINTS with GIMP
......
...@@ -171,9 +171,7 @@ ...@@ -171,9 +171,7 @@
#define DEFAULT_UNIT_BLURB \ #define DEFAULT_UNIT_BLURB \
"Set the default unit for new images and for the File/New dialog. " \ "Set the default unit for new images and for the File/New dialog. " \
"This units will be used for coordinate display when not in dot-for-dot " \ "This units will be used for coordinate display when not in dot-for-dot " \
"mode. The default unit can be one of inches , millimeters, points or " \ "mode."
"picas or the identifier of one of the units defined in your user units " \
"database."
#define DEFAULT_XRESOLUTION_BLURB \ #define DEFAULT_XRESOLUTION_BLURB \
"Set the default horizontal resolution for new images and for the " \ "Set the default horizontal resolution for new images and for the " \
...@@ -185,9 +183,7 @@ ...@@ -185,9 +183,7 @@
#define DEFAULT_RESOLUTION_UNIT_BLURB \ #define DEFAULT_RESOLUTION_UNIT_BLURB \
"Set the units for the display of the default resolution in the " \ "Set the units for the display of the default resolution in the " \
"File/New dialog. The default resolution units can be one of inches, " \ "File/New dialog."
"millimeters, points or picas or the identifier of one of the units " \
"defined in your user unit database. The default is inches."
#define MONITOR_XRESOLUTION_BLURB \ #define MONITOR_XRESOLUTION_BLURB \
"Set the monitor's horizontal resolution, in dots per inch. If set to " \ "Set the monitor's horizontal resolution, in dots per inch. If set to " \
...@@ -226,7 +222,8 @@ ...@@ -226,7 +222,8 @@
"%h image height in pixels\n" \ "%h image height in pixels\n" \
"%H image height in real-world units\n" \ "%H image height in real-world units\n" \
"%u unit symbol\n" \ "%u unit symbol\n" \
"%U unit abbreviation\n" "%U unit abbreviation\n\n"
#define IMAGE_STATUS_FORMAT_BLURB \ #define IMAGE_STATUS_FORMAT_BLURB \
"Set the text to appear in image window status bars. See image-title-format " \ "Set the text to appear in image window status bars. See image-title-format " \
......
...@@ -23,6 +23,9 @@ ...@@ -23,6 +23,9 @@
#include "stdlib.h" #include "stdlib.h"
#include "string.h" #include "string.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <glib-object.h> #include <glib-object.h>
...@@ -32,24 +35,44 @@ ...@@ -32,24 +35,44 @@
#include "config-types.h" #include "config-types.h"
#include "gimpconfig.h" #include "gimpconfig.h"
#include "gimpconfig-params.h"
#include "gimpconfig-serialize.h" #include "gimpconfig-serialize.h"
#include "gimpconfig-types.h"
#include "gimprc.h" #include "gimprc.h"
static gint dump_system_gimprc (void);
static gchar * dump_get_comment (GParamSpec *param_spec);
int int
main (int argc, main (int argc,
char *argv[]) char *argv[])
{ {
GObject *rc; GObject *rc;
g_type_init (); g_type_init ();
if (argc > 1)
{
if (strcmp (argv[1], "--system-gimprc") == 0)
{
return dump_system_gimprc ();
}
else
{
g_printerr ("%s -- GimpConfig dump utility\n\n", argv[0]);
g_printerr ("Options:\n"
" --system-gimprc create a commented system gimprc\n");
return EXIT_FAILURE;
}
}
rc = g_object_new (GIMP_TYPE_RC, NULL); rc = g_object_new (GIMP_TYPE_RC, NULL);
g_print ("# Dump of the GIMP default configuration\n\n"); g_print ("# Dump of the GIMP default configuration\n\n");
gimp_config_serialize_properties (rc, 1, 0); gimp_config_serialize_properties (rc, 1, 0);
g_print ("\n"); g_print ("\n");
g_object_unref (rc); g_object_unref (rc);
...@@ -58,6 +81,192 @@ main (int argc, ...@@ -58,6 +81,192 @@ main (int argc,
} }
static gint
dump_system_gimprc (void)
{
GObjectClass *klass;
GParamSpec **property_specs;
GObject *rc;
GString *str;
guint n_property_specs;
guint i;
str = g_string_new
("# This is the system-wide gimprc file. Any change made in this file\n"
"# will affect all users of this system, provided that they are not\n"
"# overriding the default values in their personal gimprc file.\n"
"#\n"
"# Lines that start with a '#' are comments.\n"
"# Blank lines are ignored.\n"
"\n"
"# The variable gimp_dir is set to either the interned value\n"
"# @gimpdir@ or the environment variable GIMP_DIRECTORY. If\n"
"# the path in GIMP_DIRECTORY is relative, it is considered\n"
"# relative to your home directory.\n"
"\n"
"(prefix \"@prefix@\"\n"
"(exec_prefix \"@exec_prefix@\")\n"
"(gimp_data_dir \"@gimpdatadir@\")\n"
"(gimp_plugin_dir \"@gimpplugindir@\")\n"
"\n");
write (1, str->str, str->len);
rc = g_object_new (GIMP_TYPE_RC, NULL);
klass = G_OBJECT_GET_CLASS (rc);
property_specs = g_object_class_list_properties (klass, &n_property_specs);
for (i = 0; i < n_property_specs; i++)
{
GParamSpec *prop_spec = property_specs[i];
gchar *comment;
if (! (prop_spec->flags & GIMP_PARAM_SERIALIZE))
continue;
g_string_assign (str, "");
comment = dump_get_comment (prop_spec);
if (comment)
{
gimp_config_serialize_comment (str, comment);
g_free (comment);
g_string_append (str, "#\n");
}
g_string_append (str, "# ");
if (gimp_config_serialize_property (rc, prop_spec, str, TRUE))
{
g_string_append (str, "\n");
write (1, str->str, str->len);
}
else if (prop_spec->value_type != G_TYPE_STRING)
{
g_warning ("couldn't serialize property %s::%s of type %s",
g_type_name (G_TYPE_FROM_INSTANCE (rc)),
prop_spec->name,
g_type_name (prop_spec->value_type));
}
}
g_free (property_specs);
g_object_unref (rc);
g_string_free (str, TRUE);
return EXIT_SUCCESS;
}
static gchar *
dump_get_comment (GParamSpec *param_spec)
{
GType type;
const gchar *blurb;
const gchar *values = NULL;
blurb = g_param_spec_get_blurb (param_spec);
if (!blurb)
{
g_warning ("FIXME: Property '%s' has no blurb.", param_spec->name);
blurb = param_spec->name;
}
type = param_spec->value_type;
if (g_type_is_a (type, GIMP_TYPE_COLOR))
{
values = "The color is specified as a list of doubles (r g b a).";
}
else if (g_type_is_a (type, GIMP_TYPE_MEMSIZE))
{
values =
"The integer size can contain a suffix of 'B', 'K', 'M' or 'G' which "
"makes GIMP interpret the size as being specified in bytes, kilobytes, "
"megabytes or gigabytes. If no suffix is specified the size defaults "
"to being specified in kilobytes.";
}
else if (g_type_is_a (type, GIMP_TYPE_PATH))
{
values = "This is a colon-separated list of directories to search.";
}
else if (g_type_is_a (type, GIMP_TYPE_UNIT))
{
values =
"The unit can be one inches, millimeters, points or picas plus "
"those in your user units database.";
}
else
{
switch (G_TYPE_FUNDAMENTAL (type))
{
case G_TYPE_BOOLEAN:
values = "Possible values are yes and no.";
break;
case G_TYPE_INT:
case G_TYPE_UINT:
case G_TYPE_LONG:
case G_TYPE_ULONG:
values = "This is an integer value.";
break;
case G_TYPE_FLOAT:
case G_TYPE_DOUBLE:
values = "This is a float value.";
break;
case G_TYPE_STRING:
values = "This is a string value.";
break;
case G_TYPE_ENUM:
{
GEnumClass *enum_class;
GEnumValue *enum_value;
GString *str;
gint i;
enum_class = g_type_class_peek (type);
str = g_string_new (blurb);
g_string_append (str, " Possible values are ");
for (i = 0, enum_value = enum_class->values;
i < enum_class->n_values;
i++, enum_value++)
{
g_string_append (str, enum_value->value_nick);
switch (enum_class->n_values - i)
{
case 1:
g_string_append_c (str, '.');
break;
case 2:
g_string_append (str, " and ");
break;
default:
g_string_append (str, ", ");
break;
}
}
return g_string_free (str, FALSE);
}
break;
default:
break;
}
}
if (!values)
g_warning ("FIXME: Can't tell anything about a %s.", g_type_name (type));
return g_strdup_printf ("%s %s", blurb, values);
}
/* some dummy funcs so we can properly link this beast */ /* some dummy funcs so we can properly link this beast */
const gchar * const gchar *
......
...@@ -43,15 +43,9 @@ ...@@ -43,15 +43,9 @@
#include "gimpconfig-utils.h" #include "gimpconfig-utils.h"
static gboolean gimp_config_serialize_property (GObject *object, static void serialize_unknown_token (const gchar *key,
GParamSpec *param_spec, const gchar *value,
GString *str, gpointer data);
gboolean escaped);
static void gimp_config_serialize_comment (GString *str,
const gchar *comment);
static void serialize_unknown_token (const gchar *key,
const gchar *value,
gpointer data);
/** /**
...@@ -71,7 +65,6 @@ gimp_config_serialize_properties (GObject *object, ...@@ -71,7 +65,6 @@ gimp_config_serialize_properties (GObject *object,
guint n_property_specs; guint n_property_specs;
guint i; guint i;
GString *str; GString *str;
gboolean property_written = FALSE;
g_return_val_if_fail (G_IS_OBJECT (object), FALSE); g_return_val_if_fail (G_IS_OBJECT (object), FALSE);
...@@ -86,33 +79,19 @@ gimp_config_serialize_properties (GObject *object, ...@@ -86,33 +79,19 @@ gimp_config_serialize_properties (GObject *object,
for (i = 0; i < n_property_specs; i++) for (i = 0; i < n_property_specs; i++)
{ {
GParamSpec *prop_spec; GParamSpec *prop_spec = property_specs[i];
const gchar *blurb;
prop_spec = property_specs[i];
if (! (prop_spec->flags & GIMP_PARAM_SERIALIZE)) if (! (prop_spec->flags & GIMP_PARAM_SERIALIZE))
continue; continue;
if (property_written)
g_string_assign (str, "\n");
else
g_string_assign (str, "");
if ((blurb = g_param_spec_get_blurb (prop_spec)) != NULL)
gimp_config_serialize_comment (str, blurb);
gimp_config_string_indent (str, indent_level); gimp_config_string_indent (str, indent_level);
g_string_append_printf (str, "(%s ", prop_spec->name);
if (gimp_config_serialize_property (object, prop_spec, str, TRUE)) if (gimp_config_serialize_property (object, prop_spec, str, TRUE))
{ {
g_string_append (str, ")\n");
property_written = TRUE;
if (write (fd, str->str, str->len) == -1) if (write (fd, str->str, str->len) == -1)
return FALSE; return FALSE;
g_string_assign (str, "\n");
} }
else if (prop_spec->value_type != G_TYPE_STRING) else if (prop_spec->value_type != G_TYPE_STRING)
{ {
...@@ -120,6 +99,8 @@ gimp_config_serialize_properties (GObject *object, ...@@ -120,6 +99,8 @@ gimp_config_serialize_properties (GObject *object,
g_type_name (G_TYPE_FROM_INSTANCE (object)), g_type_name (G_TYPE_FROM_INSTANCE (object)),
prop_spec->name, prop_spec->name,
g_type_name (prop_spec->value_type)); g_type_name (prop_spec->value_type));
g_string_assign (str, "");
} }
} }
...@@ -168,7 +149,6 @@ gimp_config_serialize_changed_properties (GObject *new, ...@@ -168,7 +149,6 @@ gimp_config_serialize_changed_properties (GObject *new,
for (list = diff; list; list = g_list_next (list)) for (list = diff; list; list = g_list_next (list))
{ {
GParamSpec *prop_spec; GParamSpec *prop_spec;
const gchar *blurb;
GValue new_value = { 0, }; GValue new_value = { 0, };
prop_spec = (GParamSpec *) list->data; prop_spec = (GParamSpec *) list->data;
...@@ -182,9 +162,6 @@ gimp_config_serialize_changed_properties (GObject *new, ...@@ -182,9 +162,6 @@ gimp_config_serialize_changed_properties (GObject *new,
else else
g_string_assign (str, ""); g_string_assign (str, "");
if ((blurb = g_param_spec_get_blurb (prop_spec)) != NULL)
gimp_config_serialize_comment (str, blurb);
gimp_config_string_indent (str, indent_level); gimp_config_string_indent (str, indent_level);
g_string_append_printf (str, "(%s ", prop_spec->name); g_string_append_printf (str, "(%s ", prop_spec->name);
...@@ -214,6 +191,75 @@ gimp_config_serialize_changed_properties (GObject *new, ...@@ -214,6 +191,75 @@ gimp_config_serialize_changed_properties (GObject *new,
return TRUE; return TRUE;
} }
gboolean
gimp_config_serialize_property (GObject *object,
GParamSpec *param_spec,
GString *str,
gboolean escaped)
{
GTypeClass *owner_class;
GimpConfigInterface *config_iface;
GimpConfigInterface *parent_iface;
GValue value = { 0, };
if (! (param_spec->flags & GIMP_PARAM_SERIALIZE))
return FALSE;
g_string_append_printf (str, "(%s ", param_spec->name);
g_value_init (&value, param_spec->value_type);
g_object_get_property (object, param_spec->name, &value);
owner_class = g_type_class_peek (param_spec->owner_type);
config_iface = g_type_interface_peek (owner_class,
GIMP_TYPE_CONFIG_INTERFACE);
/* We must call deserialize_property() *only* if the *exact* class
* which implements it is param_spec->owner_type's class.
*
* Therefore, we ask param_spec->owner_type's immediate parent class
* for it's GimpConfigInterface and check if we get a different pointer.
*
* (if the pointers are the same, param_spec->owner_type's
* GimpConfigInterface is inherited from one of it's parent classes
* and thus not able to handle param_spec->owner_type's properties).
*/
if (config_iface)
{
GTypeClass *owner_parent_class;
owner_parent_class = g_type_class_peek_parent (owner_class),
parent_iface = g_type_interface_peek (owner_parent_class,
GIMP_TYPE_CONFIG_INTERFACE);
}
if (config_iface &&
config_iface != parent_iface && /* see comment above */
config_iface->serialize_property)
{
if (! config_iface->serialize_property (object,
param_spec->param_id,
(const GValue *) &value,
param_spec,
str))
return FALSE;
}
else
{
if (! gimp_config_serialize_value (&value, str, escaped))
return FALSE;
}
g_value_unset (&value);
g_string_append (str, ")\n");
return TRUE;
}
/** /**
* gimp_config_serialize_value: * gimp_config_serialize_value:
* @value: a #GValue. * @value: a #GValue.
...@@ -329,7 +375,8 @@ gimp_config_serialize_value (const GValue *value, ...@@ -329,7 +375,8 @@ gimp_config_serialize_value (const GValue *value,
{ {
g_string_append (str, " "); g_string_append (str, " ");
if (! gimp_config_serialize_value (g_value_array_get_nth (array, i), if (! gimp_config_serialize_value (g_value_array_get_nth (array,
i),
str, escaped)) str, escaped))
return FALSE; return FALSE;
} }
...@@ -382,68 +429,7 @@ gimp_config_serialize_unknown_tokens (GObject *object, ...@@ -382,68 +429,7 @@ gimp_config_serialize_unknown_tokens (GObject *object,
return (write (fd, str->str, str->len) != -1); return (write (fd, str->str, str->len) != -1);
} }
static gboolean void
gimp_config_serialize_property (GObject *object,
GParamSpec *param_spec,
GString *str,
gboolean escaped)
{
GTypeClass *owner_class;
GimpConfigInterface *gimp_config_iface;
GimpConfigInterface *parent_iface;
GValue value = { 0, };
gboolean retval;
g_value_init (&value, param_spec->value_type);
g_object_get_property (object, param_spec->name, &value);
owner_class = g_type_class_peek (param_spec->owner_type);
gimp_config_iface = g_type_interface_peek (owner_class,
GIMP_TYPE_CONFIG_INTERFACE);
/* We must call deserialize_property() *only* if the *exact* class
* which implements it is param_spec->owner_type's class.
*
* Therefore, we ask param_spec->owner_type's immediate parent class
* for it's GimpConfigInterface and check if we get a different pointer.
*
* (if the pointers are the same, param_spec->owner_type's
* GimpConfigInterface is inherited from one of it's parent classes
* and thus not able to handle param_spec->owner_type's properties).
*/
if (gimp_config_iface)
{
GTypeClass *owner_parent_class;
owner_parent_class = g_type_class_peek_parent (owner_class),
parent_iface = g_type_interface_peek (owner_parent_class,
GIMP_TYPE_CONFIG_INTERFACE);
}
if (gimp_config_iface &&
gimp_config_iface != parent_iface && /* see comment above */
gimp_config_iface->serialize_property &&
gimp_config_iface->serialize_property (object,
param_spec->param_id,
(const GValue *) &value,
param_spec,
str))
{
retval = TRUE;
}
else
{
retval = gimp_config_serialize_value (&value, str, escaped);
}
g_value_unset (&value);
return retval;
}
static void
gimp_config_serialize_comment (GString *str, gimp_config_serialize_comment (GString *str,
const gchar *comment) const gchar *comment)
{ {
...@@ -474,8 +460,6 @@ gimp_config_serialize_comment (GString *str, ...@@ -474,8 +460,6 @@ gimp_config_serialize_comment (GString *str,
comment += i; comment += i;
len -= i; len -= i;
} }
g_string_append_printf (str, "#\n");
} }
static void static void
......
...@@ -33,8 +33,15 @@ gboolean gimp_config_serialize_changed_properties (GObject *new, ...@@ -33,8 +33,15 @@ gboolean gimp_config_serialize_changed_properties (GObject *new,
gboolean gimp_config_serialize_unknown_tokens (GObject *object, gboolean gimp_config_serialize_unknown_tokens (GObject *object,
gint fd, gint fd,
gint indent_level); gint indent_level);
gboolean gimp_config_serialize_property (GObject *object,
GParamSpec *param_spec,
GString *str,
gboolean escaped);
gboolean gimp_config_serialize_value (const GValue *value, gboolean gimp_config_serialize_value (const GValue *value,
GString *str, GString *str,
gboolean escaped); gboolean escaped);
void gimp_config_serialize_comment (GString *str,
const gchar *comment);
#endif /* __GIMP_CONFIG_SERIALIZE_H__ */ #endif /* __GIMP_CONFIG_SERIALIZE_H__ */
...@@ -43,15 +43,9 @@ ...@@ -43,15 +43,9 @@
#include "gimpconfig-utils.h" #include "gimpconfig-utils.h"
static gboolean gimp_config_serialize_property (GObject *object, static void serialize_unknown_token (const gchar *key,
GParamSpec *param_spec, const gchar *value,
GString *str, gpointer data);
gboolean escaped);
static void gimp_config_serialize_comment (GString *str,
const gchar *comment);
static void serialize_unknown_token (const gchar *key,
const gchar *value,
gpointer data);
/** /**
...@@ -71,7 +65,6 @@ gimp_config_serialize_properties (GObject *object, ...@@ -71,7 +65,6 @@ gimp_config_serialize_properties (GObject *object,
guint n_property_specs; guint n_property_specs;
guint i; guint i;
GString *str; GString *str;
gboolean property_written = FALSE;
g_return_val_if_fail (G_IS_OBJECT (object), FALSE); g_return_val_if_fail (G_IS_OBJECT (object), FALSE);